[Android] Runtime Permission, Dangerous Permission

cat61 01 - [Android] Runtime Permission, Dangerous Permission

Android もセキュリティーを厳しくしているため、特定の機能はユーザーからの明確な許可を得ないと怒られます。

元々インストール時に許可をユーザーに求めていましたが、よりわかりやすく、また後から拒否することもできるようにしたのがこの Runtime Permission です。



Runtime Permission

 
これはAndroid 6.0(API 23)からの機能なので、それ以前の機種や対応アプリとは挙動が異なります。ただ、もう古い機種で少なくなっているとは思います。

Runtime Permission に対応しなくてもいいケースは、

  1. そもそもPermissionを入れていないアプリ
  2. より緩い Normal Permission は除外される
    • 対応しないといけないのはDangerous Permission

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

 

 

Dangerous Permission

 
以下が Dangerous Permission のグループとそれぞれ個別の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

Ref:システム パーミッション | Android Developers

 

Permission at Runtimeに対応した実装

 
これらPermissionはインストール時は許可されていない状態です。
また、一旦許可してもその後ユーザーがそれを拒否させている場合もあるので、その機能を呼ばれた時に毎回確認します。

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

permission 1 300x254 - [Android] Runtime Permission, Dangerous Permission

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

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

AndroidManifest.xml

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

 
1. APIが23以上か否か
APIレベルの確認をして23以上でパーミッションの確認をします。
(それ以下はすでにインストール時に許可されているはず)

2. 許可しているか否か、checkSelfPermission()

パーミッションが既に許可されている場合(以前にユーザーによって許可された)

許可されていない場合(初回起動時あるいはユーザーによってこの機能は拒否されている)
アプリの機能以外はユーザーが使っていることもあり得ます。

3. Permissionが何に使われるか説明して許可を求める
許可されていない場合は許可を求める
この機能が許可されないと〇〇ができないなどユーザーに理由を示して許可を求める

許可を求めるダイアログが表示されて、それにユーザーからの答えを受け取ります。

実際にこれを実装したケースは以下にあります。

cat55 00 100x100 - [Android] Runtime Permission, Dangerous Permission
アンドロイドでの位置情報は端末のGPSとWifiや基地局GPSを組み合わせた、FusedLocationProviderClient が...

 

ユーザーによる許可

 
実機からユーザーの許可・拒否は設定で可能です。

「設定」「アプリと通知」から確認してみると、

dangerouss permission 02 - [Android] Runtime Permission, Dangerous Permission

「権限マネージャー」「位置情報」を見ると該当のアプリとして
TestGPSがあります。

dangerouss permission 05b - [Android] Runtime Permission, Dangerous Permission

アプリの位置情報権限が現在「許可しない」になっているのがわかります。これをユーザーが「アプリの使用中のみ許可」に変えたり、また「許可しない」に変更ができるわけです。

dangerouss permission 06 - [Android] Runtime Permission, Dangerous Permission

 

実装したアプリでのケース

 
上記の内容を実装したTestGPSでユーザーの許可・拒否についてどのようになるのか確認してみましょう。

初回起動時はこのような2択になります。

dangerouss permission 08 - [Android] Runtime Permission, Dangerous Permission

  • アプリの使用中のみ許可
    • 許可すればその後変更なければそのまま許可状態
  • 許可しない

許可しない状態で再度このアプリの位置情報を使おうとすると、ちょっとイラっとしたダイアログになります。

dangerouss permission 07 - [Android] Runtime Permission, Dangerous Permission

  • 許可しない(次回から表示しない)

これを選択するとこれ以上許可を求めるダイアログは表示されません
アプリによっては、許可されていないために機能が使えないとユーザーに理解してもらわないとバグっていると思われてしまうかもしれません。

また、ユーザーが理解していない可能性がある場合は説明することも必要です。
References:
アプリの権限をリクエストする | Android Developers
システム パーミッション | Android Developers

誤字脱字、意味不明で分からにゃイ、
などのご意見はこちらから mailフォーム

ブックマークしておくと便利です このエントリーをはてなブックマークに追加




アプリ開発が上達するお勧め

アプリ開発を始めたけどわからないところがあり、誰かに聞きたいけど周りにはそんな人はいない…あるいは、会社で働いていて日中そんなに時間をとれないなど、オンラインのプログラミングスクールがいいでしょう、時間の制約がないところが一番の魅力です。

以下の3つはAndroidが学習できるオンラインスクールです。


TECH ACADEMY
Androidアプリコース



侍エンジニア塾
侍エンジニア塾 無料体験レッスン



CodeCamp
~約8,000名の受講生と80社以上の導入実績~
現役エンジニアのオンライン家庭教師CodeCamp





正直ネットや本では限界があります。直接(ネットで)誰か分かる人に聞いた方が早く解決して、上達も早いと思います。

尚、スクールがダメだと言う人がいますが、やる気があれば問題ありません。与えられるのを待っていてはいけないですね
欲しいものは取りに行くのです。


Google Pixel 3 XLグローバル版
SIMフリー 並行輸入品
6.3インチの大画面
背景をぼかすポートレートモード撮影


Anker PowerCore II Slim 10000
Power IQ 2.0搭載
iPhone & Android対応

シェアする

  • このエントリーをはてなブックマークに追加

フォローする