Runtime Permission - Запрос разрешения для уже предоставленного разрешения - PullRequest
0 голосов
/ 26 мая 2018

Я написал приведенный ниже скрипт, чтобы получить несколько разрешений на выполнение для контактов и местоположения.Я использую два переключателя в макете для контактов и местоположений соответственно.Если я нажимаю переключатель «Контакт», он запрашивает разрешение для контактов и местоположения, как и ожидалось.Затем я вручную удалил разрешение местоположения из действия настроек «Разрешения приложения».Теперь, если я нажму на переключатель местоположения, он снова запросит контакты и местоположение.

enter image description here

У меня вопрос, поскольку я разрешил контакты вв первый раз, и я вижу, что разрешение предоставлено в действии настроек «Разрешения приложения», зачем снова запрашивать разрешение контактов?Даже я проверяю это в методе hasPermissions.

public static final int REQUEST_ID_MULTIPLE_PERMISSIONS = 1001;
String[] PERMISSIONS = {Manifest.permission.READ_CONTACTS, Manifest.permission.WRITE_CONTACTS,
        Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION};

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.basic_permissions);
    CONTACTS_ACCESS_SWITCH = (Switch) findViewById(R.id.contactsPermissionSwitch);
    LOCATION_ACCESS_SWITCH = (Switch) findViewById(R.id.locationPermissionSwitch);
    CONTACTS_ACCESS_SWITCH.setOnClickListener(requestPermissionMethod);
    LOCATION_ACCESS_SWITCH.setOnClickListener(requestPermissionMethod);
}

private void requestPermissionMethod() {
    if (!hasPermissions(BasicPermissions.this, PERMISSIONS)) {
        ActivityCompat.requestPermissions(BasicPermissions.this, PERMISSIONS, REQUEST_ID_MULTIPLE_PERMISSIONS);
    }
}

private boolean hasPermissions(Context context, String... permissions) {
    if (context != null && permissions != null) {
        for (String permission : permissions) {
            if (ContextCompat.checkSelfPermission(BasicPermissions.this, permission) != PackageManager.PERMISSION_GRANTED) {
                return false;
            }
        }
    }
    return true;
}

Файл манифеста:

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

Конфиг:

Тестирование в Android 6.0 android studio emulator device.

compileSdkVersion 27.

minSdkVersion 18

targetSdkVersion 27

Ответы [ 2 ]

0 голосов
/ 26 мая 2018

Поскольку код был написан с использованием Array, он запрашивает разрешение для всех значений в массиве, даже если он уже предоставлен.Поэтому я переписал код для использования ArrayList вместо Array.Теперь он работает отлично, как и ожидалось.

private  boolean requestPermissionMethod() {
    int permissionContacts = ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS);
    int locationPermission = ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION);
    List<String> listPermissionsNeeded = new ArrayList<>();
    if (locationPermission != PackageManager.PERMISSION_GRANTED) {
        listPermissionsNeeded.add(Manifest.permission.ACCESS_FINE_LOCATION);
    }
    if (permissionContacts != PackageManager.PERMISSION_GRANTED) {
        listPermissionsNeeded.add(Manifest.permission.READ_CONTACTS);
    }
    if (!listPermissionsNeeded.isEmpty()) {
        ActivityCompat.requestPermissions(this, listPermissionsNeeded.toArray(new String[listPermissionsNeeded.size()]),REQUEST_ID_MULTIPLE_PERMISSIONS);
        return false;
    }
    return true;
}
0 голосов
/ 26 мая 2018

Если вы запрашиваете несколько разрешений, он будет запрашивать несколько разрешений.

Если вы хотите, чтобы он запрашивал только те разрешения, которых у вас нет, вам придется проверить это самостоятельно.а затем удалите уже имеющиеся у вас разрешения из массива «РАЗРЕШЕНИЯ».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...