私はこれを行うAndroidアプリを持っています:
PackageManager pm = getApplicationContext().getPackageManager();
Intent browserIntent = new Intent();
browserIntent.setAction(Intent.ACTION_VIEW);
browserIntent.addCategory(Intent.CATEGORY_BROWSABLE);
browserIntent.setData(Uri.parse("http://www.google.com"));
ResolveInfo resolveInfo = pm.resolveActivity(browserIntent, PackageManager.MATCH_DEFAULT_ONLY);
try {
String browserType = nutent.activityInfo.packageName;
} catch (NullPointerException npe) {
npe.printStackTrace();
}
私はこれを4つの異なる受話器と多くの異なるエミュレーター構成でテストしました。それらはすべて正常に動作します。しかし、resolveInfoがnullになることがあるため、NPEをスローして、実際にデプロイされたアプリケーションからクラッシュレポートを取得しています。
差し迫った修正は、NPEをキャッチし、アプリがクラッシュする前に対処することです(上記のように)。しかし、私はこれを自分で再現しようと何日も試みましたが、できません。単一のデフォルトブラウザがインストールされているエミュレータでは、com.android.browser.BrowserActivityに解決されます。
ResolveInfo{411ef228 com.android.browser.BrowserActivity p=0 o=0 m=0x208000}
同様に、複数のブラウザがインストールされている受話器では、これは多少異なる方法で解決されます... com.android.internal.app.ResolverActivity:
ResolveInfo{415c13b8 com.android.internal.app.ResolverActivity p=0 o=0 m=0x0}
ここでのresolveActivity()ドキュメントは次のように述べています。
最良のアクションであると判断された最終アクティビティインテントを含むResolveInfoを返します。一致するアクティビティが見つからなかった場合はnullを返します。複数の一致するアクティビティが見つかり、デフォルトが設定されていない場合、アクティビティリゾルバーなどの他のものを含むResolveInfoを返します。
それで、私は最初のシナリオ、つまり最良の行動であると決定された活動意図のシナリオをカバーしました。また、最後のシナリオ、デフォルトのアクションがない複数の一致するアクティビティのシナリオで、ResolverActivityを返します。
URLのアクティビティを要求するときにnullを返すresolveActivity()のシナリオを再現したいと思います。誰かが、たとえばデバイスをルート化せずにこれを行う方法について何か考えがありますか?