趣味でAndroidアプリを作ってます。
こんな感じで地図上に場所を記憶させて、
ピンをクリックすると画像付きの詳細が見れます。
コメントが見切れているのはご愛敬です(笑)
でも、Androidの開発って、エラー解析しようとすると、まだ日本語サイトが少ないし結構大変なんですよね。。。
という事で、少しでも開発者の支援になればと、このブログにも時々メモを残そうと思います。
さて、
今日はスマホを機種変更したので、アプリも再インストールです。
これまでの携帯のように、開発者モードにしてアプリを落として起動したのですが・・・
「問題が発生したのでアプリを終了します」
(´;ω;`)
ログを見ると、こんなこと言われてます。
Process: com.example.XXXXX.mapmemo, PID: 6050
java.lang.SecurityException: my location requires permission ACCESS_FINE_LOCATION or ACCESS_COARSE_LOCATION
at com.google.maps.api.android.lib6.impl.az.c(:com.google.android.gms.DynamiteModulesB:675)
at com.google.android.gms.maps.internal.j.onTransact(:com.google.android.gms.DynamiteModulesB:177)
at android.os.Binder.transact(Binder.java:387)
ポイントは、「requires permission」ですね。
どうやら位置情報の権限が与えられていないようです。今までの機種では普通に使えてるのに・・・?
で、調べてみたところ、Android6.0以降より、アプリの権限付与周りの仕様が変更されているみたいです。
道理で。なんせ古い機種はAndroid4でしたからね^^;
正しいプログラムとしては
アプリ起動 ⇒ 権限の確認 ⇒ 権限があればアプリ続行
⇒ 権限がない場合は、権限付与のダイアログを表示
一度設定すればアプリ側に権限が残るので、以降は普通に起動する。
というのが定石みたいですね。
つまり、権限付与のコーディングしないと動かないってこと????
orz
しか~し、諦めるのはまだ早い!
アプリ側で権限設定しなくても、端末側から設定する方法がありました。
設定 ⇒ アプリ ⇒ 自作アプリ を選択
AndroidManifest.xmlに定義された権限が一覧されるので、1つ1つON/OFF切り替えが可能です!! ここで両方ONにしたところ、無事起動できました♪
そんなわけで、今回の教訓。
Android6.0以降では、権限が必要な処理の前には権限を確認して ある場合/ない場合 の制御が必要。