2016-05-28 10 views
3

私は、ユーザーが特定の意図を送信する必要があるアプリケーションを選択させようとしています。候補者のリストを取得するには、という要件を持つ受諾アクティビティを定義するアプリケーションを除いて、queryIntentActivities()がほとんど機能します。実際には開始できません。だから、私はこれらの方法のいずれかでそれらをフィルタリングできますか?許可の必要条件を持つアクティビティをフィルタする

  • PackageManagerが私のためにそれらを除外してもらいます。
  • ResolveInfoから、アクティビティ(またはその親アプリケーション)にアクセス許可が必要かどうかを確認して、checkSelfPermission()で確認できます。
  • アクティビティピッカー(Android 4.1以降にフィルタリングする)を起動して、何とか選択したアクティビティを取得します。
+0

を。許可で保護されている ' 'でエクスポートされた活動を決してしないでください。 'PackageManager'はあなたのためにそれらをフィルタリングしません - 私はかつてそれがすべきだと主張し、私はGoogleエンジニアによって撃墜されました。 'checkCallingOrSelfPermission()'は正しい答えではありませんが、2番目の方法が有効です。 'checkSelfPermission()'を使ってください。呼び出し元の権限は、保護されたアクティビティを呼び出すのに役立ちません。 – CommonsWare

+0

@CommonsWare特に、これらの盗難されたアプリケーションはGoogleのものです。http://stackoverflow.com/q/15979794/675674を参照してください。ところで、この質問は、アクティビティピッカーが許可を必要とするアプリケーションを表示しないので、私の妥協オプションはピッカーを開始して何らかの形でそれが解決するアクティビティを得ることであると言います。また、 'checkSelfPermission()'を指摘してくれてありがとう、私は質問を編集します。 – lapis

+0

"その質問では、アクティビティピッカーは許可を必要とするアプリケーションを表示しないと言っています。 - そのような場合は、比較的最近の変更です。 – CommonsWare

答えて

0

APIレベル22を使用すると、システムアクティビティチューを使用し、放送で選択されたアクティビティを受け取ることができますcreateChooser()のバージョンがあります。

は、古いバージョンでは以下の方法が動作します。これらのアプリケーションのバグである

List<ResolveInfo> candidates = pm.queryIntentActivities(intent, 0); 
for (int i = candidates.size() - 1; i >= 0; --i) { 
    ResolveInfo resolveInfo = candidates.get(i); 
    String permission = resolveInfo.activityInfo.permission; 
    if (permission == null) 
     permission = resolveInfo.activityInfo.applicationInfo.permission; 
    if (permission != null && ContextCompat.checkSelfPermission(this, permission) 
      != PackageManager.PERMISSION_GRANTED) 
     candidates.remove(i); 
} 
関連する問題