94.android7.0 获取uri

链接:https://blog.csdn.net/lanxuan1993/article/details/81627436

借鉴:https://blog.csdn.net/qq_33505109/article/details/90405302

android7.0以后,使用Uri.fromFile会报FileUriExposedException异常,这是因为android7.0以后执行了更加严格的文件管理,要解决这一错误需要使用7.0新添加的FileProvide类,FileProvider官方文档:官方链接

报错原因:android7.0对于系统权限作了一些更改,为了提高私有文件的安全性,当我们在访问文件的时候,安卓禁止您的应用外部公开file://uri 

解决思路:需要在应用之间共享文件,那就少不了FileProvider类

 

1.在清单文件中添加provider内容

<application
    android:name=”.AppApplication”
    android:allowBackup=”true”
    android:icon=”@mipmap/ic_launcher”
    android:label=”@string/app_name”
    android:roundIcon=”@mipmap/ic_launcher_round”
    android:supportsRtl=”true”
    android:theme=”@style/AppTheme”>
 
    <provider
        android:name=”android.support.v4.content.FileProvider”
        android:authorities=”demo.exmple.com.emidemo.utils.FileProvider7″
        android:exported=”false”
        android:grantUriPermissions=”true”>
        <meta-data
            android:name=”android.support.FILE_PROVIDER_PATHS”
            android:resource=”@xml/file_paths” />
    </provider>
</application>
 

2.在resource中新建xml文件夹,在res/xml/file_paths文件夹中新建以下内容

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <paths xmlns:android="http://schemas.android.com/apk/res/android">
 
        <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

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() + “.utils.FileProvider7”,
                file);
        return fileUri;
    }

另:androidx.core.content.FileProvider替换android.support.v4.content.FileProvider

 

点赞