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!!
