前置き
Android 6.0になって、一部条件でRuntime時にPermissionの許可をユーザに行うことが必要になった。
具体的には下記を満たす場合には、Runtime時にPermissionの許可をユーザに行わないと対象機能の利用時にSecurityExceptionを起こしてしまう。
- compileSdkVersion 23 でビルド
- Android 6.0以上の端末でプレイ
- protectionLevelがdangerous以上のPermissionを必要とするアプリ
Protection Levelがdangerousかどうかは、下記サイトから一覧で確認できる。
確認方法
位置情報はdangerousに該当するPermissionであるので一例としてあげた。
- https://developer.android.com/intl/ja/reference/android/Manifest.permission.html#ACCESS_FINE_LOCATION
- https://developer.android.com/intl/ja/reference/android/Manifest.permission.html#ACCESS_COARSE_LOCATION
Code
public class MainActivity extends Activity implements ActivityCompat.OnRequestPermissionsResultCallback {
final int REQUEST_PERMISSION_CODE = 1;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// ...
String[] permissions = new String[]{ Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION };
if (!this.isPermissionGranted(permissions)) {
// まだ権限がないので権限をユーザに権限を求める
ActivityCompat.requestPermissions(this, permissions, REQUEST_PERMISSION_CODE);
} else {
// すでに権限があるのでOK (Android 6.0未満 or すでに持っている)
}
}
/**
* Permissionの利用同意結果
*/
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
if (requestCode != REQUEST_PERMISSION_CODE) {
return;
}
if (this.isPermissionGranted(permissions)) {
// パーミッション取得に同意した
} else {
// パーミッション取得に同意しなかった
}
}
private boolean isPermissionGranted(String[] permissions) {
for (String permission : permissions) {
if (ContextCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED) {
return false;
}
}
return true;
}
}
こんなかんじの雰囲気で確認できる.