Android не показывает диалоговое окно запроса разрешения для READ_CONTACT WRITE_CONTACTS - PullRequest
0 голосов
/ 13 ноября 2018

Я следовал рекомендациям Android по запросу разрешений для устройств Android с VERSION.M и выше, а именно (разрешения времени выполнения), но диалоговое окно запроса разрешения не отображается, вместо этого разрешение автоматически отклоняется.

Я запрашиваю у пользователей разрешение на ЧТЕНИЕ / ЗАПИСЬ КОНТАКТОВ, а также другие разрешения, указанные в моем манифесте ниже.

Приложение запрашивает другие разрешения, такие как доступ к файлам, телефону, SMS, но не запрашиваетразрешение на чтение контактов.

Вот мой файл манифеста

<uses-permission
    android:name="android.permission.AUTHENTICATE_ACCOUNTS"
    tools:remove="android:maxSdkVersion"/>

<uses-permission
    android:name="android.permission.GET_ACCOUNTS"
    tools:remove="android:maxSdkVersion"/>

<uses-permission android:name="android.permission.RECEIVE_SMS" />
<uses-permission android:name="android.permission.RECEIVE_MMS" />
<uses-permission android:name="android.permission.READ_SMS" />
<uses-permission android:name="android.permission.SEND_SMS" />
<uses-permission android:name="android.permission.WRITE_SMS" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="Manifest.permission.READ_CONTACTS"
    tools:remove="android:maxSdkVersion"/>
<uses-permission android:name="Manifest.permission.WRITE_CONTACTS"
    tools:remove="android:maxSdkVersion"/>
<uses-permission android:name="Manifest.permission.CONTACTS"/>

<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" />
<uses-permission android:name="android.permission.READ_CALL_STATE" />

<!-- For sending/receiving events -->
<uses-permission android:name="android.permission.WRITE_CALENDAR" />
<uses-permission android:name="android.permission.READ_CALENDAR" />
<uses-permission android:name="android.permission.CALL_PHONE" />
<uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
<uses-permission android:name="android.permission.RAISED_THREAD_PRIORITY" />
<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />

<!-- Normal -->
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />

<!-- So we can add a TextSecure 'Account' -->
<uses-permission android:name="android.permission.READ_SYNC_SETTINGS" />
<uses-permission android:name="android.permission.USE_CREDENTIALS" />

<!-- For conversation 'shortcuts' on the desktop -->
<uses-permission android:name="android.permission.INSTALL_SHORTCUT" />
<uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT" />

<!-- For fixing MMS -->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />

<uses-feature
    android:name="android.hardware.microphone"
    android:required="false" />
<uses-feature
    android:name="android.hardware.wifi"
    android:required="false" />
<uses-feature
    android:name="android.hardware.portrait"
    android:required="false" />
<uses-feature
    android:name="android.hardware.touchscreen"
    android:required="false" />

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_SYNC_SETTINGS" />
<uses-permission android:name="com.google.android.providers.gsf.permmission.READ_GSERVICES" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission
    android:name="android.permission.BROADCAST_WAP_PUSH"
    tools:ignore="ProtectedPermissions" />

<uses-feature
    android:name="android.hardware.camera"
    android:required="true" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

Вот мой явный блок запроса разрешения на чтение

private void loadDeviceContactsOnAndroid_M() {

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        if (checkSelfPermission(Manifest.permission_group.CONTACTS) == PackageManager.PERMISSION_GRANTED) {
            Log.e(getClass().getSimpleName(), "Read contacts permission granted");
            loadAndDisplayConfiguredRecipients();
        } else {
            Log.e(getClass().getSimpleName(), "Read contacts permission Not granted");

            if (shouldShowRequestPermissionRationale(Manifest.permission_group.CONTACTS)) {
                Toast.makeText(getApplicationContext(), "mPHR messaging feature requires your contacts", Toast.LENGTH_LONG).show();
            }

            ActivityCompat.requestPermissions(this,new String[]{Manifest.permission_group.CONTACTS}, 101);
        }
    } else
        Toast.makeText(getApplicationContext(), "Android Version is " + Build.VERSION.SDK_INT, Toast.LENGTH_LONG).show();
}

Вот мой метод обратного вызова onRequestPermissionResult

@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    if (requestCode == 101) {
        if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            Toast.makeText(this, "Hurray permission granted ", Toast.LENGTH_SHORT).show();
        } else {
            Toast.makeText(this, "Until you grant the permission, we cannot display the names", Toast.LENGTH_SHORT).show();
        }
    }
}

