代码拉取完成,页面将自动刷新
同步操作将从 刘酱酱/snails-permission 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
android6.0动态权限申请,支持在activity,fragment,service,view中进行权限申请
设计模式:AOP面向切面设计
依赖三方AOP框架:https://github.com/HujiangTechnology/gradle_plugin_android_aspectjx
apply plugin: 'android-aspectjx'
dependencies {
implementation project(path: ':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>;
}
@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();
}
@NeedPermission
名称 | 类型 | 描述 |
---|---|---|
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()来拿到被权限被拒绝的List;
@PermissionDenied
private void callPermissionDenied(DenyBean model) {
Logger.d("callPermissionDenied 权限被拒绝");
}
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();
}
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。