- Android permissions
- До Android 6
- Android 6
- Манифест
- Всегда проверяйте разрешение
- Don’t ask again
- Объяснение для пользователя
- Группы
- Android 6 и targetSdkVersion 23
- How to Manage and Fix Permissions on Android File System
- Things You Need to Fix File Permissions on Android
- Understanding Android File Permissions
- Fix File Permissions on Android Devices
- Quick Steps to Fix File Permissions on Android
- Detailed Steps to Manage Permissions on Android
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 для обсуждения проблем производительности и для ваших пожеланий по содержанию курса по этой теме
Источник
How to Manage and Fix Permissions on Android File System
On any UNIX or Linux based file system like Android, all files and folders have a set of permissions associated with them. These permissions which are also called ‘attributes’ determine the level of accessibility/permission given to a user or a group of users. Being based on Linux, Android is no exception. Today, we will see what permissions (Read-Write-Execute) mean and how we can set or fix file permissions on Android using a root file manager app.
You cannot taste the real flavor of the Lollipop, Marshmallow, Nougat, Oreo or Pie and the whole of Android kitchen unless you have root access on your phone or tablet. The power vested onto you after rooting your device unlocks the doors of a new world, far away from millions of apps found at the Google Play and sluggish and faulty firmware updates, where customization and possibilities breath and grow to give you the next-level experience with your Android device.
Being the owner of a rooted Android device puts you in a privileged position from where you can exact the best performance out of your device. You can choose from a wide range of custom ROMs, mods, ports, Kernels, themes, and patches for your Android device and thus have things as you want them to be.
The Open Source attribute of Android allows thousands of developers across the world to contribute to its development. They work hard to produce stuff that makes our mobile experience richer and convenient. It’s because of their efforts that we are able to enjoy various mods and ported apps on our Android devices.
In several cases, such mods and ports require a little effort from us too. Fixing file permission our setting an app’s Read, Write and Execute rules to get a mod or ported app to work, thus becomes a piece of knowledge all Android lovers must be familiar with. In the present tutorial, I’ll be showing you how you can set or fix a specific file’s permissions rules on Android devices.
Things You Need to Fix File Permissions on Android
Since fixing permissions of an app involves entering the system of your device, the first and foremost requirement is to have root access on it. If you have rooted your Android device, you are good to go.
The next requirement is to install a good root file manager on your device. Below, you’ll find a list of some of the best root file explorers for Android devices. Personally, I prefer Solid Explorer File Manager and Root Explorer apps.
[googleplay url=”https://play.google.com/store/apps/details?id=pl.solidexplorer2″] [googleplay url=”https://play.google.com/store/apps/details?id=com.jrummy.root.browserfree”] [googleplay url=”https://play.google.com/store/apps/details?id=com.speedsoftware.rootexplorer”]
Also, install the BusyBox app on your device:
Open the app when installed and then tap the install button to finish the setup.
Understanding Android File Permissions
On any UNIX or Linux based file system, every single file and folder stored on the hard drive has a set of permissions associated with it. These permissions which are also called attributes, determine the level of accessibility/permission given to a user or a group of users.
Read-Write-Execute Permissions
The Read-Write-Execute attributes tell the system or server who is allowed to do what with a particular file. In the same way, every file and directory also has an Owner, Group, and Others associated with it. By changing these permission rules, you can direct a system or server what kind of accessibility it allows to different types of peoples.
Read-Write-Permission Attributes Linux
Android, being a Linux-based platform for mobile devices, also relies on this kind of permission rules in its system files. And therefore, you might need to fix/manage or edit them in certain situations.
Fix File Permissions on Android Devices
Follow the steps described below to manage Read, Write and Execute permissions of a file on Android devices.
Quick Steps to Fix File Permissions on Android
- Copy the file/APK that you want to fix permissions of and copy it to your devices’ internal or external SD Card.
- Now copy and paste the file/apk to the location suggested by the developer. If it is an app, push it to system/app directory.
- Set permissions to rw-r–r–
- Finally, reboot your phone or tablet device.
Please note that if you assign the wrong set of file permissions while copying an app or file on your rooted Android device, your phone might stick on a bootloop. To fix this error, do as follows:
- Pull out your device’s battery and boot it into CWM or TWRP recovery mode.
- Go to the “advanced” option in recovery and select “fix permissions“.
- Then “wipe dalvik cache“.
- Go back to the main menu and select “reboot system now“.
Detailed Steps to Manage Permissions on Android
If you are new to Android and are gradually learning things, you might want a detailed guide on editing file permission on Android devices. Please be warned that playing with the permission rules of system files unnecessarily and without understanding, might produce bizarre results. So here are the steps to do it:
- Copy the file to the internal or external SD card storage on your device by connecting it to the computer using the USB cable.
- Now open the root file explorer app from the app drawer.
- Here you will see a list of directories and files.
- If you copied the file to the internal storage on your device, you can find it by opening the “sdcard” directory. To access the external storage, tap on “storage/extSdcard”.
- To fix or set Read-Write-Execute (R-W-E) permissions of the file, you must copy it to a root directory (like system, data, etc.) first. You cannot fix permissions while the file is stored on SD or ExtSD card on your device.
- To copy the file, navigate to it and then tap and hold it. You will see a pop-up window with all the available options.
- Select “Copy” option and go to the target directory by tapping on the Home or Up icon from the bottom bar.
- Navigate to the location/directory when you wish to paste the file and tap on “Paste” button.
- Now you can easily manage the permission rules of that file. Just press and hold it and from the popup option panel, select “Permissions”.
- You will see a new window showing the current permission attributes or read (r),write (w) and execute(x) rules for that file. In short, we mention this rule simply as rw- r– r– where each blank space shows unmarked attribute. You can edit it by checking and unchecking the boxes. The most used set of permissions that various files on Android need are
- Owner= Read+Write,
- Group=Read and
- Others= Read.
- In case, you have a permissions rule prescribed by a developer, edit them accordingly.
So this was our simple and detailed guide about fixing permission on Android file system using a root file manager. I hope it might prove useful to you in understanding not only the term “Permissions” but also how to manipulate it. Cheers, and keep visiting!
Источник