对于Cache目录中的文件,我可以在xml中添加它来设置FileProvider
但是,如果我在外部缓存目录中存储文件,我无法获得外部缓存路径标记或类似的东西来设置FileProvider.And
也没有帮助.
这是我的清单文件:
这是xml/file_paths文件:
这是我的代码:
String RootPath = App.getApplication().getExternalCacheDir().getAbsolutePath(); String filePath = RootPath + "/image/" + fileName; // done something there to save file Intent shareIntent = new Intent(); Uri contentUri = FileProvider.getUriForFile(App.getApplication(), App.getApplication().getPackageName(), new File(filePath)); App.getApplication().grantUriPermission(App.getApplication().getPackageName(), contentUri, Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION); shareIntent.setData(contentUri); shareIntent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION); shareIntent.setAction(Intent.ACTION_SEND); shareIntent.putExtra(Intent.EXTRA_STREAM, contentUri); shareIntent.setType("image/*"); activity.startActivity(Intent.createChooser(shareIntent, "share image"));
这是错误信息:
/AndroidRuntime: FATAL EXCEPTION: main Process: com.tizi.quanzi, PID: 27487 java.lang.IllegalArgumentException: Failed to find configured root that contains /storage/emulated/0/Android/data/com.tizi.quanzi/cache/image/o9xygODHtdP6HXqsuUZghVCsBKTtY4FJgO1MpnmX.jpg at android.support.v4.content.FileProvider$SimplePathStrategy.getUriForFile(FileProvider.java:678) at android.support.v4.content.FileProvider.getUriForFile(FileProvider.java:377) at com.tizi.quanzi.tool.ShareImage.shareImage(ShareImage.java:67) at com.tizi.quanzi.tool.ShareImage.shareImage(ShareImage.java:61) at com.tizi.quanzi.adapter.GalleryAdapter$2.onClick(GalleryAdapter.java:119) at android.support.v7.app.AlertController$AlertParams$3.onItemClick(AlertController.java:956) at android.widget.AdapterView.performItemClick(AdapterView.java:310) at android.widget.AbsListView.performItemClick(AbsListView.java:1145) at android.widget.AbsListView$PerformClick.run(AbsListView.java:3042) at android.widget.AbsListView$3.run(AbsListView.java:3879) at android.os.Handler.handleCallback(Handler.java:739) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:148) at android.app.ActivityThread.main(ActivityThread.java:5417) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
Carlosph.. 12
更新:
使用支持库24.2.0及更高版本的方式是@ashughes在答案中的说法.
在该版本中,他们为FileProvider.java的实现添加了两个新标记,以便能够引用外部文件和缓存目录.
private static final String TAG_EXTERNAL_FILES = "external-files-path"; private static final String TAG_EXTERNAL_CACHE = "external-cache-path";
如果您想深入了解它,可以查看对此提交所做的更改.
原答案:
我遇到了同样的问题.我看了一下这个类FileProvider.java
,正如你所说,外部缓存目录没有标记,只有下面的四个.
private static final String TAG_ROOT_PATH = "root-path"; private static final String TAG_FILES_PATH = "files-path"; private static final String TAG_CACHE_PATH = "cache-path"; private static final String TAG_EXTERNAL = "external-path";
我所做的是使用external-path
标签.此标记将指向外部目录的根目录而不是缓存.因此,您可以指定从那里到缓存目录的其余路径,也path
可以使用点,以便指向外部目录的根目录.
当你使用
该方法getFileForUri
正在检查文件的路径是否以不包含的路径开头/storage/emulated/0/cache/image/
,因为文件的路径是/storage/emulated/0/Android/data/com.tizi.quanzi/cache/image/
.这就是你获得例外的原因.
更新:
使用支持库24.2.0及更高版本的方式是@ashughes在答案中的说法.
在该版本中,他们为FileProvider.java的实现添加了两个新标记,以便能够引用外部文件和缓存目录.
private static final String TAG_EXTERNAL_FILES = "external-files-path"; private static final String TAG_EXTERNAL_CACHE = "external-cache-path";
如果您想深入了解它,可以查看对此提交所做的更改.
原答案:
我遇到了同样的问题.我看了一下这个类FileProvider.java
,正如你所说,外部缓存目录没有标记,只有下面的四个.
private static final String TAG_ROOT_PATH = "root-path"; private static final String TAG_FILES_PATH = "files-path"; private static final String TAG_CACHE_PATH = "cache-path"; private static final String TAG_EXTERNAL = "external-path";
我所做的是使用external-path
标签.此标记将指向外部目录的根目录而不是缓存.因此,您可以指定从那里到缓存目录的其余路径,也path
可以使用点,以便指向外部目录的根目录.
当你使用
该方法getFileForUri
正在检查文件的路径是否以不包含的路径开头/storage/emulated/0/cache/image/
,因为文件的路径是/storage/emulated/0/Android/data/com.tizi.quanzi/cache/image/
.这就是你获得例外的原因.
从支持库24.2.0开始,您可以使用:
有关更多详细信息,请参阅FileProvider文档.