FileProvider适配问题

2018-05-14  本文已影响0人  二十三岁的梦

在app的build.gradle文件下添加applicationId

defaultConfig {
    applicationId "你的包名"
    ...
}

在资源文件夹res下新建xml文件夹,并在xml文件夹新建file_paths.xml,文件内容如下

<?xml version="1.0" encoding="utf-8"?>
<paths>
    <!-- 需要临时授权访问的路径(.代表所有路径) -->
    <!--对应Environment.getExternalStorageDirectory()-->
    <external-path name="storPath" path=""/>
    <!--对应Context.getExternalCacheDir()得到的目录-->
    <!-- 此标签需要 support 25.0.0以上才可以使用-->
    <external-cache-path  name="cachePath"  path=""/>
    <!--对应Context#getExternalFilesDir(String) Context.getExternalFilesDir(null)-->
    <external-files-path name="filePath" path="aplus_app"/>
    <!--对应 getCacheDir()得到的目录-->
    <cache-path name="cacheDir" path=""/>
    <!--对应Context.getFilesDir() 目录-->
    <files-path name="filesDir" path=""/>
    <!-- root-path 手机存储根目录 -->
    <root-path name="rootPath" path=""/>
</paths>

name:名称标志字符串,不可以同名!
path:文件夹“相对路径”,完整路径取决于当前的标签类型。

标签 路径
…….. * 代表 当前文件夹及其子文件夹
file-path 物理路径为Context.getFilesDir() + /path/*
cache-path 物理路径为Context.getCacheDir() + /path/*
external-path 物理路径为Environment.getExternalStorageDirectory() + /path/*
external-files-path 物理路径为Context.getExternalFilesDir(String) + /path/*
external-cache-path 物理路径为Context.getExternalCacheDir() + /path/*
root-path 物理路径相当于 /path/*

AndroidManifest.xml添加如下代码

<provider
    android:name="android.support.v4.content.FileProvider"
    android:authorities="${applicationId}.fileprovider"
    android:exported="false"
    android:grantUriPermissions="true">
    <meta-data
         android:name="android.support.FILE_PROVIDER_PATHS"
         android:resource="@xml/file_paths" />
</provider>

举个例子:当使用系统相机时

File outFile = new File(outDir, System.currentTimeMillis() + ".jpg");
// 把文件地址转换成Uri格式
Uri uri = null;
if (Build.VERSION.SDK_INT >= 24) {
    uri = FileProvider.getUriForFile(getApplicationContext(), "你的包名.fileprovider", outFile);
} else {
     uri = Uri.fromFile(outFile);
}
//LogUtils.d("AbsolutePath", "getAbsolutePath=" + outFile.getAbsolutePath());
// 设置系统相机拍摄照片完成后图片文件的存放地址
intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
// 此值在最低质量最小文件尺寸时是0,在最高质量最大文件尺寸时是1
intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 0);
startActivityForResult(intent, Config.FOR_CAMERA_PIC);

最后不要忘记权限AndroidManifest.xml

    <!-- 允许程序设置内置sd卡的写权限 -->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <!-- 允许程序设置内置sd卡的读权限 -->
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

此外还需要考虑到6.0的动态权限问题

上一篇下一篇

猜你喜欢

热点阅读