Google Maps for Android V2がエミュレータでMapFragmentがInflateException

 Google Maps for Android V2がエミュレータでのみMapFragmentが取得できずInflateException(inflater.inflateで落ちる)、という事象に遭遇しました。
 結論からするとAndroidManifest.xmlのpermissionが足りなかったのですが、実機では動いていたこともあり、遠回りしてしまいました。

 最初にエミュレータで実行すると、”This app won’t run without Google Play services, which are missing from your phone.”という表示が出て、「Get Google Play services」というボタンが表示されます。このボタンを押してみると、例外で落ちました。
 軽くググってみると、「エミュレータではGoogle Maps for Android V2が使えない」という記事が沢山ヒットします。しかしこれは情報が古く、今現在では条件が整えば実行できます。

Android* – Now Available: Android SDK x86 System Image with Google APIs | Intelレジスタードマーク Developer Zone

 ただ、最初は「エミュレータでは実行できないの!?」とビビッて、あちこちにある「com.android.vendingとcom.google.android.gmsを手動でインストール」方法を試してみたり、右往左往しました。ちなみにこれを手動で設定しても、やはり上手くいきません。先ほどの「Get Google Play services」ボタンが「Update」ボタンに変わって、押してみるとやはり落ちる、という状況になるだけです(つまりバージョンが古いのですが、アップデートしようとすると失敗する)。

 そのうちやっと、現在ではエミュレータでも実行できる、ということに気づいて、ターゲットを”Google APIs x86 (Google Inc.) – API Level 19″にしたエミュレータを作り直しました。
 すると先ほどの画面にはならず、一見実行できているのですが、MapFragmentを使った画面をinflater.inflateするところでInflateExceptionが発生、という、冒頭に書いた状態になりました。
 実を言えば、ことの本質はInflateExceptionではなかったのです。ただ、わたしはとある事情でinflateするところをtry catchしていて、デバッガ上でexceptionの中身を見ていただけなので、原因にたどり着くのに時間がかかってしまいました。InflateExceptionを中心に考えていたので、xmlに何か問題があるんじゃないか、だとしたらなぜ実機では動くのか、等々、遠回りしました。
 結局、試しにこのtry catchを外して、Log catをよく見てみたら、一目瞭然でした。

05-21 11:05:04.084: E/AndroidRuntime(2271): Caused by: java.lang.SecurityException: The Maps API requires the additional following permissions to be set in the AndroidManifest.xml to ensure a correct behavior:
05-21 11:05:04.084: E/AndroidRuntime(2271):

 まんま書いてあります・・・orz。
 これはGoogle API へのアクセスを許可するpermissionですが、これがAndroidManifest.xmlにないと落ちます。
 しかしなぜ実機では動いていたのでしょう・・・。