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