这个主要问题是在android系统下7.0
拍照时,Android提供
FileProvider
类来供应用之间共享数据。
出现这个问题多为xml文件 path 类型和代码中调用的类型不同导致的
以下为多种各种xml文件和对应path类的关系
<files-path path="" name="camera_photos" />
该方式提供在应用的内部存储区的文件/子目录的文件。它对应Context.getFilesDir返回的路径:eg:"/data/data/com.jph.simple/files"。
<cache-path name="name" path="path" />
该方式提供在应用的内部存储区的缓存子目录的文件。它对应getCacheDir返回的路径:eg:“/data/data/com.jph.simple/cache”;
<external-path name="name" path="path" />
该方式提供在外部存储区域根目录下的文件。它对应Environment.getExternalStorageDirectory返回的路径:eg:"/storage/emulated/0";
<external-files-path name="name" path="path" />
该方式提供在应用的外部存储区根目录的下的文件。它对应Context#getExternalFilesDir(String) Context.getExternalFilesDir(null)返回的路径。eg:"/storage/emulated/0/Android/data/com.jph.simple/files"。
<external-cache-path name="name" path="path" />
该方式提供在应用的外部缓存区根目录的文件。它对应Context.getExternalCacheDir()返回的路径。eg:"/storage/emulated/0/Android/data/com.jph.simple/cache"
这些就是FileProvider提供的所有支持的path类型
如果使用外部SD卡
则需要设置
<?xml version="1.0" encoding="utf-8"?>
<resources>
<paths>
<root-path path="" name="camera_photos" />
</paths>
</resources>
添加root-path节点
这样FileProvider就可以使用外部储存卡了
以上解决了Android高版本file使用的问题,下面还有个问题,就是
多个文件夹需求,如何去使用FileProvider
如,我拍照需要文件夹,下载的文件也需要新的文件
那么其实只需要声明一个FileProvider,然后再xml里再声明一个paths即可
如下为file_paths.xml文件
<paths>
<external-path name="takpic_img_path" path="Camera"/>
<external-path name="apk_file_path" path="APL_DOWNLOAD"/>
</paths>
FileProvider正常声明为同一个即可
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="com.xxxx.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
tools:replace="android:resource"
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>
这样在调用的时候
uri=FileProvider.getUriForFile(mContext.getApplicationContext(),"com.xxxx.fileprovider",apkFile);
这样去获取Uri即可,多个地方只需要传不同的file,但是去使用同一个 authorities