Android:Android Beamの設定画面が呼び出せない(GN)

Nexus SもICSになり、GalaxyNexusも買ったので、折角だからAndroid Beamアプリを作っちゃうもんねー!ということで今作っている最中なのですが、思わぬトラップに引っ掛かっています。

まずAndroid Beam DemoをGalaxyNexusにインストールして、それで挙動を確認しようと思って構っていたところ、ActionBarにある設定ボタンを押したら、なんと強制終了してしまいました。
docomo版のGalaxyNexusだけの問題かと思ったのですが、海外版のGalaxyNexusを持っている方に協力していただいて確認してもらったところ、やはり同じ模様…。ActivityNotFoundExceptionが出ていました。

試しに4.0.3にアプデしたNexus Sにインストールしてから設定ボタンを押したら、Android Beamの設定画面を呼び出していました。これでようやくまともな動作がわかったわけですが、なんでGalaxyNexusでエラーになるのかがわかりません…。サンプルコードがやっているのは凄くシンプルなことです。

Intent intent = new Intent(Settings.ACTION_NFCSHARING_SETTINGS);
startActivity(intent);

これだけ。Settings.ACTION_NFCSHARING_SETTINGSで暗黙的Intentを投げてるだけですね。でもGalaxyNexusだとこのIntent-Filterに引っ掛かる処理がないです。なんでやねーん!

次に、Nexus Sは上の暗黙的Intentが引っ掛かるので、PackageManagerを使って明示的に呼び出しているパッケージ名、クラス名を見て、それを参考に明示的Intentを投げて解決してやろうと思ってやってみました。

Intent intent = new Intent();
intent.setClassName("com.android.settings",
    "com.android.settings.Settings$AndroidBeamSettingsActivity");
startActivity(intent);

ところがこれでもGalaxyNexusではダメでした。Nexus SではOK。
原因は、ClassNotFoundExceptionです。
com.android.settings.nfc.NdefPushがないと…。

ないわけはないような…と思いながらも、そういうエラーが出ています。

今の所は解決方法がわかってないので、PackageManagerから暗黙的Intentが引っ掛かる場合は、暗黙的Intentで呼び出し、そうでない場合はAndroid Beamの設定画面よりもっと前の設定画面を呼び出そうかなと思います(妥協案で)。

PackageManager pm = getPackageManager();
Intent intent = new Intent(Settings.ACTION_NFCSHARING_SETTINGS);
List<ResolveInfo> apps = pm.queryIntentActivities(intent, 0);
if (apps.size() == 0) {
    intent = new Intent(Settings.ACTION_SETTINGS);
}
startActivity(intent);

デモアプリでエラーが発生しちゃいかんだろ!GalaxyNexus!!


タグ Android | パーマリンク.

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です