AndroidでGoogleMapアプリ作成
第1回 表示
第2回 表示形式 衛星、地図、地形図
第3回 マーカーと直線
第4回 googleMapのエラー
第5回 PlaceAPIとマーカーのセット
第6回 現在地 GPSの実装
第7回 トラッキング
第8回 様々な技法
さて、とりあえずは完成しました。ただ実はエラーが出ることがあります。そのための対処を行っていきます。
INDEX
発生するエラー
富士市役所ではなく、スタート地点として東京駅を準備します。
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"
/>