androidのpermission
android 6.0から、インストール時にまとめてpermissionを許可する方式から、最初は何も許可せずに使うタイミングで許可を求めさせる方式に変わった。
それについてのpermissionの求め方についてのメモ
private final int REQUEST_CODE_WRITE_EXTERNAL_STORAGE = 1; if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { if(ContextCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions( this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_CODE_WRITE_EXTERNAL_STORAGE); return; } }
許可の設定で、今後は表示しないなどとした場合は、shouldShowRequestPermissionRationale(Activity activity, String permission)
を使う。
むしろ積極的に使うべし
private final int REQUEST_CODE_WRITE_EXTERNAL_STORAGE = 1; if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { if(ContextCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { if(ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)) { Toast.makeText(this, "パーミッションがOFFになっています。", Toast.LENGTH_SHORT).show(); } else { ActivityCompat.requestPermissions( this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_CODE_WRITE_EXTERNAL_STORAGE); } return; } }
追記 20180927
shouldShowRequestPermissionRationale()
は、permissionを使う理由を説明するときに使うメソッドらしい。
なので、「パーミッションがOFFです」ではなく、「xxxの目的でパーミッションが必要です。」の説明の方が適切かも
Marshmallow でやってきたパーミッション要求まわりを1つのフラグメントにまとめてみた
requirePermissions()
が走ると、通知許可をしたかどうかで処理が分かれる。
そして、その結果をonRequestPermissionResult()
で受け取る
@Override public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults){ switch(requestCode) { case REQUEST_CODE_WRITE_EXTERNAL_STORAGE: if(grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { // 許可したときの処理 } else { // 許可しなかったときの処理 } break; default: super.onRequestPermissionsResult(requestCode, permissions, grantResults); break; } }
参考サイト
- 実行時のパーミッション リクエスト | Android Developers
- あらためてRuntime Permissionと実装方法をおさらいする
- Android6.0以上の端末で動作するGoogleMapsアプリを作成ろうとしていきなりハマったことまとめ
- Androidのパーミッションと6.0での処理の流れを今さら説明してみる
- 少し親切なRuntime Permission対応
- M Permissions対応についての簡単な記事
- 初心者のためのM Permissions入門 | TechBooster
- android - The method checkSelfPermission(Context, String) is undefined for the type ContextCompat - Stack Overflow