Android 5.1(SDK 22)まではGoogle Play Storeからダウンロード時にそのアプリを実行するために必要なパーミッションをユーザに全て確認させていたが、Android 6.0からはアプリ実行時に必要なパーミッションを確認させるように変更された。
同時にアプリダウンロード後もユーザの判断によってアプリで必要なパーミッションを取り消すことができるようになった。(設定->アプリケーション)
これによってパーミッションを取り消されたアプリでは本来の動作ができず、アプリが例外を起こしてしまう。そのためアプリ制作者はAndroid 6.0以降に対応するためパーミッションが必要な処理を行う際に許可されているか確認する処理を実装する必要がある。
※ targetSdkVersionを22以下にすることによってAndroid 6.0でもダウンロード時に確認させることは可能
Install Time Permission から Runtime Permission への変更
Install Time Permission
Google Playからのダウンロード時にアプリが要求しているパーミッション全てを許可するか確認する方式
Android 5.1以前はこの方式
ダウンロード時に許可されるので実行後に権限関係の処理は必要ない。Runtime Permission
アプリ実行時に必要なパーミッションを個別に許可するか確認する方式
Android 6.0以降はこの方式
実行時に権限を確認するため、個別にパーミッションが許可されているか確認する必要がある。
Android 6.0でパーミッションの許可を実装
カメラのパーミッションが許可されているか確認し、許可されてなければユーザにリクエストします。
if (checkSelfPermission(Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
// 権限がない場合はリクエスト
requestPermissions(new String[]{Manifest.permission.CAMERA}, PERMISSIONS_REQUEST_CAMERA_STATE);
} else {
// 権限がある場合は後続処理を実装
}
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
if (MY_PERMISSIONS_REQUEST_READ_PHONE_STATE == requestCode) {
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// カメラのパーミッションが許可された場合、後続処理を実装
} else {
// カメラのパーミッションが拒否された場合、
// カメラを起動せずダイアログを表示するなどの処理を実装
}
}
}