7

アプリの 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()アクティビティがエクスポートしないように設定されていると、結果にも表示されないと思っていました。とにかく、それは私が望む動作です。「非公開のアクティビティを表示しない」というフラグや、開始を許可されていないアクティビティを除外するために結果をフィルタリングする簡単な方法はありますか?

4

1 に答える 1

10

アクティビティがエクスポートしないように設定されている場合、queryIntentActivities()の結果にも表示されないと思いました。

それはあまりにも論理的です:-)

「私的な活動を見せないでください」と言うために使用できる旗はありますか

確かに文書化されているものはありません。

または、結果をフィルタリングして、開始が許可されていないアクティビティを取り除く簡単な方法はありますか?

を指定するとResolveInfoactivityInfo.exported booleanエクスポートされていないアクティビティの場合はfalseになります。結果をループして、queryIntentActivities()エクスポートされていない結果を取り除くことができます。

于 2012-07-10T11:00:19.003 に答える