Custom actions using implicit intents between applications

android, android-intent, android-manifest

Solution

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 a `data` 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 that

Normally the type is inferred from the data itself. By setting this attribute, you disable that evaluation and force an explicit type.

But that's not the case. When I put in a `file://` URI which ended in `.txt`, Android assigned it a null `mime-type`, so it wouldn't match any `intent-filter`, even one with a `data` and `*/*` `mime-type`. I needed to manually set the intent's type using `setDataAndType()`.

In short: You must manually define an intent's `mime-type` when using a custom action with data.

Problem

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.

Original source

Related problems