thomaus
thomaus

Reputation: 6258

onActivityResult never called

So far, I used the startActivity function with success and now that I need to use the startActivityResult, I have a problem.

When using this function, the activity I expect to be launched is launched correctly but it seems like the onActivityResult function is never called.

Here is my code in the FriendPicker activity, to lauch the MoodPicker activity:

Intent intent = new Intent(FriendPicker.this, MoodPicker.class);
startActivityForResult(intent, 2);

And here is my code in the MoodPicker activity:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent intent)
{                   
    super.onActivityResult(requestCode, resultCode, intent);

    Log.i("in OnActivityResult", "Activity Result");                        

    switch (requestCode)
    {
        case 2:             
            Log.i("in OnActivityResult", "Activity Resut 2");                

            break;
    }
}

and nothing in my logfile is written (I of course, checked that my log file was working properly and double check with a text view output).

Is there something I forgot to declare in the Manifest file?

Thanks in advance.

Upvotes: 19

Views: 28939

Answers (10)

f4z3k4s
f4z3k4s

Reputation: 1241

In case you're wondering about this in react-native in a native module:

in your MainActivity:

...
private ReactInstanceManager mReactInstanceManager;
...
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    mReactInstanceManager.onActivityResult(requestCode, resultCode, data);
}

in your Module:

public class MyModule extends ReactContextBaseJavaModule implements ActivityEventListener {
    static final int REQUEST_VIDEO_CAPTURE = 1;

    final ReactApplicationContext reactContext;
    Promise promise;

    public GeneralIntentModule(ReactApplicationContext reactContext) {
        super(reactContext);
        this.reactContext = reactContext;
        this.reactContext.addActivityEventListener(this);
    }

    @Override
    public String getName() {
        return "MyModule ";
    }

    @ReactMethod
    public void captureVideo(Promise promise) {
        this.promise = promise;
        Intent takeVideoIntent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
        if (takeVideoIntent.resolveActivity(this.reactContext.getPackageManager()) != null) {
            this.reactContext.startActivityForResult(takeVideoIntent, REQUEST_VIDEO_CAPTURE, null);
        }
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        this.promise.resolve(data.getDataString());
    }
}

Upvotes: 0

Shachi
Shachi

Reputation: 1888

My silly mistake. Might help someone.

I kept onActivityResult(...) in another class. It has to be as a method in the class where the startActivityForResult() is called.

Upvotes: 0

msimons
msimons

Reputation: 505

The mistake that I had made was that after creating my Intent I was calling startActivity() instead of startActivityForResult()

Sometimes the simple ones kill you :)

Upvotes: 0

Nick Jian
Nick Jian

Reputation: 455

android:noHistory="true" 

like

android:launchMode="singleInstance"

will stop onActivityResult from receive result.

Upvotes: 9

Xavi Gil
Xavi Gil

Reputation: 11568

In my case, I didn't realize I was calling startActivityForResult from an activity that had the android:noHistory attribute set to true in the manifest. Therefore, the onActivityResult was never called as there was no activity instance anymore.

Upvotes: 23

insomniac
insomniac

Reputation: 379

There is bug in android API. In startActivityForResult(intent, requestCode); This funktion does work as long as requestCode = 0. However, if you change the request code to anything other than zero, the ApiDemos will fail (and OnActivityResult won't be called). Found here:

[EDIT: Link removed as google group overrun with spam]

Upvotes: 6

ranjeet wagh
ranjeet wagh

Reputation: 306

I had same problem and solved it: Just remove

android:launchMode="singleInstance"

Upvotes: 28

Jorgesys
Jorgesys

Reputation: 126455

FriendPicker activity

Intent intent = new Intent(FriendPicker.this, MoodPicker.class);
startActivityForResult(intent, 2);


@Override
protected void onActivityResult(int requestCode, int resultCode, Intent intent)
{                   
    super.onActivityResult(requestCode, resultCode, intent);

    Log.i("in OnActivityResult", "Activity Result");                        

    switch (requestCode)
    {
        case 2:             
             if (resultCode == Activity.RESULT_OK) {     //optional   
            Log.i("in OnActivityResult", "Activity Resut 2");                
              }
            break;
    }
}

MoodPicker class

Intent intent = new Intent(MoodPicker.this, FriendPicker.class);
        setResult(Activity.RESULT_OK, intent);
finish();

I had the same problem using onActivityResult(); cause i didn´t understand how this will be correctly applied, here you can find a good explanation how to use onActivityResult onActivityResult doesn't work?

Upvotes: 3

eyespyus
eyespyus

Reputation: 1576

If I am reading this right, all the code referenced needs to be in "FriendPicker". In "MoodPicker" you need code like this that sets the result and ends itself:

this.setResult(SUCCESS_RETURN_CODE, i);
this.finish();

Let me know if this helps...

Upvotes: 6

Kevin Gaudin
Kevin Gaudin

Reputation: 9945

Did you add the setResult() call in your MoodPicker class ?

Upvotes: 10

Related Questions