Разрешение READ_CONTACTS не работает, если я не выключаю и не включаю его вручную на Android SDK 23+ - PullRequest
0 голосов
/ 19 февраля 2019

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

Ниже приведен код для запроса разрешения на чтение_контактов:

  public void requestPermissionOrShowRationale(Permission permission) {
    if (ActivityCompat.shouldShowRequestPermissionRationale(this, permission.permission)) {
        PermissionRationaleDialogFragment dialogFragment =
                PermissionRationaleDialogFragment.newInstance(permission);

        dialogFragment.show(getSupportFragmentManager(), FRAGMENT_TAG_RATIONALE);
    } else {
        requestPermission(permission);
    }
}

public void requestPermission(Permission permission) {
    Timber.i("Requesting permission: " + permission.permission);
    ActivityCompat.requestPermissions(this, new String[] { permission.permission }, permission.requestCode);
}

   public enum Permission {
         READ_CONTACTS(
            Manifest.permission.READ_CONTACTS,
            PERMISSIONS_REQUEST_READ_CONTACTS,
            R.string.permission_contacts_rationale_title,
            R.string.permission_contacts_rationale_message
    ),
    WRITE_CONTACTS(
            Manifest.permission.WRITE_CONTACTS,
            PERMISSIONS_REQUEST_WRITE_CONTACTS,
            R.string.permission_contacts_rationale_title,
            R.string.permission_contacts_rationale_message
    );

и вызов разрешения из действия, как показано ниже:

  private void checkAndRequestPermissions() {
    if (!hasPermission(Permission.READ_CONTACTS)) {
        requestPermissionOrShowRationale(Permission.READ_CONTACTS);
    }
}

Все работает нормально, когда я использую targetdk 23. После изменения targetdk до 26 или выше разрешение не работает,если я не выключу и не включу его вручную в настройках разрешений приложения для получения контактов.

Ответы [ 2 ]

0 голосов
/ 20 февраля 2019

В более ранней версии Android существовала «ошибка», из-за которой, когда вы запрашиваете одно разрешение в группе, вы автоматически получаете всю группу.

Так что, если вашему приложению требуется READ_CONTACTS + WRITE_CONTACTS, егобыло бы достаточно запросить разрешение READ_CONTACTS, чтобы получить и то, и другое.Начиная с Android SDK 26 это было исправлено, чтобы лучше отражать документацию, поэтому вам нужно запросить все разрешения, которые вас интересуют, чтобы получить их, поэтому кусок кода:

new String[] { permission.permission }

должно иметь:

new String[] { Manifest.permission.READ_CONTACTS, Manifest.permission.WRITE_CONTACTS }

(как реализовать это с вашей enum вещью, которая у вас есть, зависит от вас)

0 голосов
/ 19 февраля 2019

Супер простое и лучшее решение, которое я нашел для моего вопроса, это TedPermission https://github.com/ParkSangGwon/TedPermission

Я удалил все существующие коды для разрешения и использовал приведенный ниже магический код:)

  setLayout(R.layout.welcome);
    TedPermission.with(this)
            .setPermissionListener(permissionlistener)
            .setPermissions(Manifest.permission.READ_CONTACTS, Manifest.permission.WRITE_CONTACTS)
            .setDeniedMessage("This permission is required to show Contact Pictures and Email Address Suggestions.\n\nPlease turn on this permissions at [Setting] > [Permission]")
            .check();

   PermissionListener permissionlistener = new PermissionListener() {
    @Override
    public void onPermissionGranted() {


        }

    }

    @Override
    public void onPermissionDenied(ArrayList<String> deniedPermissions) {
        Toast.makeText(WelcomeMessage.this, "Permission Denied\n" + deniedPermissions.toString(), Toast.LENGTH_SHORT).show();
    }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...