Динамическое разрешение на доступ к данным в Android 6.0 и выше.
Поддерживает запрос разрешений в любом месте программы, например: activity, fragment, view, service и т. д.
Дизайн: аспектно-ориентированное программирование (AOP).
Без контекста, с использованием ContentProvider.
Зависит от сторонних AOP фреймворков: https://github.com/HujiangTechnology/gradle_plugin_android_aspectjx.
apply plugin: 'android-aspectjx'
dependencies {
implementation project(':snails-permission')
}
// Необязательная конфигурация: include и exclude определяют правила сопоставления пакетов. Если пакет найден, то весь jar (то есть вся библиотека) будет работать. Это сделано для оптимизации производительности.
aspectjx {
include 'com.snails.permission', 'используйте здесь имя пакета с аннотациями'
}
dependencies {
classpath 'com.hujiang.aspectjx:gradle-android-plugin-aspectjx:2.0.4'
}
-keepclasseswithmembers class * {
@com.snails.permission.annotation.NeedPermission <methods>;
}
-keepclasseswithmembers class * {
@com.snails.permission.annotation.PermissionCanceled <methods>;
}
-keepclasseswithmembers class * {
@com.snails.permission.annotation.PermissionDenied <methods>;
}
-keep public class com.snails.permission.InitProvider { *; }
@NeedPermission(value = {
Manifest.permission.READ_PHONE_STATE,
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE
}, requestCode = 200)
private void onLoadAdvertisement() {
this.mPresenter.onLoadAdvertisement();
}
Название | Тип | Описание |
---|---|---|
value | String[] | Массив запрашиваемых разрешений |
requestCode | int | Код запроса, используется для различения нескольких запросов разрешений в одном Activity. По умолчанию равен 0. Если в Activity только один запрос разрешения, можно не указывать requestCode. |
Определение отмены разрешений: пользователь не дал разрешение, но не выбрал опцию «больше не спрашивать».
Обратите внимание: метод должен иметь только один параметр типа CancelBean. CancelBean содержит переменную requestCode, которая соответствует коду запроса при запросе разрешения.
@PermissionCanceled
private void callPermissionCanceled(CancelBean model) {
Logger.d("callPermissionCanceled разрешение отменено");
}
Определение отказа в разрешении: появляется системное окно запроса разрешения, пользователь не даёт разрешение и выбирает опцию «больше не спрашивать».
Обратите внимание: метод должен иметь только один параметр типа DenyBean. DenyBean содержит переменную requestCode, которая соответствует коду запроса при запросе разрешения. Также можно использовать denyBean.getDenyList() для получения списка отказов в разрешениях.
@PermissionDenied
private void callPermissionDenied(DenyBean model) {
Logger.d("callPermissionDenied разрешение отклонено");
}
Пример 1
package com.ak.aigo.ui.splash;
public class SplashActivity
extends BaseMvpActivity<SplashContract.Presenter>
implements SplashContract.View {
private final int PERMISSION_CODE = 200;
@NeedPermission(value = {
Manifest.permission.READ_PHONE_STATE,
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE
}, requestCode = PERMISSION_CODE)
private void onLoadAdvertisement() {
this.mPresenter.onLoadAdvertisement();
}
@PermissionDenied
private void callPermissionDenied(DenyBean model) {
if (model != null && model.getDenyList() != null) {
switch (model.getRequestCode()) {
case PERMISSION_CODE:
String sPermission = "";
for (int i = 0; i < model.getDenyList().size(); i++) {
switch (model.getDenyList().get(i)) {
case Manifest.permission.READ_PHONE_STATE:
sPermission += "информация о телефоне, ";
break;
case Manifest.permission.READ_EXTERNAL_STORAGE:
if (!sPermission.contains("место хранения")) sPermission += "место хранения, ";
break;
case Manifest.permission.WRITE_EXTERNAL_STORAGE:
if (!sPermission.contains("место хранения")) sPermission += "место хранения, ";
break;
default: break;
}
}
if (sPermission.endsWith("、")) sPermission = sPermission.substring(0,
``` **Текст запроса:**
sPermission.length() - 2); final StringBuilder sBuilder = new StringBuilder("由于无法获取您的"); sBuilder.append(sPermission) .append("权限,玩Android无法正常运行,请开启权限:设置-应用-玩Android-权限") .append(sPermission); showPermissionAlert("玩Android无法正常运行", sBuilder.toString(), "退出", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { if (dialog != null) dialog.dismiss(); ActivityStackManager.instance().exitApp(); } }, "去设置", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { if (dialog != null) dialog.dismiss(); SettingUtil.go2Setting(mCtx); new Handler().postDelayed(()->{ ActivityStackManager.instance().exitApp(); }, 2000); } }); break;
default: break;
}
}
}
@PermissionCanceled
private void callPermissionCanceled(CancelBean model) {
if (model != null) {
switch (model.getRequestCode()) {
case PERMISSION_CODE:
showLongToast("由于无法获取您的权限,玩Android无法正常运行,应用将在3s后自动退出");
new Handler().postDelayed(() -> {
ActivityStackManager.instance().exitApp();
}, 3000);
break;
default: break;
}
}
}
private void showPermissionAlert(String title, String message,
String cancel, DialogInterface.OnClickListener cancelListener,
String ok, DialogInterface.OnClickListener okListener) {
new AlertDialog.Builder(mCtx).setTitle(title).setMessage(message)
.setNegativeButton(cancel, cancelListener)
.setPositiveButton(ok, okListener)
.setCancelable(false).create().show();
}
}
**Перевод текста на русский язык:**
В данном фрагменте кода происходит проверка разрешений и отображение диалогового окна с сообщением о том, что приложение не может работать без определённых разрешений. Если пользователь отказывается предоставить разрешения, приложение автоматически закрывается через некоторое время.
Также в коде есть метод `callPermissionCanceled`, который вызывается при отмене разрешений пользователем. В этом случае также отображается сообщение о невозможности работы приложения без разрешений, и приложение закрывается через три секунды.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )