1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/ak-star-snails-permission

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
README.md 11 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
gitlife-traslator Отправлено 28.11.2024 11:20 3fc5730

snail-permission

介绍

Динамическое разрешение на доступ к данным в Android 6.0 и выше.

Поддерживает запрос разрешений в любом месте программы, например: activity, fragment, view, service и т. д.

  • Примечание: эта библиотека временно не поддерживает запрос разрешений вне UI потока.

Архитектура программного обеспечения

UML диаграмма последовательности

введите описание изображения

Инструкция по установке

1. Добавление библиотеки разрешений в модуль приложения build.gradle:
apply plugin: 'android-aspectjx'

dependencies {
    implementation project(':snails-permission')
}

// Необязательная конфигурация: include и exclude определяют правила сопоставления пакетов. Если пакет найден, то весь jar (то есть вся библиотека) будет работать. Это сделано для оптимизации производительности.
aspectjx {
    include 'com.snails.permission', 'используйте здесь имя пакета с аннотациями'
}
2. В корневом каталоге build.gradle настройте следующее:
dependencies {
    classpath 'com.hujiang.aspectjx:gradle-android-plugin-aspectjx:2.0.4'
}
3. В этом проекте в классе AOP используется отражение. Если после обфускации разрешения на доступ не работают, добавьте следующие настройки в конфигурацию обфускатора:
-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 { *; }

Использование

  • Эта библиотека временно не поддерживает запросы разрешений вне UI потоков.
1. Запрос разрешений
@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.
2. Отмена разрешений
  • Определение отмены разрешений: пользователь не дал разрешение, но не выбрал опцию «больше не спрашивать».

  • Обратите внимание: метод должен иметь только один параметр типа CancelBean. CancelBean содержит переменную requestCode, которая соответствует коду запроса при запросе разрешения.

@PermissionCanceled
private void callPermissionCanceled(CancelBean model) {
    Logger.d("callPermissionCanceled разрешение отменено");
}
3. Отказ в разрешениях
  • Определение отказа в разрешении: появляется системное окно запроса разрешения, пользователь не даёт разрешение и выбирает опцию «больше не спрашивать».

  • Обратите внимание: метод должен иметь только один параметр типа 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 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/ak-star-snails-permission.git
git@api.gitlife.ru:oschina-mirror/ak-star-snails-permission.git
oschina-mirror
ak-star-snails-permission
ak-star-snails-permission
master