Android M で導入されるRuntime Permissionsのサンプルアプリを、カメラへのアクセス権限に絞って要約します。 https://github.com/googlesamples/android-RuntimePermissions
AndroidManifest.xml
xml
<uses-permission android:name="android.permission.CAMERA"/>
カメラへのアクセス権限を要求しています。 上記の記述でMNC未満の端末はインストール時に権限が与えられますが、これに加えてAndroid Mでは、実行時に権限の有無をチェックし、無ければユーザに権限を要求しなければいけません。
権限チェック
java
if (PermissionUtil.hasSelfPermission(this, Manifest.permission.CAMERA)) {
//権限あり
showCameraPreview();
} else {
//権限なし
requestPermissions(new String[]{Manifest.permission.CAMERA}, REQUEST_CAMERA);
}
requestPermissions
の結果処理
上記のダイアログにユーザが回答すると、Activity#onRequestPermissionsResultが呼び出されます。
java
@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);
}
}
権限がない場合に発生する例外
java
Camera c = null;
try {
c = Camera.open(cameraId); // attempt to get a Camera instance
} catch (Exception e) {
//Camera is not available
}
カメラへのアクセス権限がない状態で Camera.open
を実行すると例外が発生します。 権限があれば問題なくカメラにアクセスできます。
権限チェックメソッド
java
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できます。