欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

安卓7.0以后打开本地文件方式

程序员文章站 2022-04-15 18:44:01
...

android7.0以后对本地文件访问做了控制,会对uri进行暴露检测,针对此有两种解决办法

 

第一种:暴力解决办法,关闭uri暴露检测,在要使用的activity的onCreate方法中加入即可

StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder();
StrictMode.setVmPolicy(builder.build());
builder.detectFileUriExposure();

第二种:也是推荐的一种,更换uri的获取方式

1、在AndroidManifest中加入

<provider
   android:name="android.support.v4.content.FileProvider"
   android:authorities="程序包名.fileprovider"
   android:exported="false"
   android:grantUriPermissions="true">
   <meta-data
      android:name="android.support.FILE_PROVIDER_PATHS"
      android:resource="@xml/file_paths" />
</provider>

2、res/xml/下面添加配置文件file_paths.xml

<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android">
    <paths>
        <external-path
            name="download"
            path=""/>
        <root-path
            name="root"
            path=""/>
        <files-path
            name="files"
            path=""/>

        <cache-path
            name="cache"
            path=""/>

        <external-path
            name="external"
            path=""/>

        <external-files-path
            name="external_file_path"
            path=""/>
        <external-cache-path
            name="external_cache_path"
            path=""/>

    </paths>
</resources>

3、代码中修改uri的获取方式

Uri.fromFile(file);

改为

public class FileProvider7 {

    public static Uri getUriForFile(Context context, File file) {
        Uri fileUri = null;
        if (Build.VERSION.SDK_INT >= 24) {
            fileUri = getUriForFile24(context, file);
        } else {
            fileUri = Uri.fromFile(file);
        }
        return fileUri;
    }

    public static Uri getUriForFile24(Context context, File file) {
        Uri fileUri = android.support.v4.content.FileProvider.getUriForFile(context,
                context.getPackageName() + ".fileprovider",
                file);
        return fileUri;
    }
}

注意:这种方式在打开相应文件之前activity的设置,如下以打开本地图片为例

Intent intent = new Intent("android.intent.action.VIEW");
intent.addCategory("android.intent.category.DEFAULT");
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);//这行一定不能漏掉
Uri uri = FileProvider7.getUriForFile(AppContext.getInstance(), file);
intent.setDataAndType(uri, "image/*");

 

相关标签: 安卓 安卓