Androidでのパーミッションについて
昔(APIレベル < 23)はこんな緩い許可でOKでした。
- ただAndroidManifest.xmlに書くだけ
- インストール時に自動的に許可される
これは大昔の話。
現在(APIレベル >= 23)はスゴク厳格になってます。
いわゆるパーミッション許可ダイアログの表示必須です。
意外とやり方が面倒だったので、
ここでは そのパーミッション許可ダイアログの出し方 をまとめました。
このページの目次
許可ダイアログを出す必要があるパーミッションの種類
まずパーミッションと許可ダイアログについて
別に全パーミッションで必須なわけじゃないです。
一部の Dangerousパーミッション に必要になります。
▼ 公式での Dangerousパーミッション の解説
Dangerous パーミッションは、アプリがユーザーの個人情報を含むデータやリソースを必要とする、あるいはユーザーが保存したデータや他のアプリ操作に影響を及ぼす可能性があるケースを対象とします。たとえば、ユーザーのコンテンツを読み取る機能には、Dangerous パーミッションが必要です。アプリが Dangerous パーミッションが必要性であると宣言している場合、ユーザーはアプリに明示的にパーミッションを付与しなければなりません。
引用元 : https://developer.android.com/guide/topics/security/permissions?hl=ja
『個人情報を含むデータやリソース』
ここが重要なところ
一例(というか全部?)を挙げると、以下の通りです。
※ 抜けてるパーミッションがあれば教えてください。
- READ_CALENDAR
- WRITE_CALENDAR
- CAMERA
- READ_CONTACTS
- WRITE_CONTACTS
- GET_ACCOUNTS
- ACCESS_FINE_LOCATION
- ACCESS_COARSE_LOCATION
- RECORD_AUDIO
- READ_PHONE_STATE
- CALL_PHONE
- READ_CALL_LOG
- WRITE_CALL_LOG
- ADD_VOICEMAIL
- USE_SIP
- PROCESS_OUTGOING_CALLS
- BODY_SENSORS
- READ_EXTERNAL_STORAGE
- WRITE_EXTERNAL_STORAGE
アプリを確実にAPIレベル23以降に対応させたいなら・・・
これらパーミッションの許可ダイアログ表示が必要
よく使うのは WRITE_EXTERNAL_STORAGE とかですね。
パーミッション許可ダイアログの表示手順&コード例
実際にとあるアプリでは、以下2つの権限が必要でした。
- WRITE_EXTERNAL_STORAGE
- READ_CONTACTS
これを例に取ると、以下手順でダイアログ表示できます。
1.普通にAndroidManifest.xmlに権限追加
まずは AndroidManifest.xml の編集
ここに今まで通りパーミッションを追加します。
▼ ここでは2つのパーミッションを追加
1 2 3 4 5 6 |
<manifest ...> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_CONTACTS" /> <application... |
Android6.0以上では、これだけでは不完全です。
起動時にも許可を取るコードが必要になりました。
2.許可ダイアログを起動時に表示する
そしたら次からが肝心な処理です。
許可ダイアログの表示
以下の条件に当てはまるなら、表示しないとダメです。
- Android6.0以降に対応させる場合
- APIレベル23以降に対応させる場合
- そのうえで許可を取れていない場合
実際には onCreate 内にこういうコード書いてみました。
▼ onCreate内にて・・・
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
/// パーミッション許可を取る if (Build.VERSION.SDK_INT >= 23) { if(ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED || ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[]{ Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_CONTACTS }, PERMISSION_WRITE_EX_STR); } } |
▼ またActivityの内側に定数も宣言しておく
1 2 |
/// こんな風に定数を宣言 private static final int PERMISSION_WRITE_EX_STR = 1; |
ちなみに対応は Build.VERSION.SDK_INT >= 23 だけでOK。
それ以前のバージョンでは許可ダイアログは不要なようです。
3.許可ダイアログの結果を受け取る
許可ダイアログを表示したら・・・
その許可ダイアログの結果受け取りが必要
結果には大きく分けて次の2種類があります。
- 許可が取れた場合
=> そのまま通常通りにアプリを起動する - 許可が取れなかった場合
=> 再度許可を取ったりトースト表示したり
結果は onRequestPermissionsResult をオーバーライドして受け取り可能です。
実際に書いてみたコードは以下のようなもの
▼ Actiivty内でオーバーライド
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
@Override public void onRequestPermissionsResult( int requestCode, String[] permission, int[] grantResults ){ if (grantResults.length <= 0) { return; } switch(requestCode){ case PERMISSION_WRITE_EX_STR: { if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { /// 許可が取れた場合・・・ /// 必要な処理を書いておく } else { /// 許可が取れなかった場合・・・ Toast.makeText(this, "アプリを起動できません....", Toast.LENGTH_LONG).show(); finish(); } } return; } } |
こういう感じ。
許可が取れない場合はトースト表示してます。
実際にこのコードを追加すると・・・
起動時にこんなダイアログが表示されます。
▼ WRITE_EXTERNAL_STORAGE の許可ダイアログ
▼ READ_CONTACTS の許可ダイアログ
よく見かけるダイアログが表示できました。
これで心置きなくアプリリリースできます。
ここまでのまとめ - 許可ダイアログは必ず表示しよう
という訳で許可ダイアログ表示についてでした。
- Android6.0以降に対応させたい
- 個人情報を含むデータにアクセスする
そんな場合はパーミッションリクエスト必須ですね。
アプリ公開前に必ず実装するようにしたいです。