web-dev-qa-db-ja.com

現在のデバイスにアクティビティが存在するかどうかを判断しますか?

デバイスにアクティビティが存在するかどうかを確認する方法はありますか? YouTubeビデオリンクがある場合は、YouTubePlayerActivityで開くように指定します。しかし、何らかの理由で彼らがそれを持っていない場合、私はクラッシュしたくありません。

アクティビティが存在するかどうかを確認する方法はありますか? startActivity()がランタイム例外をスローしないため、ランタイム例外をキャッチできないと思います。

27
stormin986

ランタイム例外をキャッチできないと思います

実際、これは機能します。

try {
    startActivity(new Intent(..));
} catch (ActivityNotFoundException e) {
    Toast.makeText(this, "Not installed.", LENGTH_SHORT).show();
}
4
yanchenko

必要なコンポーネント情報を使用してIntentオブジェクトを作成し、インテントが呼び出し可能かどうかを確認できます。SOでこのスニペットを見つけたので、実際のスレッドへのリンクがありません。

private boolean isCallable(Intent intent) {
        List<ResolveInfo> list = getPackageManager().queryIntentActivities(intent, 
            PackageManager.MATCH_DEFAULT_ONLY);
        return list.size() > 0;
}
77
Samuh

これは、これを行う最も簡単な方法です。

_boolean activityExists = intent.resolveActivityInfo(getPackageManager(), 0) != null;
_

それも1つです Googleが推奨

インテントを受信するアプリが存在することを最初に確認するには、インテントオブジェクトでresolveActivity()を呼び出します。結果がnullでない場合、インテントを処理できるアプリが少なくとも1つあり、startActivity()を呼び出しても安全です。結果がnullの場合は、インテントを使用しないでください。可能であれば、インテントを呼び出す機能を無効にする必要があります。

21
Malcolm

私はやった:

        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にフォールバックします。

7
user979247

デバイスで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);
        }
0
Sakiboy