[Android] Runtime Permission, Android 6.0 からの変更

Android 6.0からの変更として、既存アプリに大きな影響がでると思われるのがこの
Runtime Permission だと言われています。

いままでビルドして公開していたアプリはどうなるのかというと、アプリとして起動しなくなる、例外で落ちるのです

ちょっと大げさですが、理屈から言うとそうなります。

sponsored link

Runtime Permission

 
ただし、必ずそうなるわけでもありません

  1. そもそもPermissionを入れていない
  2. Normal Permission は除外される
  3. Android 6 のユーザーが拒否を選択しなければ起きない

マニフェスト、AndroidManifest.xmlに、例えばREAD_EXTERNAL_STORAGEを設定している場合は対応が必要です。

 

Dangerous Permission

 

対応が必要な Dangerous Permission です

Dangerous Permission
Permission Group Permissions
CALENDAR READ_CALENDAR
WRITE_CALENDAR
CAMERA CAMERA
CONTACTS READ_CONTACTS
WRITE_CONTACTS
GET_ACCOUNTS
LOCATION ACCESS_FINE_LOCATION
ACCESS_COARSE_LOCATION
MICROPHONE RECORD_AUDIO
PHONE READ_PHONE_STATE
CALL_PHONE
READ_CALL_LOG
WRITE_CALL_LOG
ADD_VOICEMAIL
USE_SIP
PROCESS_OUTGOING_CALLS
SENSORS BODY_SENSORS
SMS SEND_SMS
RECEIVE_SMS
READ_SMS
RECEIVE_WAP_PUSH
RECEIVE_MMS
STORAGE READ_EXTERNAL_STORAGE
WRITE_EXTERNAL_STORAGE

 
また、3番目のAndroid 6のユーザーが拒否を選択しなければ起きない(許可する)というケースはBuildがAPI 23よりも以前の場合で、古いAPIで昔に作ったアプリなどです。
その場合は、インストールで決定していて、初期値は許可になっているからです。(最初に許可していてアプリとして動作しているという前提)
ただ、Android 6からアプリの設定に入り、Permissionを拒否することが可能になり、その場合は、例外となります。

では、これに対応した実装方法です

device-2015-12-04-140604
 

Permission at Runtimeに対応した実装

 
Android 6では、これらPermissionはインストール時は拒否の設定で、その後、実際のコードが呼ばれたときに拒否されているので例外で落ちます。

実装としては、起動後に許可を確認して拒否されていれば許可を求めるようにします

permission_1

  • APIが23以上か否か
    • False: そのまま処理実行
  • 許可しているか否か、checkSelfPermission(…)
    • 許可していない場合や、初回起動のケースは次に行く
      • 初めは許可していたが、途中で拒否をユーザーが選択するケースもあり得ることに注意
    • 許可しているケースは処理に移る
  • Permissionが何に使われるか説明して許可してもらうように依頼する
    • 拒否された場合はこの機能については動作しないが他の処理をする
      • 例えばゲームアプリで得点をネットにアップするとき、ユーザーの位置情報もアップしたいという要請に対して拒否しても、ゲームは継続されるということです。
    • 許可されて処理の実行

例として、GPSでACCESS_FINE_LOCATIONを使う場合を想定してみます

AndroidManifest.xml

 
targetSdkVersionが23ですが
minSdkVersin を15としているので
Android6 とそれ以外のケース分けが必要となります
 
build.gradle

 
MainActivity.java

 
以下はLocationの実装ですが
Permissionに関連する場所で例外が出るケースの
対応を入れます

LocationActivity.java

 
一応レイアウト
activity_main.xml

 
gps_13

それぞれGPSに関連することは以下を参照してください。
GPSで位置情報を取得するアプリを作る

Reference:
Runtime Permissions | Android Developers