Google Mapを使ったアプリを作ろうと思って早速Google play servicesライブラリをインストール→API Keyの取得→ビルドの設定→マニフェストの設定までやって、ためにしSupportMapFragmentで地図を表示してみようというところでハマったので解決方法をメモっておきます。
ハマったコード:InflateExceptionで落ちる
まずはコード。
・MainActivity.java
public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.map); } }
・layout/map.xml
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > <fragment android:id="@+id/fragment1" class="com.google.android.gms.maps.SupportMapFragment" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" /> </RelativeLayout>
・AndroidManifest.xml ※大事なとこだけ抜粋
<uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES"/> <uses-feature android:required="true" android:glEsVersion="0x00020000"/> <application <uses-library android:name="com.google.android.maps"/> <meta-data android:value="My API_Key" android:name="com.google.android.maps.v2.API_KEY"/> </application>
こんな感じでSupportMapFragmentをレイアウトに配置して、MainActivityでsetContentViewしてやるだけで地図が表示されると思ったんですが・・・
android.view.inflateException:Binary XML file line #6 : Error inflating class fragment
で落ちる???なぜ(?_?)・・・原因は2つありました。
原因1:SupportMapFragmentはandroid.app.Fragmentじゃない
SupportMapFragmentはandroid.support.v4.app.Fragmentの子クラスでした。
なので、ActivityでsetContentViewするとandroid.support.v4.app.Fragmentからandroid.app.Fragmentにキャストすることになり落ちます。
修正方法としては、
1.ActivityじゃなくてFragmentActivityに変える
2.SupportMapFragmentじゃなくてMapFragmentに変える
のどちらかで解決できます。
#Supportってプレフィックス付いてんだから気付けよって感じですね・・・orz
原因2:meta-dataの定義が足りない
Google Play Services SDKを使用するにはAndroidManifest.xmlに“com.google.android.gms.version”の定義が必要。
http://developer.android.com/google/play-services/setup.html#Setup
修正方法は、AndroidManifest.xmlの<application>要素に下記を追加する。
<application <meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version"/> </application>
思わぬところでハマってしまいましたがこれでGoogleMapが表示されるようになりました。
さて、何作ろう。
(2014/03/03)追加ですorz。
ハマる:removeUpdatesしてもGPSアイコンが消えない
LocationManagerからLocationListener削除したのに、GPSが現在位置検索中のままになる。
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.map); mMap = ((MapFragment)getFragmentManager().findFragmentById(R.id.fragment_map)).getMap(); mMap.setMyLocationEnabled(true); mMap.setMapType(GoogleMap.MAP_TYPE_NORMAL); mMap.setOnMapClickListener(this); Criteria criteria = new Criteria(); criteria.setBearingRequired(false); criteria.setSpeedRequired(false); criteria.setAltitudeRequired(false); mLocationManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE); mLocationManager.requestLocationUpdates(provider, 30000, 0, this); } protected void onStop() { if (mLocationManager != null) { mLocationManager.removeUpdates(this); mLocationManager = null; } }
原因:MyLocationが有効になってるから
MyLocationを無効にしてあげると消えた。
protected void onStop() { mMap.setMyLocationEnable(false); if (mLocationManager != null) { mLocationManager.removeUpdates(this); mLocationManager = null; } }