Reputation: 6258
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
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
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
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
Reputation: 455
android:noHistory="true"
like
android:launchMode="singleInstance"
will stop onActivityResult from receive result.
Upvotes: 9
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
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
Reputation: 306
I had same problem and solved it: Just remove
android:launchMode="singleInstance"
Upvotes: 28
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
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