Learn to Live and Live to Learn

IT(たまにビジネス)に関する記事を読んで、考えて、使ってみたことをまとめる場。

Android M パーミッション対応

Android 6 Marshmallowからパーミッションの取得タイミングが変わった

これまでGoogle Playでのインストール時に全てのパーミッションを要求されていました。
皆さんの中にも「このパーミッションは何に使われてるの?」と疑問に思われたことのある方や、「使わない機能で必要なパーミッションを求められている」と感じたことのある方がいらっしゃるのではないでしょうか。
Android 6(APIレベル23)以降ではそんな気がかりはなくなります。
Google Playでは何もせず、それぞれのパーミッションが必要なタイミングで要求できる(される)ようになります。

実装

実装方法はこんな感じです。(ちょっとややこしくなった感)

AndroidManifest.xml

<!-- RECORD_AUDIO=マイクのパーミッションを例とする -->
<uses -permission android:name="android.permission.RECORD_AUDIO" />

MainActivity.java

...
private static final int REQUEST_CODE = 1;
...
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    // 権限がない時
    if (PermissionChecker.checkSelfPermission(this, Manifest.permission.RECORD_AUDIO) != PackageManager.PERMISSION_GRANTED) {

        // 許可ダイアログの再表示判定
        if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.RECORD_AUDIO) {
            new AlertDialog.Builder(this)
                .setTitle("パーミッションの追加説明")
                .setMessage("このアプリで○○するにはマイクのパーミッションが必要です。")
                .setPositiveButton("設定" new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        // パーミッションを要求する
                        ActivityCompat.requestPermissions(MainActivity.this,
                            new String[]{Manifest.permission.RECORD_AUDIO},
                            REQUEST_CODE);
                    }
                })
                .create()
                .show();
            return;
        }

        // 一度もパーミッションの要求をしていない or 今後表示しないにチェックをした上で”許可しない”にした時
        // 今後表示しないにしている場合はrequestPermissionsしても何も起こらないので、実質初回パーミッション要求時の対応
        // 初回とは初回起動という意味ではなく、パーミッションのON/OFF切り替え時も含まれる
        ActivityCompat.requestPermissions(this,
            new String[]{Manifest.permission.RECORD_AUDIO},
            REQUEST_CODE);
        }
    }
}

@Override
// パーミッション要求の結果を受け取る
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    if (requestCode == REQUEST_CODE) {
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                // パーミッションが必要な処理
            } else {
                // パーミッションが得られなかった場合の対応
            }
        }
    }
}
...

参考になるサイト

システム パーミッションの使用 | Android Developers
CheckSelfPermissionの注意事項 - リスクファインダーブログ
初心者のためのM Permissions入門 | TechBooster