Вот мой блок методов загрузки контактов

Cursor cursor = contactController.querySystemContacts("");
    if (cursor.moveToFirst()) {
        do {
            String name = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
            messageRecipients.add(name);
        } while (cursor.moveToNext());
    }

    cursor.close();

Приложение не запрашивает у пользователя разрешение на контакты, и когда я обхожу это и пытаюсь пойти дальше и получить доступ к контакту на устройствеЯ получаю ошибку безопасности, которой отказано в разрешении;

java.lang.SecurityException: Permission Denial: opening provider com.android.providers.contacts.ContactsProvider2 from ProcessRecord{13c53b7 14017:my/app/package/name/u0a183} 

(pid=159017, uid=10183) 

requires android.permission.READ_CONTACTS or android.permission.WRITE_CONTACTS

Я запущентестирование на физических устройствах Android 8.

Когда я использую тот же код, скажем, ACCESS_COARSE_LOCATION_PERMISSION, он отлично работает, но не работает, когда я использую READ_CONTACT или WRITE_CONTACTS

Ответы [ 2 ]

0 голосов
/ 14 ноября 2018

Вы можете запросить разрешение на запуск приложения или время выполнения, когда вам нужно его использовать.Попробуйте эту библиотеку (https://github.com/nabinbhandari/Android-Permissions).. Она предоставляет вам множество опций, например, когда пользователь отклоняет или предоставляет разрешение, а также вы можете запросить несколько разрешений.

Пример

Одно разрешение

Permissions.check(this/*context*/, Manifest.permission.READ_CONTACTS, null, new PermissionHandler() {
@Override
public void onGranted() {
    // do your task.
}});

несколько разрешений

String[] permissions = {Manifest.permission.READ_CONTACTS, Manifest.permission.WRITE_EXTERNAL_STORAGE};Permissions.check(this/*context*/, permissions, null/*rationale*/, null/*options*/, new PermissionHandler() {
@Override
public void onGranted() {
    // do your task.
}});

ПРИМЕЧАНИЕ Использование библиотек не является хорошимпрактиковаться, если они не в хорошем состоянии

0 голосов
/ 13 ноября 2018

Я не пробовал ваш код, но, пожалуйста, не используйте checkSelfPermission напрямую. Вместо этого используйте метод ContextCompat.checkSelfPermission, как рекомендует Google.

if (ContextCompat.checkSelfPermission(thisActivity, Manifest.permission.WRITE_CALENDAR)
    != PackageManager.PERMISSION_GRANTED) {
    // Permission is not granted
}

https://developer.android.com/training/permissions/requesting#java

Когда я добавлял код для проверки разрешений, я выполнял проверку разрешений по отдельности, что означает, что я проверял разрешение по одному, а не проверял группу разрешений. Поэтому я попробую это позже. Но сейчас попробуйте использовать метод ContextCompat.

EDIT:

Пожалуйста, не запрашивайте разрешения группы. Модель запроса разрешения в Android M предназначена только для индивидуального разрешения. Итак, вот что вы можете сделать.

private void checkPermission() {
    if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED
            || ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_CONTACTS) != PackageManager.PERMISSION_GRANTED) {
        if (ActivityCompat.shouldShowRequestPermissionRationale(this,
                Manifest.permission.READ_CONTACTS) || ActivityCompat.shouldShowRequestPermissionRationale(this,
                Manifest.permission.WRITE_CONTACTS)) {
            Toast.makeText(this, "Necessary permissions are not granted",
                    Toast.LENGTH_LONG).show();
        } else {
            ActivityCompat.requestPermissions(this,
                    new String[]{Manifest.permission.READ_CONTACTS, Manifest.permission.WRITE_CONTACTS},
                    MY_PERMISSIONS_REQUEST_CODE);
        }
    } else {
        // Permission has already been granted
    }
}

EDIT:

Пожалуйста, не используйте в своем манифесте следующее.

<uses-permission android:name="Manifest.permission.READ_CONTACTS"
    tools:remove="android:maxSdkVersion"/>
<uses-permission android:name="Manifest.permission.WRITE_CONTACTS"
    tools:remove="android:maxSdkVersion"/>
<uses-permission android:name="Manifest.permission.CONTACTS"/>

Вы можете просто заменить их на следующие.

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