デバイスにアクティビティが存在するかどうかを確認する方法はありますか? YouTubeビデオリンクがある場合は、YouTubePlayerActivityで開くように指定します。しかし、何らかの理由で彼らがそれを持っていない場合、私はクラッシュしたくありません。
アクティビティが存在するかどうかを確認する方法はありますか? startActivity()がランタイム例外をスローしないため、ランタイム例外をキャッチできないと思います。
ランタイム例外をキャッチできないと思います
実際、これは機能します。
try {
startActivity(new Intent(..));
} catch (ActivityNotFoundException e) {
Toast.makeText(this, "Not installed.", LENGTH_SHORT).show();
}
必要なコンポーネント情報を使用してIntentオブジェクトを作成し、インテントが呼び出し可能かどうかを確認できます。SOでこのスニペットを見つけたので、実際のスレッドへのリンクがありません。
private boolean isCallable(Intent intent) {
List<ResolveInfo> list = getPackageManager().queryIntentActivities(intent,
PackageManager.MATCH_DEFAULT_ONLY);
return list.size() > 0;
}
これは、これを行う最も簡単な方法です。
_boolean activityExists = intent.resolveActivityInfo(getPackageManager(), 0) != null;
_
それも1つです Googleが推奨 :
インテントを受信するアプリが存在することを最初に確認するには、インテントオブジェクトで
resolveActivity()
を呼び出します。結果がnullでない場合、インテントを処理できるアプリが少なくとも1つあり、startActivity()
を呼び出しても安全です。結果がnullの場合は、インテントを使用しないでください。可能であれば、インテントを呼び出す機能を無効にする必要があります。
私はやった:
Intent intent = new Intent();
intent.setClassName( "com.google.Android.gsf", "com.google.Android.gsf.login.AccountIntroActivity" );
if(getContext().getPackageManager().resolveActivity(intent, PackageManager.MATCH_DEFAULT_ONLY) != null) {
getContext().startActivity( intent );
} else {
getContext().startActivity(new Intent(Settings.ACTION_ADD_ACCOUNT));
}
これにより、Google固有のアカウントの追加インテントが確実に存在し、存在しない場合は、より一般的なACTION_ADD_ACCOUNTSにフォールバックします。
デバイスでActivity
が使用可能かどうかを確認する方法は次のとおりです。
Intent intent = new Intent(Intent.ACTION_CALL);
intent.setData(Uri.parse("tell//:" + phoneNumber));
PackageManager manager = context.getPackageManager();
List<ResolveInfo> activities = manager.queryIntentActivities(
intent, 0);
if (!manager.hasSystemFeature(
PackageManager.FEATURE_TELEPHONY) || activities == null || activities
.size() < 1) {
Toast.makeText(
context,
"Sorry, there were no apps that worked with that request.",
Toast.LENGTH_SHORT).show();
} else {
context.startActivity(intent);
}