美文网首页
FileProvider适配问题

FileProvider适配问题

作者: 二十三岁的梦 | 来源:发表于2018-05-14 16:55 被阅读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的动态权限问题

    相关文章

      网友评论

          本文标题:FileProvider适配问题

          本文链接:https://www.haomeiwen.com/subject/emdjdftx.html