- Android permissions
- До Android 6
- Android 6
- Манифест
- Всегда проверяйте разрешение
- Don’t ask again
- Объяснение для пользователя
- Группы
- Android 6 и targetSdkVersion 23
- Permission Denial with Contacts in Android
- 4 Answers 4
- Add android.permission.CALL_PRIVILEGED in contacts has the error
- 2 Answers 2
- Not the answer you’re looking for? Browse other questions tagged android contacts or ask your own question.
- Related
- Hot Network Questions
- Subscribe to RSS
- Permission Denial: opening provider com.android.providers.contact.Contacts Provider2 from ProcessRecord. #42
- Comments
- faisalbasha1982 commented Jan 8, 2019
- pbthakre commented Jan 9, 2019
- faisalbasha1982 commented Jan 9, 2019
- faisalbasha1982 commented Jan 9, 2019
- pbthakre commented Jan 9, 2019
- Vignesh9291 commented Jan 11, 2019 •
- ekoooo commented Jan 18, 2019
- HowardTangHw commented Jan 23, 2019
- aashirMIQ commented Dec 27, 2019
Android permissions
Операционная система Android устроена таким образом, что для выполнения некоторых операций или доступа к определенным ресурсам, приложение должно иметь разрешение на это.
Разрешения могут быть двух типов: normal и dangerous. Отличие между ними в том, что dangerous разрешения опасны, т.к. могут быть использованы для получения ваших личных данных или информации о вас, или еще каким-то способом могут навредить вам. Примеры dangerous разрешений — это доступ к контактам или смс.
Полный список существующих разрешений можно посмотреть здесь. Характеристика Protection level подскажет насколько опасно это разрешение. А здесь можно сразу просмотреть весь список normal разрешений.
Если приложению необходимо получить какое-либо разрешение, то оно должно быть указано в AndroidManifest.xml, в корневом теге . Тег разрешения — .
Вот пример манифеста с разрешениями:
Здесь мы указываем, что приложению понадобятся разрешения на работу с интернет, контактами, bluetooth, локацией, камерой и смс. Пользователю необходимо будет подтвердить, что он предоставляет приложению эти разрешения.
В этом материале мы подробно рассмотрим, как происходит это подтверждение.
До Android 6
До выхода Android 6 все было просто и легко. Когда пользователь устанавливал приложение с манифестом, который мы рассмотрели чуть выше, то он видел такой экран:
Система показывает разрешения, которые были прописаны в манифесте. Сначала те, которые могут быть опасными с точки зрения приватности (отправка смс, доступ к камере/местоположению/контактам), а затем — обычные (интернет, bluetooth).
Таким образом пользователь видит, на что претендует приложение, и может примерно понять все ли в порядке. Если, например, приложение калькулятор при установке просит у вас доступ к контактам и смс, то скорее всего, что-то не так с этим приложением и оно может быть опасным для ваших данных.
Нажав кнопку Install, пользователь автоматически подтверждает свое согласие, что приложению будут предоставлены эти запрашиваемые разрешения. И далее, когда приложение, например, пытается в коде получить список контактов, то оно без проблем их получает.
Если же в манифесте не указать разрешение READ_CONTACTS, то его не будет и в списке тех разрешений, которые подтверждает пользователь. Соответственно, система не предоставит этому приложению доступ к контактам. И при попытке получить список контактов, будет ошибка:
java.lang.SecurityException: Permission Denial: opening provider com.android.providers.contacts.ContactsProvider2
Android 6
С выходом Android 6 механизм подтверждения поменялся. Теперь при установке приложения пользователь больше не видит списка запрашиваемых разрешений. Приложение автоматически получает все требуемые normal разрешения, а dangerous разрешения необходимо будет программно запрашивать в процессе работы приложения.
Т.е. теперь недостаточно просто указать в манифесте, что вам нужен, например, доступ к контактам. Когда вы в коде попытаетесь запросить список контактов, то получите ошибку SecurityException: Permission Denial. Потому что вы явно не запрашивали это разрешение, и пользователь его не подтверждал.
Перед выполнением операции, требующей разрешения, необходимо спросить у системы, есть ли у приложения разрешение на это. Т.е. подтверждал ли пользователь, что он дает приложению это разрешение. Если разрешение уже есть, то выполняем операцию. Если нет, то запрашиваем это разрешение у пользователя.
Давайте посмотрим, как это выглядит на практике.
Проверка текущего статуса разрешения выполняется методом checkSelfPermission
На вход метод требует Context и название разрешения. Он вернет константу PackageManager.PERMISSION_GRANTED (если разрешение есть) или PackageManager.PERMISSION_DENIED (если разрешения нет).
Если разрешение есть, значит мы ранее его уже запрашивали, и пользователь подтвердил его. Можем получать список контактов, система даст нам доступ.
Если разрешения нет, то нам надо его запросить. Это выполняется методом requestPermissions. Схема его работы похожа на метод startActivityForResult. Мы вызываем метод, передаем ему данные и request code, а ответ потом получаем в определенном onResult методе.
Добавим запрос разрешения к уже имеющейся проверке.
Проверяем разрешение READ_CONTACTS. Если оно есть, то читаем контакты. Иначе запрашиваем разрешение READ_CONTACTS методом requestPermissions. На вход метод требует Activity, список требуемых разрешений, и request code. Обратите внимание, что для разрешений используется массив. Т.е. вы можете запросить сразу несколько разрешений.
После вызова метода requestPermissions система покажет следующий диалог
Здесь будет отображено разрешение, которое мы запросили методом requestPermissions. Пользователь может либо подтвердить его (ALLOW), либо отказать (DENY). Если будет запрошено сразу несколько разрешений, то на каждое из них будет показан отдельный диалог. И пользователь может какие-то разрешения подтвердить, а какие-то нет.
Решение пользователя мы получим в методе onRequestPermissionsResult
Проверяем, что requestСode тот же, что мы указывали в requestPermissions. В массиве permissions придут название разрешений, которые мы запрашивали. В массиве grantResults придут ответы пользователя на запросы разрешений.
Мы проверяем, что массив ответов не пустой и берем первый результат из него (т.к. мы запрашивали всего одно разрешение). Если пользователь подтвердил разрешение, то выполняем операцию. Если же пользователь отказал, то дальнейшие действия зависят от логики вашего приложения.
В итоге схема получения разрешения состоит из трех действий:
— проверка текущего состояния разрешения
— запрос на получение разрешения, если оно еще не было получено
— обработка ответа на запрос
Далее поговорим про некоторые дополнительные возможности, нюансы и прочие мелочи.
Манифест
При использовании новой схемы разрешений вам все равно необходимо указывать разрешение в манифесте. Если его там не указать и сделать запрос на это разрешение, то вам просто сразу придет отказ без всякого диалога.
Всегда проверяйте разрешение
Каждый раз (а не только первый) перед выполнением операции, требующей определенного разрешения, необходимо проверять, что это разрешение есть. Потому что, даже если пользователь уже давал это разрешение, он всегда может зайти в настройки приложения и отменить его. И если вы после этого не выполните проверку, то получите ошибку при выполнении операции.
Don’t ask again
Когда вы первый раз делаете запрос на какое-либо разрешение, пользователь может отказать. При последующих запросах этого же разрешения, в диалоге появится чекбокс Don’t ask again
Если пользователь включит этот чекбокс, то при последующих ваших запросах диалог не будет отображаться, а в onRequestPermissionsResult сразу будет приходить отказ.
Объяснение для пользователя
Когда вы запрашиваете разрешение, пользователю должно быть очевидно, зачем приложению понадобилось это разрешение, и у него не должно возникать вопросов. Но случаи бывают разные, и вы можете решить, что вам надо явно объяснить пользователю, почему приложению понадобилось это разрешение.
Диалог, который показывается при запросе разрешения, — системный, вы не можете менять его содержимое и добавлять туда свой текст. Но вы можете сделать свой диалог или что-то подобное и показать его перед тем, как будете делать запрос разрешения.
Есть метод shouldShowRequestPermissionRationale, который может быть полезен в данной ситуации. Передаете ему название разрешения, а он вам в виде boolean ответит, надо ли показывать объяснение для пользователя.
Т.е. вы сначала проверяете наличие разрешения. Если его нет, то вызываете shouldShowRequestPermissionRationale, чтобы решить, надо ли показывать объяснение пользователю. Если не надо, то делаете запрос разрешения. А если надо, то показываете ваш диалог с объяснением, а после этого диалога делаете запрос разрешения.
Алгоритм работы метода shouldShowRequestPermissionRationale прост.
Если вы еще ни разу не запрашивали это разрешение, то он вернет false. Т.е. перед первым запросом разрешения ничего объяснять не надо.
Если вы ранее уже запрашивали это разрешение и пользователь отказал, то метод вернет true. Т.е. пользователь не понимает, почему он должен давать это разрешение, и надо ему это объяснить.
Если пользователь ставил галку Don’t ask again, то метод вернет false. Запрос полномочий все равно не будет выполнен. Объяснять что-то не имеет смысла.
Разумеется, вы можете показывать дополнительную информацию согласно вашим правилам и не использовать метод shouldShowRequestPermissionRationale.
Группы
Dangerous разрешения собраны в группы. Список групп можно посмотреть здесь. Если вы запросили одно разрешение из группы и пользователь предоставил вам его, то вы автоматически получаете все разрешения этой группы.
Например, разрешения READ_CONTACTS и WRITE_CONTACTS принадлежат группе CONTACTS. И если пользователь уже подтверждал разрешение на READ_CONTACTS, то при проверке WRITE_CONTACTS вы получите PERMISSION_GRANTED.
Android 6 и targetSdkVersion 23
Схема работы разрешений зависит от версии Android, на которой запущено приложение и от параметра targetSdkVersion приложения.
Новая схема будет работать, если версия Android >= 6 И targetSdkVersion >= 23.
В остальных случаях, т.е. когда targetSdkVersion
Присоединяйтесь к нам в Telegram:
— в канале StartAndroid публикуются ссылки на новые статьи с сайта startandroid.ru и интересные материалы с хабра, medium.com и т.п.
— в чатах решаем возникающие вопросы и проблемы по различным темам: Android, Kotlin, RxJava, Dagger, Тестирование
— ну и если просто хочется поговорить с коллегами по разработке, то есть чат Флудильня
— новый чат Performance для обсуждения проблем производительности и для ваших пожеланий по содержанию курса по этой теме
Источник
Permission Denial with Contacts in Android
I’m trying to access the contacts and display them, but it won’t let me, it denies me access. i already read others answsers in this website but still with the error. I already gave the permissions in a properly way.
this is the code:
This is the Manifest file:
4 Answers 4
Assuming you are using Android Studio, check your gradle.build file and see what version of Android you are targeting.
If it is 23 then you need to use the new Marshmallow permissions system.
If you set the TARGET to 21 and lower it will use the now older manifest declared permission system, which asks the user on App Install for all permissions at once. This will work on Android 6 devices too.
I would encourage you to work to the former rather than the latter, as this is the newer method of requesting permissions.
What version of Android is this run on? In Android 6.0 you have to request permissions in code. You can check if this is the problem looking for this application in phone settings and giving it permissions it needs manually.
With Android 6.0 the permission model has changed, now you need to ask the user for permission at Run time . Look at this google sample which explains how to request for Contact permissions here. Read through this developer notes here.
If you are running for Android API version less than 23 then the older way which you have listed works. For anything above and equal to API version 23, you need to request Permission at Run time.
There are two types of permission defined from API version 23, one with PROTECTION_NORMAL and one without. The PROTECTION_NORMAL permissions still work the old way example accessing network state and Internet, which do not do much Harm. Check here
Источник
Add android.permission.CALL_PRIVILEGED in contacts has the error
It has the android.permission.CALL_PRIVILEGED in contacts of android4.0.4. But it still has the error:
I have modified Contacts and repack and signature, then install apk. When I dial it has the error.
I also add in AndroiManifest.xml Application.
This is the related code:
Who knows the reason? Thanks in advance!
2 Answers 2
Please delete your apk from /system/app and /data/app, and then use adb shell pm clear com.android.contacts to clean the data, finally use adb push command to install your apk. Good luck.
android.permission.CALL_PRIVILEGED is not available to 3rd party developers. It’s used internally by system apps like the dialler.
This would work if you had a rooted phone and the user installed your app as a System app.
See here for more information
Not the answer you’re looking for? Browse other questions tagged android contacts or ask your own question.
Related
Hot Network Questions
Subscribe to RSS
To subscribe to this RSS feed, copy and paste this URL into your RSS reader.
site design / logo © 2021 Stack Exchange Inc; user contributions licensed under cc by-sa. rev 2021.12.3.40888
By clicking “Accept all cookies”, you agree Stack Exchange can store cookies on your device and disclose information in accordance with our Cookie Policy.
Источник
Permission Denial: opening provider com.android.providers.contact.Contacts Provider2 from ProcessRecord. #42
Comments
faisalbasha1982 commented Jan 8, 2019
Hi, I have Permission Denial error and it suggests me to add, android.permission.READ_CONTACTS or WRITE_CONTACTS into androidManifest.xml file. Even after adding those permissions in the androidManifest file, I am getting the same permission Denial error. Please help.
The text was updated successfully, but these errors were encountered:
pbthakre commented Jan 9, 2019
faisalbasha1982 commented Jan 9, 2019
Issue is solved by setting the permissions on the android phone manually via settings page. This is I heard should be manually enabled for debug-app.apk and not for the release mode apk.
faisalbasha1982 commented Jan 9, 2019
Issue is solved by setting the permissions on the android phone manually via settings page. This is I heard should be manually enabled for debug-app.apk and not for the release mode apk.
pbthakre commented Jan 9, 2019
Issue is solved by setting the permissions on the android phone manually via settings page. This is I heard should be manually enabled for debug-app.apk and not for the release mode apk.
yes I also resolved it doing same.
Vignesh9291 commented Jan 11, 2019 •
I also had the same issue. For Release mode apk also doesn’t work. I have to manually set the permission to access the contacts since app does not show access permission popup. Please help me!
ekoooo commented Jan 18, 2019
HI, you can use react-native-permissions check and request contacts permission first. then it is normal.
HowardTangHw commented Jan 23, 2019
On android you must request permissions beforehand
aashirMIQ commented Dec 27, 2019
On android you must request permissions beforehand
Great man but on deny the permission alert my app getting crash, do you know how can I resolve this issue.
Источник