GoogleMap系の覚え書きメモ(1.5)

はじめに

なんか編集行数が多いと、はてなのWeb編集の奴がハングルみたいなので

分割。まあ追記もしますし。。

前回のまとめは下記


Android 6.0 Marshmallow 対応

target 23 でビルドすると、いろんな箇所でLint絡みでエラー扱いになるところが多いのでそれなりに大変

Android 6.0 onAttachの話

追記(2017/08/27)

compileSdkVersion ‘Google Inc.:Google APIs:24’

と指定した場合、上記の期待どおりに動きませんでした。

@Override
public void onAttach(Context context) {
    super.onAttach(context);
    onAttachContext(context);
}

@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);
    //if (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP_MR1) return;//★コメント
    onAttachContext(activity);
}

private Context mContext = null;
private void onAttachContext(Context context) {
    if(context == null){
        return;
    }
    // 処理
    if(mContext == null){
         mContext = context;
    }
}

みたいな感じにしたほうが良です。

うーん。GoogleApisはやっつけ仕事なんですかネ・・・

Android 6.0 Runtime Permission 関係

権限確認が必要な所がやたらとエラーになってビルドが止まる。

まあ其のために PermissionsDispatcher というLibraryがあるそうですが

  • InstantRun有効にしていると動かない
  • target23までしか指定できない *1
  • ビルドが2−3倍ぐらい遅くなる

で、github等のサンプルを見ていたら

  • 起動時の一番最初のActivity*2でPermissionを許可
    • 許可しない場合はアプリ終了
  • エラー表示されるところには下記のアノテーションを指定
@SuppressWarnings({"MissingPermission"})

みたいな書き方をしていて、なるほどなどと思うことも。

まあPrmissionDispatcher使っている奴でも

のままだと、最新のASではビルドできなくて、上記のアノテーションでエラー潰さないとビルドもできないので

結局冗長なコードになるのは同じなのかなーとか思いつつ

Android 6.0 Runtime Permission をベタで書いてたネットサンプルをイジった時のメモ

[Android] GPSで位置情報を取得するアプリを作る | Androidアプリ開発

な例を参考にしてベタで権限許可用のActivityを書いてみると、

  • 同じグループ単位でまとめてリクエスト/リクエスト分割するみたいな形にしないと変な挙動をする
  • 他にも権限があって、まとめてリクエストするとwizみたいになるけど中途半端にキャンセルすると抜けて先に進んでしまう
  • その権限が必要な箇所で、Permissionが許可されていない時
    • アプリケーションが異常終了する*3*4

その他

Googleのロゴの位置を変更する

カスタムのボタンとかでGoogleのロゴ/マップリンク等が隠れるとGoogle様から怒られるので下記の対処が必要

view = findViewById(R.id.rootLayout); //mapを覆う親のレイアウトを指定
view.getViewTreeObserver().addOnGlobalLayoutListener(new 
         ViewTreeObserver.OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout() {

                if (Build.VERSION.SDK_INT >= 16) {
                    view.getViewTreeObserver().removeOnGlobalLayoutListener(this);
                } else {
                    view.getViewTreeObserver().removeGlobalOnLayoutListener(this);
                }

                //ズラす高さ
                int height = DisplayUtils.pixelFormat(mActivity,70);
                googleMap.setPadding(0, 0, 0, height);
           }
       });
public class DisplayUtils {
    public DisplayUtils() {
    }

    public static int pixelFormat(Context context, int dp) {
        float density = context.getResources().getDisplayMetrics().density;
        int px = (int)((float)dp * density + 0.5F);
        return px;
    }

    public static int getDisplayWidthPixels(Context context) {
        DisplayMetrics metrics = context.getResources().getDisplayMetrics();
        return metrics.widthPixels;
    }

    public static int getDisplayHeightPixels(Context context) {
        DisplayMetrics metrics = context.getResources().getDisplayMetrics();
        return metrics.heightPixels;
    }

    public static int getDisplayStatusBar(Context context) {
        DisplayMetrics metrics = context.getResources().getDisplayMetrics();
        return (int)Math.ceil((double)(25.0F * metrics.density));
    }
}

genymotionで最新のMapを動かす場合

9.+対応のGooglePlay開発者サービスを更新した場合

  • 2.3.7
    • GooglePlay開発者サービスの内部で、API的に使っちゃいけない関数を呼んでるらしくて、OSごと再起動繰り返す
  • 6.0
    • GooglePlay開発者サービスの内部で、Permissionのリクエストが足りないっぽくてセキュリティエラーでエラー終了ダイアログを延々と出す

6.0に関しては、実機(arm)だと大丈夫っぽいのでarm判別して固有処理とかあるのかな。。

2.3.7に関しては、genymotionのイメージでサポートしていない関数を読んでるのかもしれない

でもまあ実際は2系端末の実機で動かしてみないとわからないけど。。

eclipseベースの昔のサンプルをASで動かそうとしてハマる時

import com.google.android.maps.geopoint cannot be resolved

辺りのエラーに遭遇することが有り。

昔はMapを使うときは GoogleApis使ってたよなーという話で

その手の指定が公式サイトに全然出てこないので下記を参照しました

compileSdkVersion 'Google Inc.:Google APIs:23'

でもこれ何で最近の公式にこの記述が出てこないかというと

GeoPoint とか使ってたのってv1ベースのサンプルなんですよね。*5

辺りを読めばよいかと

  • v1はOpenGL1ベース、v2はOpenGL2ベースで描画
  • OverlayItem => Marker にピンの表示が変更
  • OverlayItemは非同期追加、Marker同期追加 になるので重くなった
    • =>v2ベースでも非同期追加にしたい
    • =>Google Maps Android Marker Clustering Utility 使ってね

辺の流れはあるかな・・と。

実はv1ベースで作ったほうが軽量というのは有ります *6

*1:24指定すると生成されない。ASのIDEで勝手に推奨書き換えされた時に凄くハマった><

*2:SplashActivityとか

*3:無害なレスポンスで通過みたいな話はどうなったんだろう?

*4:logcatみるとthrow SecurityExceptionしている挙動に見える

*5:現在の形式は 通常のtarget-sdk + google-play-services ライブラリ追加形式

*6:でもv1ベースだとビジネスライセンスじゃないとMapが表示できないと思う