Android M で導入されるRuntime Permissionsのサンプルアプリを、カメラへのアクセス権限に絞って要約します。
https://github.com/googlesamples/android-RuntimePermissions
AndroidManifest.xml
<uses-permission android:name="android.permission.CAMERA"/>
カメラへのアクセス権限を要求しています。
上記の記述でMNC未満の端末はインストール時に権限が与えられますが、これに加えてAndroid Mでは、実行時に権限の有無をチェックし、無ければユーザに権限を要求しなければいけません。
権限チェック
if (PermissionUtil.hasSelfPermission(this, Manifest.permission.CAMERA)) {
//権限あり
showCameraPreview();
} else {
//権限なし
requestPermissions(new String[]{Manifest.permission.CAMERA}, REQUEST_CAMERA);
}
カメラへのアクセス権限をチェックして、権限がなければ Activty#requestPermissions
を呼び出して権限を要求します。このメソッドの呼び出で、次のようなダイアログが表示されます。
requestPermissions
の結果処理
上記のダイアログにユーザが回答すると、Activity#onRequestPermissionsResult
が呼び出されます。
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
if (requestCode == REQUEST_CAMERA) {
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// 「許可」が押下された
} else {
// 「許可しない」が押下された
}
} else {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
}
権限がない場合に発生する例外
Camera c = null;
try {
c = Camera.open(cameraId); // attempt to get a Camera instance
} catch (Exception e) {
//Camera is not available
}
カメラへのアクセス権限がない状態でCamera.open
を実行すると例外が発生します。
権限があれば問題なくカメラにアクセスできます。
権限チェックメソッド
public static boolean hasSelfPermission(Activity activity, String permission) {
if (!isMNC()) {
return true;
}
return activity.checkSelfPermission(permission) == PackageManager.PERMISSION_GRANTED;
}
Android M未満の端末はインストール時に権限が与えられるので常にtrue
を返します。
Android M以上ならActivity#checkSelfPermission
でチェックした結果を返します。
アプリの権限設定画面
設定→アプリ→アプリ情報→許可 と進んだ画面で権限をON/OFFできます。