GoogleMap系の覚え書きメモ(1.5)
はじめに
なんか編集行数が多いと、はてなのWeb編集の奴がハングルみたいなので
分割。まあ追記もしますし。。
前回のまとめは下記
Android 6.0 Marshmallow 対応
target 23 でビルドすると、いろんな箇所でLint絡みでエラー扱いになるところが多いのでそれなりに大変
Android 6.0 onAttachの話
追記(2017/08/27)
と指定した場合、上記の期待どおりに動きませんでした。
@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等のサンプルを見ていたら
@SuppressWarnings({"MissingPermission"})
みたいな書き方をしていて、なるほどなどと思うことも。
まあPrmissionDispatcher使っている奴でも
のままだと、最新のASではビルドできなくて、上記のアノテーションでエラー潰さないとビルドもできないので
結局冗長なコードになるのは同じなのかなーとか思いつつ
Android 6.0 Runtime Permission をベタで書いてたネットサンプルをイジった時のメモ
[Android] GPSで位置情報を取得するアプリを作る | Androidアプリ開発
な例を参考にしてベタで権限許可用のActivityを書いてみると、
- 同じグループ単位でまとめてリクエスト/リクエスト分割するみたいな形にしないと変な挙動をする
- 他にも権限があって、まとめてリクエストするとwizみたいになるけど中途半端にキャンセルすると抜けて先に進んでしまう
- その権限が必要な箇所で、Permissionが許可されていない時
その他
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); } });
- DisplayUtils.java
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