- Multiple Runtime Permissions in Android Without Any Third-Party Libraries
- Learn about adding multiple runtime permissions in this step-by-step tutorial
- ParkSangGwon/TedPermission
- Easy check permission library for Android Marshmallow — ParkSangGwon/TedPermission
- Android runtime permissions. Почему, зачем и как
- Общая информация
- Взаимодействие с пользователем
Multiple Runtime Permissions in Android Without Any Third-Party Libraries
Learn about adding multiple runtime permissions in this step-by-step tutorial
This article is part of Today I Learned series and was originally posted at my TIL Github Repository and my website at wajahatkarim.com
In my current project at work, I had a task to add run time permissions in an android app whose code is very old and using legacy methods and frameworks/tools. Normally, I use Ted Permissions in all my apps for the runtime permissions and I must say that it’s one hell of an amazing library I ever saw and given the complex scenario and flow of runtime permissions in Android (thanks to Google who always makes sure to make every thing more complicated than ever), this library makes the runtime permissions like a breeze. Wonderful job Ted Park.
ParkSangGwon/TedPermission
Easy check permission library for Android Marshmallow — ParkSangGwon/TedPermission
Android introduced Runtime Permissions in API Level 23 (Android Marshmallow 6.0) or later versions. The permissions has a very complicated flow to implement as shown in the below image:
Today, when I was looking for very simple approach to do this, I was shocked to see that how Google has made this simple thing so much complicated and confusing to implement just like how they have done with Camera APIs. It took me a whole day just to add two simple runtime permissions at the start of my code. Here’s how I have done it.
IMPORTANT: You should not request all permissions at once. Rather you should request the concerning permission only at the time when its supposed to be used. I am requesting all the permissions at start because our code base is very old and complicated.
My app needed Storage and Location permissions. So, add these permissions in the Android Manifest file like this:
Now, as soon the app starts, it asks for both (Location and Storage) permissions. If both permissions are granted, then the app proceeds normally with the usual functionality. We can do it in onCreate() method of the our first Activity like the below:
Please note in the above code that I have created a String[] array which contains all the permissions we will request here. Now, let’s implement the checkAndRequestPermissions() method.
As we can see in the code above, we can check status of any permission with using ContextCompat.checkSelfPermission() method. And we can request any permission with ActivityCompat.requestPermissions() method. These methods are already included in support library.
Now, if the listPermissionsNeeded is not empty, that means that at least one or more permissions have been denied. So, requestPermissions() method will show the permission dialog and will invoke onRequestPermissionsResult() callback method
Now, here’s how the whole case goes after requesting permissions. First time, android will show the permissions normally. If all are accepted, then everything goes normally. If any one or all are denied, then it shows the explanation dialog (created by developer) to tell the user why permissions are important. And this dialog will allow the user to grant permissions again. Now, android will show the permission dialog again but this time with an extra checkbox “Never ask again”.
If any of the permission has been denied with “Never ask again” check, then that permission can only be allowed from the Settings of the app. Since my app cannot work without these permissions, so I will show another dialog which will allow the user to go to Settings screen of the app and allow to grant permissions manually.
We can do so with this another method ActivityCompat.shouldShowRequestPermissionRationale(context, permission) , which keeps the record for «Never ask again» check. If this method returns true , that means that Android will show the request permission dialog. And if false , Android will not show the dialog as user has checked «Never ask again». So this is where you will have to redirect the user to the Settings -> Permissions screen to allow the user to grant permissions manually.
Now, Let’s see the code in onRequestPermissionsResult() method. I have put some comments as well, so this should be self-explanatory.
Источник
Android runtime permissions. Почему, зачем и как
Часто при установке приложения на Android нам приходилось видеть, что оно запрашивает какое-то немыслимое количество разрешений. Например:
Хорошо, если вы устанавливаете приложение от какого-то известного разработчика, которому можете доверять. Но весьма подозрительно, если вы устанавливаете новый музыкальный плеер, а ему для работы требуется, например, получать ваше местоположение. Или, тем более, фонарик, требующий доступ к смс и звонкам.
Некоторые разработчики, чтобы уменьшить недоверие, добавляют в описание приложения на Google Play информацию о том, зачем нужно то или иное разрешение.
К шестой версии Android ситуация поменялась. Теперь разрешения нужно запрашивать в процессе работы. О том, как этой новой возможностью пользоваться и ее некоторых подводных камнях будет рассказано далее.
Общая информация
Подобно тому, как это происходит в iOS, при запросе появится системный диалог с запросом разрешения.
|
Отличие в том, что после нажатия на кнопку “Deny” разрешение не будет полностью запрещено для приложения, как это происходит у Apple. Его можно будет запросить повторно, но в этом случае появится опция “Never ask again”, после выбора которой “Deny” работает как “Don’t allow” в iOS.
Разрешения делятся на два типа (есть и другие, но они нас не интересуют):
- обычные (normal);
- опасные (dangerous).
Обычные разрешения будут получены приложением при установке, никакого подтверждения от пользователя не потребуется (немного спорный момент, на мой взгляд, стоило бы уведомлять пользователя об обязательных разрешениях). В дальнейшем отозвать их у приложения будет невозможно. Опасные же должны быть запрошены в процессе работы приложения и в любой момент могут быть отозваны. Список опасных и не очень разрешений можно посмотреть тут.
Можно увидеть, что доступ к интернету не считается опасным. Все, кто использует рекламу в своих программах, могут вздохнуть с облегчением: отключить её, просто отобрав разрешение, не получится (все еще можно просто отключить интернет, но факт остается фактом).
Для того чтобы отозвать разрешение, которое было выдано ранее (или предоставить его, если вы выбрали “Never ask again”) нужно перейти в настройки приложения (Settings->Apps->*AppName*) в раздел Permissions и кликнуть по соответствующим переключателям. В этом меню также можно посмотреть все разрешения этой программы, выбрав пункт “All permissions” из контекстного меню. Еще есть возможность просматривать, каким приложениям выдано конкретное разрешение (и соответственно предоставить или отобрать его). Для этого в настройках в разделе Apps нужно кликнуть по меню с иконкой шестеренки и в открывшемся разделе выбрать App permissions. Далее, выбрав нужное разрешение, можно увидеть все приложения, которым оно нужно.
Второй момент заключается в том, насколько ясно будет человеку, для чего нужно это разрешение. Зачем приложению для смс доступ к календарю? Наверное, для какой-то классной функции, которая облегчит перенос дат из сообщений в календарь и тому подобное. Но знаете об этом только вы, поэтому сначала нужно объяснить причину запроса и показать какие возможности даст доступ к этому разрешению. Это относится и к первичным и к вторичным разрешениям.
|
Еще раз кратко:
- важные разрешения запрашиваем при запуске, вторичные — при первом использовании соответствующей функции;
- если понять, зачем нужно разрешение тяжело, предоставляем объяснение.
В случае, когда вам все-таки отказали, пояснение причины в следующий раз является обязательным. А если помимо отказа, пользователь попросил вас никогда не запрашивать данное разрешение, используя опцию “Never ask again”, но пытается использовать соответствующую функцию приложения, предложите ему перейти в настройки вашей программы и вручную включить необходимые разрешения. Это особенно важно, если разрешение критично для работы программы.