Подтвердить что ты не робот

CheckSelfPermission возвращает PERMISSION_GRANTED для отозванного разрешения с targetSdkVersion <= 22

Я изучаю новую модель разрешения Android Marshmallow, но я столкнулся с проблемой, которую я нахожу странной.

Приложение с targetSdkVersion 22 (так еще не использующее новую модель разрешения Android Marshmallow) объявляет разрешение READ_CONTACTS в манифесте:

<uses-permission android:name="android.permission.READ_CONTACTS" />

и попытается прочитать номер телефона контакта через Intent.ACTION_PICK:

Intent intent = new Intent(Intent.ACTION_PICK);
intent.setType(ContactsContract.CommonDataKinds.Phone.CONTENT_TYPE);
startActivityForResult(intent, PICK_CONTACT_REQUEST);

При запуске на устройстве с Marshmallow MRA58K после отмены разрешения после установки приложения через ADB метод ContextCompat.checkSelfPermission() по-прежнему возвращает PERMISSION_GRANTED, но после этого происходит сбой при доступе к контактам, поскольку курсор без записей возвращается. Как я понял, это стандартная стратегия "ретросопротивления", чтобы избежать аварийного приложения.

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == PICK_CONTACT_REQUEST && resultCode == Activity.RESULT_OK) {
        Log.i("", "Permission granted: " + (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS) == PackageManager.PERMISSION_GRANTED));
        Uri contactUri = data.getData();
        Cursor c = null;
        try {
            c = getContentResolver().query(contactUri, new String[]{ContactsContract.CommonDataKinds.Phone.NUMBER}, null, null, null);
            if (c != null && c.moveToFirst()) {
                Log.i("", "got phone number: " + c.getString(0));
            } else {
                Log.w("", "No data received");
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (c != null) {
                c.close();
            }
        }
    } else {
        super.onActivityResult(requestCode, resultCode, data);
    }
}

Как я могу безопасно определить, явно ли пользователь перед разрешением, прежде чем пытаться выполнить операцию?

Я также попробовал официальный образец Google в https://github.com/googlesamples/android-RuntimePermissions, установив targetSdkVersion to 22 с тем же результатом: он регистрирует, что разрешение предоставляется, даже если пользователь отменил его, ant, после чего операция завершится с ошибкой.

Спасибо;)

4b9b3361

Ответ 2

Чтобы использовать новые модели разрешений (и проверять, имеет ли ваше приложение разрешение или нет), вам необходимо обновить целевой SDK до 23. Не имеет смысла держать цель 22.