新人成長記録17th
今回はAndroid6.0から変更があったパーミッションについてです
なぜ今さら6.0かと言うと、かなりの時間を使い悩んでいたものが、パーミッションの許可が原因でできていなかったからです
完全にパーミッションに変更があったことを忘れていましたので、頭に残しておくためにも書いていきます
6.0からの変更点
ターゲットSDKがAndroid6.0以前では、インストール時にManifest内で設定しているパーミッションを表示し、すべてのパーミッションに同意するかの確認をして、同意がされるとインストールが開始してアプリに権限が与えられる流れでした
しかし、Android6.0からはパーミッションは表示されずにインストールが開始し、アプリの起動後に開発側が指定したタイミングでユーザに許可を得るようにするRuntime方式となりました
ただし、すべてのパーミッションにおいて許可を得る必要があるかと言われるとそうではありません
許可が必要になるパーミッションは、ユーザの保存したデータや他のアプリ操作に影響を及ぼす可能性のあるDangerous Permissionsと呼ばれるものになります
例えば、PHONE(電話関連)やLOCATION(位置情報)などのパーミッションが含まれています
以下は、端末のバージョンとターゲットのSDKバージョンのパーミッション付与のタイミングです
端末(6.0未満) | 端末(6.0以上) | |
---|---|---|
target(6.0未満) | インストール時 | インストール時 |
target(6.0以上) | インストール時 | アプリ内 |
こう見ると、ターゲットの古いアプリの修正は不必要かと思われますが、端末バージョンが6.0以降は、端末からパーミッションを変更できるので、パーミッションの許可を外された時にクラッシュする可能性がありますので、パーミッションの確認と許可を得る処理の追加は必要になります
実装方法
では、実際にどのようにパーミッションを確認して、ダイアログを表示するのかを見ていきます
パーミッションを確認するのに使用するメソッドはPermissionCheckerクラスのcheckSelfPermissionです
また、今後は表示しないをチェックされていた場合の処理をするために使用するメソッドはActivityCompatクラスのshouldShowRequestPermissionRationaleです
このメソッドは初回表示時にはfasleになるので注意が必要です
そして、実際にリクエストを出すのはActivityCompatクラスのrequestPermissionsです
実装は以下のようになります
if(PermissionChecker.checkSelfPermission
(activity, android.Manifest.permission.READ_PHONE_STATE) !=
PackageManager.PERMISSION_GRANTED){
if (ActivityCompat.shouldShowRequestPermissionRationale
(activity, android.Manifest.permission.READ_PHONE_STATE)) {
//パーミッションの未許可、今後表示しないにチェックされている時の処理
}
//リクエスト
ActivityCompat.requestPermissions(activity,
new String[]{android.Manifest.permission.READ_PHONE_STATE},
request_code);
}
以上で、確認から許可のダイアログ表示までの処理が完了です
またrequestPermissionsのコールバックとしてonRequestPermissionsResultをオーバーライドします
このコールバックは許可のダイアログのどちらかを押された時点で発生します
requestCodeには、リクエスト時の3つ目の引数のコード
permissionsには、リクエスト時の2つ目の引数に指定したパーミッションの配列
grantResultsには、リクエストに対応したパーミッションの許可状態の配列
実装は以下のようになります
@Override
public void onRequestPermissionsResult
(int requestCode, String[] permissions, int[] grantResults) {
switch (requestCode) {
case PHONE_STATE_CODE:
if (grantResults.length > 0 &&
grantResults[0] != PackageManager.PERMISSION_GRANTED) {
//許可時の処理
}
break;
}
}
以上で、許可のダイアログを押下した時の処理が完了です
未許可時に、今後は表示しないチェックが入っている時などの判定もできるので、処理が必要な時はこちらでもチェックが必要となります
終わりに
パーミッションは許可すると、思ったよりも沢山の情報を引き出すことができてしまいます
ユーザ側はある程度考えて、許可を出すべきですし、開発側は最低限のパーミッションを設定し、使用する目的も表示すべきですね
しかし、表示した内容と中身が異なるなんてこともあるかもしれません
そこは、開発元を信頼するしかないですね
今後は、Manifestに追加したパーミッションがDangerous Permissionsか意識して、アプリの作成をしていきたいと思います
火曜日担当:poppy
admin at 2016年12月06日 10:00:06