googleMap第4回 googleMapのエラー | error googleMap | Android

スポンサーリンク

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 マップタイプでのみ利用できます。 以降は、satelliteterrainhybrid マップでインドアマップはサポートされません。 インドアマップのサポートが終了しても、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"

/>