しがないエンジニアのブログ

技術的な内容をメモ代わりにつらつら

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;
    }
}


参考サイト