Android-фреймворк для динамического запроса разрешений.
Адрес на Github: https://github.com/lhm0603/XmPermissionsProject
XmPermissions поддерживает Android 5.0 и более поздние версии, а до Android 6.0 разрешения по умолчанию предоставляются сразу.
Используйте Android Studio
или другую систему сборки с использованием Gradle
:
dependencies {
//другие зависимости
implementation 'com.xm.permissions:XmPermissions:1.0.2'
}
Добавьте в файл AndroidManifest.xml необходимые вашему приложению разрешения:
<?xml version="1.0" encoding="utf-8"?>
<manifest package="com.lin.example.epa"
xmlns:android="http://schemas.android.com/apk/res/android">
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.CALL_PHONE"/>
<uses-permission android:name="android.permission.WRITE_CALL_LOG"/>
<application>
</application>
</manifest>
В Activity, где требуется запросить разрешение, создайте экземпляр XmPermissions и реализуйте необходимые обратные вызовы:
class IndexActivity : AppCompatActivity() {
/**
* Создание экземпляра XmPermissions.
*/
private val xmPermissions = XmPermissions.newInstance(this)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_index)
// Запрос необходимых разрешений по мере необходимости
// xmPermissions.requestPermissions(getString(R.string.InvalidPermissionText), Manifest.permission.CALL_PHONE, Manifest.permission.CAMERA)
// Запрашиваем все разрешения, указанные в конфигурационном файле (не рекомендуется)
xmPermissions.requestAllPermissions()
}
override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
// Необходимо вызвать этот метод и передать параметры методу XmPermissions
xmPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults)
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
// Необходимо вызвать этот метод и передать параметры методу XmPermissions
xmPermissions.onActivityResult(requestCode)
}
}
PS: При запросе разрешений рекомендуется следовать правилам Android:
- Запрашивать конкретные разрешения только перед выполнением действий, требующих этих разрешений.
- Перед запросом разрешений следует явно уведомить пользователя о том, какие действия будут выполняться после предоставления разрешений. Это можно сделать через всплывающее окно или полноэкранное уведомление.
- Запрашивать только те разрешения, которые необходимы для работы приложения. Не запрашивать разрешения, не связанные с приложением.
- Даже если пользователь отклонил запрос на разрешение, приложение должно стараться предоставить пользователю доступ к функциям, которые не требуют этого разрешения.
Дополнительные правила см. по ссылке: https://developer.android.google.cn/guide/topics/permissions/overview
Вам может быть интересно узнать о результатах запроса разрешений, поэтому вы можете установить обратный вызов для XmPermissions с помощью метода setOnRequestPermissionsCallback:
interface OnRequestPermissionsCallback {
/**
* Все запрошенные разрешения были предоставлены.
*/
fun onGranted()
/**
* Часть запрошенных разрешений была отклонена.
*/
fun onDenied(deniedPermissions: Array<String>)
/**
* Часть запрошенных разрешений была навсегда отклонена.
*/
fun onPermanentlyDenied(deniedPermissions: Array<String>)
/**
* После возвращения из настроек некоторые запрошенные разрешения всё ещё не предоставлены.
*/
fun onSettingBackDenied(deniedPermissions: Array<String>)
}
Пусть Activity реализует этот интерфейс или создаст класс, который его реализует, и вызовет соответствующие методы:
// Activity реализует интерфейс OnRequestPermissionsCallback и переопределяет соответствующие функции
class IndexActivity : AppCompatActivity(), OnRequestPermissionsCallback {
private val xmPermissions = XmPermissions.newInstance(this)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_index)
// Устанавливаем прослушиватель обратного вызова для запроса разрешений
xmPermissions.setOnRequestPermissionsCallback(this)
xmPermissions.requestAllPermissions()
}
// Опускаем часть кода...
// Все разрешения предоставлены пользователем, можно приступать к работе
override fun onGranted() {
Toast.makeText(this, R.string.userGrantedAllPermission, Toast.LENGTH_LONG).show()
}
// Часть разрешений была отклонена пользователем, функциональность ограничена, необходимо дружественное уведомление пользователя
override fun onDenied(deniedPermissions: Array<String>) {
Toast.makeText(this, R.string.userDeniedSomePermission, Toast.LENGTH_LONG).show()
}
// Некоторые разрешения были отклонены пользователем несколько раз или пользователь напрямую отклонил их и выбрал опцию «больше не спрашивать». Это означает, что в следующий раз система не будет предлагать разрешения, которые были отклонены навсегда.
}
``` Вот перевод текста на русский язык:
而是直接被拒绝,这里建议可以再次告知用户,为什么需要该权限,没有该权限功能受阻等。并提供UI让用户可以跳转到设置界面去手动打开相应的权限。
// Можно вызвать xmPermissions.jumpToSettingPermissionPage(), внутренняя реализация функции перехода на страницу настроек приложения. И также сделана обработка обратного вызова при переходе обратно из настроек в приложение
override fun onPermanentlyDenied(deniedPermissions: Array<String>) {
AlertDialog.Builder(this).setTitle(R.string.somePermissionsPromptAgain)
.setMessage(String.format(Locale.CHINA, getString(R.string.deniedPermissions), deniedPermissions.contentToString()))
.setPositiveButton(R.string.to_open) { _, _ ->
xmPermissions.jumpToSettingPermissionPage()
}.setNegativeButton(R.string.cancel) { _, _ ->
onDenied(deniedPermissions)
}.setCancelable(false).show()
}
// Данный метод будет вызван, если пользователь перешёл в настройки, но не открыл необходимые разрешения, и затем вернулся в приложение. Это также означает, что разрешение не было успешно запрошено
override fun onSettingBackDenied(deniedPermissions: Array<String>) {
Toast.makeText(this, R.string.backSettingsDeniedPermissions, Toast.LENGTH_LONG).show()
}
}
Copyright 2020 Huaming Lin.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )