/**

* @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();

}

}

}

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