123

これまでのところこの方法がありますが、何かが足りないように思いました

たとえば、false を返すファイル /sdcard/sound.3ga があります (このタイプのファイルを処理できるアクティビティがないなど) が、ファイル マネージャーからファイルを開くと、メディア プレーヤーで問題なく開きます。

このインテントは完全ではないと思います。このインテントを処理できるアクティビティがない場合にのみ、handlerExists 変数が false になることを確認するために、さらに何かを行う必要があります。

PackageManager pm = getPackageManager();
Intent intent = new Intent(android.content.Intent.ACTION_VIEW);
String extension = android.webkit.MimeTypeMap.getFileExtensionFromUrl(Uri.fromFile(new File(uriString)).toString());
String mimetype = android.webkit.MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension);
intent.setDataAndType(Uri.fromFile(new File(uriString)),mimetype);
boolean handlerExists = intent.resolveActivity(pm) != null;
4

9 に答える 9

155

edwardxuのソリューションは私にとって完璧に機能します。

少し明確にするために:

PackageManager packageManager = getActivity().getPackageManager();
if (intent.resolveActivity(packageManager) != null) {
    startActivity(intent);
} else {
    Log.d(TAG, "No Intent available to handle action");
}
于 2015-05-01T20:17:48.870 に答える
86
PackageManager manager = context.getPackageManager();
List<ResolveInfo> infos = manager.queryIntentActivities(intent, 0);
if (infos.size() > 0) {
    //Then there is an Application(s) can handle your intent
} else {
    //No Application can handle your intent
}

このインテントを試しましたか?

Intent intent = new Intent(Intent.ACTION_VIEW, Uri.fromFile(yourFileHere));
于 2013-03-14T11:15:21.273 に答える
55
if (intent.resolveActivity(getPackageManager()) == null) {
    // No Activity found that can handle this intent. 
}
else{
    // There is an activity which can handle this intent. 
}
于 2015-02-16T02:51:41.390 に答える
0

kotlin 拡張機能を使用した別のアプローチ

 fun Context.isIntentAvailable(intent: Intent): Boolean {
    val resolveInfo: List<*> = packageManager.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY)
    return resolveInfo.isNotEmpty()
 }

フラグメント内での使用

val available = requireContext().isIntentAvailable(this)

アクティビティ内での使用

val available = this.isIntentAvailable(this)
于 2020-03-25T23:03:08.643 に答える
0

2021年に似たようなものを探している人のための小さなアップデート:) Android 11以降、パッケージマネージャーを呼び出すことは望ましくないため、追加の努力が必要です. では、try-catch で startActivity() をラップしてみませんか? またはさらに良い - Rx の美しいエラー処理を使用します。

....
.flatMapCompletable { 
      doSomethingThrowable()
          .onErrorResumeNext { completableCallbackIfNotResolvable() }
}
.subscribe()
于 2021-03-08T14:48:30.270 に答える