Получить SercurityException из READ_CONTACTS на Android ниже, чем 6,0 - PullRequest
0 голосов
/ 08 июля 2019

Fabric Crashlytics моего приложения продолжает появляться отказ в разрешении SercurityException READ_CONTACTS, когда я пытаюсь запросить контактную информацию из ContentProvider. Странная вещь заключается в том, что журналы показывают, что все эти вещи происходили на андроиде ниже, чем Marshmallow (в частности, 5.1.1), как с рутом, так и без рута, что не имеет никакого смысла, так как разрешение времени выполнения требуется только на андроиде с 6.0 и выше .

Я никогда не смогу воспроизвести проблему. Получите как тысячи журналов на ткани, и я никогда не получу настоящих журналов на всех своих устройствах, как бы я ни старался.

Операции выполняются в экземпляре Worker, который является производным от RxWorker платформы WorkerManager. Начните с функции createWork следующим образом

override fun createWork(): Single<Result> {
        if (!isContactPermissionGranted()) {
            return Single.just(Result.failure())
        }

        return Observable.create { 
            it.onNext(contactFetcher.fetchAll())
            it.onComplete()
        }
        .flatMap { // Do something with the data }
        .map { Result.success() }
        .onErrorReturn { Result.failure() }       
}

Вот функция fetchAll в contactFetcher

public ArrayList<Contact> fetchAll() throws Exception {

        String[] projectionFields = new String[]{
                ...
        };
        ...
        Cursor c = null;
        try {
            c = context.getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, projectionFields, null, null, ContactsContract.Contacts.DISPLAY_NAME);
            if (c != null && c.moveToFirst()) {
                // Do something with the return cursor...
            }
        } finally {
            if (c != null) {
                c.close();
            }
        }
        ...
}

Это журнал сбоев:

Non-fatal Exception: java.lang.SecurityException
Permission Denial: opening provider com.android.providers.contacts.ContactsProvider2 from ProcessRecord{3bd623d1 11061:vn.com/u0a175} (pid=11061, uid=10175) requires android.permission.READ_CONTACTS or android.permission.WRITE_CONTACTS

И да, я поставил <uses-permission android:name="android.permission.READ_CONTACTS" /> в своем манифесте

1 Ответ

0 голосов
/ 08 июля 2019

Пожалуйста, добавьте следующие разрешения в ваш AndroidManifest.xml

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

Следующий код Java работает на моей стороне

private ArrayList<Contacts> fetchAll() {
    ArrayList<Contacts> contacts = new ArrayList<>();
    Cursor c = null;
    try {
        c = getContentResolver().query(ContactsContract.Contacts.CONTENT_URI,
                null, null, null, ContactsContract.Contacts.DISPLAY_NAME);
        if (c != null && c.moveToFirst()) {

            do {

            }while (c.moveToNext());
        }
    } finally {
        if (c != null) {
            c.close();
        }
    }

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