AndroidでGoogleMapアプリ作成
第1回 表示
第2回 表示形式 衛星、地図、地形図
第3回 マーカーと直線
第4回 googleMapのエラー
第5回 PlaceAPIとマーカーのセット
第6回 現在地 GPSの実装
第7回 トラッキング
第8回 様々な技法
さて、とりあえずは完成しました。ただ実はエラーが出ることがあります。そのための対処を行っていきます。
発生するエラー
富士市役所ではなく、スタート地点として東京駅を準備します。
double tokyoStationLatDouble = 35.681167; double tokyoStationLngDouble = 139.767052; LatLng startLatLng= new LatLng(tokyoStationLatDouble ,tokyoStationLngDouble );
実行して、ズーム処理を手動で行ってみてください。アプリが落ちることがあるかもしれません。場合によっては起動時点で落ちます。
Logcatを見ますと
E/AndroidRuntime: FATAL EXCEPTION: main Process: net.honeybread.directionthat, PID: 3111 java.lang.StackOverflowError at java.util.HashMap.secondaryHash(HashMap.java:350) at java.util.HashMap.remove(HashMap.java:635) at com.google.maps.api.android.lib6.gmm6.util.e.d(com.google.android.gms.DynamiteModulesB@12221070@12.2.21 (070-188803320):31) at com.google.maps.api.android.lib6.gmm6.util.e.a(com.google.android.gms.DynamiteModulesB@12221070@12.2.21 (070-188803320):39) at com.google.maps.api.android.lib6.gmm6.util.e.b(com.google.android.gms.DynamiteModulesB@12221070@12.2.21 (070-188803320):11)
となりました。東京駅のような場所ではインドア情報が多すぎるためでしょうか。
このエラーはAndroidStudioで自動で作られるgoogleMapアプリでも発生しますし、公式のサンプルコードでも発生します。
さらにgoogleMapsAPIサイトを調べますと、以下の記述が。
サポートの終了の通知: 今後のリリースでは、インドアマップは
normal
マップタイプでのみ利用できます。 以降は、satellite
、terrain
、hybrid
マップでインドアマップはサポートされません。 インドアマップのサポートが終了しても、isIndoorEnabled()
は引き続き、従来どおり setIndoorEnabled()
で設定された値を返します。 デフォルトでは、setIndoorEnabled
は true
です。 上記のマップタイプでインドアマップのサポートを終了する時期については、リリースノートでお知らせします。とのこと。MAP_TYPE_NORMALのみの対応でデフォルト値がtrueというのはどうも納得がいきませんが。。。次のようにmMap=googleMap;の下に追記。インドア表示をデフォルトでオフにします。
mMap = googleMap; mMap.setIndoorEnabled(false);
※初期状態はMAP_TYPE_NORMALですが、明示的にfalse設定しない場合、落ちます。
その上で、MAP_TYPE_NORMALモードで表示する場合は、以下のようにします。ただし、本当に必要な場合でもない限りは全てfalseとし、MAP_TYPE_NORMALでも使わないことをおすすめします。というのも、高速にズームイン、ズームアウトするとMAP_TYPE_NORMALであっても落ちる場合があるためです。
public void setMapType(int mapType){ switch (mapType) { case 0: mMap.setMapType(GoogleMap.MAP_TYPE_NORMAL); mMap.setIndoorEnabled(true); break; case 1: mMap.setMapType(GoogleMap.MAP_TYPE_SATELLITE); mMap.setIndoorEnabled(false); break; case 2: mMap.setMapType(GoogleMap.MAP_TYPE_HYBRID); mMap.setIndoorEnabled(false); break; case 3: mMap.setMapType(GoogleMap.MAP_TYPE_TERRAIN); mMap.setIndoorEnabled(false); break; } }
これでエラーはなくなる、はずです。
これ以上のエラー処理、例外処理はこの連載とはずれてしまいますので、この辺りで・・
Manifestへの追加
念のため、以下の追加も行いました。
<application android:largeHeap="true" android:hardwareAccelerated="true" />