Custom actions using implicit intents between appl

2019-06-17 03:56发布

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.

2条回答
干净又极端
2楼-- · 2019-06-17 04:31

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

查看更多
你好瞎i
3楼-- · 2019-06-17 04:41

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.

查看更多
登录 后发表回答