ポーラ・ペレス:
私は起動時に3つの権限を必要とAndroidアプリを開発しています。私がいない場合は許可が必須として、アプリがクラッシュし、ダイアログでの応答へのユーザーまで待たなければなりません。
これらのアクセス許可を求めるための正しい方法は何ですか?私はコードの下に書きましたが、(いずれかの拒否または受諾)最初の許可を応答するときにアプリがフリーズします。
ここで私が作ったものです。
String[] perms = {"Manifest.permission.READ_PHONE_STATE", "Manifest.permission.ACCESS_COARSE_LOCATION","Manifest.permission.CALL_PHONE"};
int result1 = ContextCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.READ_PHONE_STATE);
int result2 = ContextCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.ACCESS_COARSE_LOCATION);
int result3 = ContextCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.CALL_PHONE);
if ((result1 == PackageManager.PERMISSION_GRANTED) && (result2 == PackageManager.PERMISSION_GRANTED) && (result3 == PackageManager.PERMISSION_GRANTED)) {
onPermissionGranted();
} else {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
requestPermissions(perms, PERMISSION_REQUEST_CODE);
} else {
ActivityCompat.requestPermissions(this, perms, PERMISSION_REQUEST_CODE);
}
}
@Override
public void onRequestPermissionsResult(int requestCode,
String permissions[], int[] grantResults) {
switch (requestCode) {
case PERMISSION_REQUEST_CODE: {
// If request is cancelled, the result arrays are empty.
if (grantResults.length > 0
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
onPermissionGranted();
// permission was granted, yay! Do the
// contacts-related task you need to do.
} else {
Toast.makeText(MainActivity.this, R.string.permission_required, Toast.LENGTH_LONG).show();
// permission denied, boo! Disable the
// functionality that depends on this permission.
}
return;
}
// other 'case' lines to check for other
// permissions this app might request
}
}
Ffrthysn:
ブロックする必要がでいずれか、ありませんThread#sleep
許可要求が非同期であるとして、またはwhileループで。ここにあなたの活動が流れるべき方法は次のとおりです。
まず、実行するために権限を必要とロジックを定義します。
private void onPermissionGranted() {
//code to execute
}
その後、中onCreate()
、あなたはそれらの権限を持っているかどうかを確認します。そうした場合、あなたのコードを実行します。そうしない場合は、許可を要求:
if (ContextCompat.checkSelfPermission(this,/*permissions*/) == PackageManager.PERMISSION_GRANTED) {
onPermissionGranted();
} else {
ActivityCompat.requestPermissions(this, /*permissions*/, /*request_code*/);
}
許可ステータスが更新されたとき、それはに至るまで呼び出しますonRequestPermissionsResult
。許可が与えられた場合は、ここではそれに基づいて行動。そうでない場合は、何かを行う(どちらかのダイアログを再表示または活性を終えます)。
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
switch (requestCode) {
case /*our request code from before*/: {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
onPermissionGranted();
} else {
Toast.makeText(this, "Permissions are required in order to run this app!", Toast.LENGTH_SHORT).show();
finish();
}
return;
}
}
}