I have been trying to get two activities in two separate applications to communicate using a custom action and an implicit intent.
The first application (server), has the following manifest:
<application android:icon="@drawable/ic_launcher"
android:label="@string/app_name" android:theme="@style/AppTheme">
<activity android:name="edu.example.sharing.manager.SecureFileShare"
android:label="@string/title_activity_secure_file_share" android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<intent-filter>
<action android:name="edu.example.sharing.action.STORE" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="*/*" />
</intent-filter>
</activity>
</application>
The second application creates an intent as follows:
File f = new File(s);
Uri fileUri = Uri.fromFile(f);
Intent intent = new Intent();
intent.setData(fileUri);
intent.setAction("edu.example.sharing.action.STORE");
startActivityForResult(intent, STORE_REQUEST);
Its manifest is normal. When I try to send the intent in the client application, however, I get an activity not found exception:
FATAL EXCEPTION: main
android.content.ActivityNotFoundException: No Activity found to handle Intent {act=edu.example.sharing.action.STORE dat=file:///storage/sdcard0/Download/Alarcon12-Rigoberto.pdf }
at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:1545)
at android.app.Instrumentation.execStartActivity(Instrumentation.java:1416)
at android.app.Activity.startActivityForResult(Activity.java:3351)
at android.app.Activity.startActivityForResult(Activity.java:3312)
What's causing Android to not recognize the declared activity in the second application? Thanks.
Firstly You can specify only which application to go to; you cant specify which avtivity to go to; I've already answered how to navigate to another app here; after that your control goes to the other app; you have to handle it there
After much looking, here's what I found:
When you use a built-in action type and attach a data field or when you use a custom action type with no data field, an
intent-filter
without adata
element is ok.However, when you define a custom action and include a data field, you must manually set the
mime-type
for the URI attached. The Android documentation claims thatBut that's not the case. When I put in a
file://
URI which ended in.txt
, Android assigned it a nullmime-type
, so it wouldn't match anyintent-filter
, even one with adata
and*/*
mime-type
. I needed to manually set the intent's type usingsetDataAndType()
.In short: You must manually define an intent's
mime-type
when using a custom action with data.