android 超级简单申请权限,Android 6.0 超级简单的权限申请2 (Permission)

写在前面

上次写了一个权限申请的例子Android 6.0 超级简单的权限申请 (Permission),原理是封装权限申请的代码到一个Helper类,然后重写onRequestPermissionsResult方法处理。这已经是很简洁的权限申请方法了,但是还不够,因为这里还需要重写onRequestPermissionsResult方法。所以研究了一番,再写了一个例子,不需要重写onRequestPermissionsResult方法,真正做到一句代码搞定权限申请。

实现原理

封装权限申请的相关代码到一个Helper类中,在申请权限的时候,启动一个Fragment,但不显示,在Fragment中申请权限,也在Fragment中处理权限,最后回调给Helper。

实现过程

封装PermissionHelper类,定义对外开放的方法

/**

* @param permissions e.g. {@link Manifest.permission#CAMERA}

* @return true if all granted, false otherwise.

*/

public static boolean isGranted(Activity activity, String... permissions)

/**

* @param grantedListener run on all permission granted

* @param deniedListener run if one permission denied

*/

public static void requestPermissions(Activity activity,

OnPermissionGrantedListener grantedListener,

OnPermissionDeniedListener deniedListener,

String... permissions)

获取AndroidManifest中注册的权限

private static List getRegisteredInManifestPermissions(Activity activity) {

List list = new ArrayList<>();

try {

PackageInfo packageInfo = activity.getPackageManager().getPackageInfo(activity.getPackageName(), PackageManager.GET_PERMISSIONS);

String[] permissions = packageInfo.requestedPermissions;

if (permissions != null) {

list.addAll(Arrays.asList(permissions));

}

} catch (PackageManager.NameNotFoundException e) {

e.printStackTrace();

}

return list;

}

检查权限是否已经注册

for (String permission : permissions) {

if (!mRegisteredInManifestPermissions.contains(permission)) {

throw new IllegalArgumentException("the permission "" + permission + "" is not registered in AndroidManifest.xml");

}

}

检查权限是否已经允许,AndroidM以下的设备直接判断为允许

public static boolean isGranted(Activity activity, String... permissions) {

checkPermissions(activity, permissions);

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {

for (String permission : permissions) {

if (activity.checkSelfPermission(permission) == PackageManager.PERMISSION_DENIED) {

return false;

}

}

}

return true;

}

初始化Fragment并添加到Activity中

这里的PermissionHelper直接继承Fragment了,直接重写onRequestPermissionsResult处理回调。new Fragment之前先检查此Activity中是否已经存在一个,如果有则直接使用。

Fragment fragment = activity.getFragmentManager().findFragmentByTag(TAG);

if (fragment == null) {

fragment = new PermissionHelper();

FragmentManager fragmentManager = activity.getFragmentManager();

fragmentManager.beginTransaction().add(fragment, TAG).commitAllowingStateLoss();

fragmentManager.executePendingTransactions();

}

利用Fragment申请权限

fragment.requestPermissions(permissions, mRequestCode++);

处理onRequestPermissionsResult方法,并把结果正确的回调给用户

@Override

public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {

super.onRequestPermissionsResult(requestCode, permissions, grantResults);

if (mOnGrantedListeners.containsKey(requestCode)) {

// 这里规定全部权限都通过才算通过

boolean granted = true;

// 在Activity A申请权限,然后马上跳转到Activity B,则grantResults.length=0

if (grantResults.length == 0) granted = false;

for (int result : grantResults) {

if (result == PackageManager.PERMISSION_DENIED) {

granted = false;

}

}

if (granted) {

OnPermissionGrantedListener listener = mOnGrantedListeners.get(requestCode);

if (listener != null) listener.onGranted();

} else {

OnPermissionDeniedListener listener = mOnDeniedListeners.get(requestCode);

if (listener != null) listener.onDenied();

}

mOnGrantedListeners.remove(mRequestCode);

mOnDeniedListeners.remove(mRequestCode);

}

}

使用方法

直接在Activity中调用下面代码既可,虽然很多行,但只是一句代码哈哈

PermissionHelper.requestPermissions(this, () -> {

// on granted

Toast.makeText(MainActivity.this, "onGranted", Toast.LENGTH_SHORT).show();

}, () -> {

// on denied

Toast.makeText(MainActivity.this, "onDenied", Toast.LENGTH_SHORT).show();

}, Manifest.permission.READ_CONTACTS, Manifest.permission.WRITE_EXTERNAL_STORAGE);

文件结构图

788496f442f5da3ff8747418835ee904.png

演示效果图

c1ac2838dee690569fa22fe3029b3ada.gif

运行代码可能出现的问题

compileSdkVersion 27,可以改成你电脑中存在的SDK版本。

这里用的是 gradle-4.4-all.zip,如果你用的是其它版本,那么可能会下载超级慢,建议改成你电脑中存在的gradle版本,改文件PermissionHelper/gradle/wrapper/gradle-wrapper.properties即可。

其它问题可以直接联系我。

Android 6.0 超级简单的权限申请2 (Permission)

注:本文著作权归作者,由demo大师代发,拒绝转载,转载需要作者授权

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值