アプリの 1 つにインテント フィルターがあるアクティビティがありますが、まだプライベートとしてマークされています。つまり、次のようになりandroid:exported=false
ます。
<activity android:exported="false" android:name=".facebook.PostToFacebookActivity" android:icon="@drawable/facebook_icon" android:label="@string/facebook_built_in">
<intent-filter>
<action android:name="android.intent.action.SEND" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="text/plain" />
</intent-filter>
</activity>
(アクティビティは内部使用のみです。私のアプリの一部では、テキストをどこかに送信できるすべてのアクティビティのリストからユーザーが選択できるようになっています。これにより、いくつかのアプリ内部オプションを全体的なリストに簡単に追加できます。)
ただし、別のqueryIntentActivites()
アプリから使用すると、「プライベート」アクティビティが返されます。
// Returned list includes the above activity, even though it's declared private.
List<ResolveInfo> infoList = pm.queryIntentActivities(
myIntent,
PackageManager.MATCH_DEFAULT_ONLY |
PackageManager.GET_INTENT_FILTERS
);
他のアプリからアクティビティを開始しようとすると、セキュリティ例外が発生するため、基本的なセキュリティは正常に機能しているようです。しかし、Intent のアクティビティを要求すると、開始を許可されていないアクティビティを含むリストが表示されるのは奇妙に思えます。
queryIntentActivities()
アクティビティがエクスポートしないように設定されていると、結果にも表示されないと思っていました。とにかく、それは私が望む動作です。「非公開のアクティビティを表示しない」というフラグや、開始を許可されていないアクティビティを除外するために結果をフィルタリングする簡単な方法はありますか?