android7.0 动态权限,Android 7.0动态权限大总结

/**

* @Author: duke

* @DateTime: 2017-06-06 14:43

* @Deion: android 7.0 uri权限适配,

* (通过intent暴漏uri或file给第三方app时的)私有目录被禁止访问

* 已对local path和net path做了适配

*/

public class FileUriPermissionCompat {

private static final String TAG = FileUriPermissionCompat. class .getSimpleName();

// TODO: 此处需要更改为对应值

//此处需要改成AndroidManifest.xml中申请的对应的provider的authorities值

private static final String AUTHORITIES = "com.duke.personalkeeper.myFileProvider" ;

/**

* 是否需要适配7.0权限

*

* @return

*/

public static boolean isNeedAdapt() {

//24以上版本

return Build.VERSION.SDK_INT >= Build.VERSION_CODES.N;

}

public static Uri adaptUriAndGrantPermission(Context context, Intent intent, File file) {

Uri uri = adaptUri(context, file);

if (uri == null ) {

return null ;

}

grantUriPermission(context, intent, uri);

return uri;

}

public static Uri adaptUri(Context context, File file) {

if (context == null || file == null ) {

return null ;

}

//网络路径的特殊处理,不需要7.0适配,但必须用parse()方法

if (file.getPath().startsWith( "http" )) {

return Uri.parse(file.getPath());

}

Uri uri = null ;

try {

if (isNeedAdapt()) {

//需要7.0特殊适配

//通过系统提供的FileProvider类创建一个content类型的Uri对象

uri = FileProvider.getUriForFile(context, AUTHORITIES, file);

} else {

//不需要适配

uri = Uri.fromFile(file);

}

} catch (Exception e) {

Log.e(TAG, "authorities value error, so can't convert uri !" );

e.printStackTrace();

}

return uri;

}

/**

* 对第三方应用赋予对uri读写的权限

*

* @param context

* @param intent

* @param saveUri 适配后的uri

*/

public static void grantUriPermission(Context context, Intent intent, Uri saveUri) {

if (!isNeedAdapt()) {

return ;

}

if (context == null || intent == null || saveUri == null ) {

return ;

}

//网络路径的特殊处理,不需要权限

if (saveUri.getScheme() != null && saveUri.getScheme().startsWith( "http" )) {

//不需要授权

return ;

}

//1、授权(系统相册、相机、裁剪时需要) -- 这种写法待分析

List resInfoList = context.getPackageManager().queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);

for (ResolveInfo resolveInfo : resInfoList) {

String packageName = resolveInfo.activityInfo.packageName;

if (TextUtils.isEmpty(packageName)) {

continue ;

}

context.grantUriPermission(packageName, saveUri, Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);

}

//2、授权(安装apk时需要)

intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);

}

public static void revokeUriPermission(Context context, Intent intent, Uri saveUri) {

if (!isNeedAdapt()) {

return ;

}

if (context == null || intent == null || saveUri == null ) {

return ;

}

//网络路径的特殊处理,不需要权限

if (saveUri.getScheme() != null && saveUri.getScheme().startsWith( "http" )) {

//不需要授权

return ;

}

try {

context.revokeUriPermission(saveUri, Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);

} catch (Exception e) {

e.printStackTrace();

}

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值