GoogleMapでハマったところ


Pocket

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が表示されるようになりました。

MapFragment

さて、何作ろう。

 
 

(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を無効にしてあげると消えた。

参考:GPS icon is still blinking after locationManager.removeUpdates() and by setting locationManager to null

protected void onStop() {
    mMap.setMyLocationEnable(false);
    if (mLocationManager != null) {
        mLocationManager.removeUpdates(this);
        mLocationManager = null;
    }
}

 
 

Leave a Comment

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