どのように*正しく*権限を求めるには?

ポーラ・ペレス:

私は起動時に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;
        }
    }
}

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=225362&siteId=1