当前位置: 首页 > 知识库问答 >
问题:

如何为外部缓存目录中的文件设置FileProvider

百里意智
2023-03-14

对于缓存目录中的文件,我可以将其添加到xml中以设置FileProvider

    <cache-path
    name="image"
    path="image/"/>

但是如果我将文件存储在外部缓存Dir中,我就无法获得外部缓存路径标记或类似的东西来设置文件提供商。而且

    <external-path
    name="image_external"
    path="cache/image/"/>

也没有帮助。

这是我的清单文件:

 <provider
        android:name="android.support.v4.content.FileProvider"
        android:authorities="com.tizi.quanzi"
        android:exported="false"
        android:grantUriPermissions="true">
        <meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"
            android:resource="@xml/file_paths"/>
 </provider>

这是xml/file_paths文件:

<?xml version="1.0" encoding="utf-8"?>
<paths>
    <cache-path
        name="image"
        path="image/"/>
    <external-path
        name="image_external"
        path="cache/image/"/>
</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)

共有3个答案

蒋向笛
2023-03-14

以下配置适用于我:我使用

    <paths>
      <external-cache-path name="external_files" path="."/>
      <external-path name="external_files" path="."/>
    </paths>

在我的代码里。

我的提供者看起来像这样

 <provider
        android:name="android.support.v4.content.FileProvider"
        android:authorities="com.bqe.core.provider.CameraFilesProvider"
        android:exported="false"
        android:grantUriPermissions="true">
        <meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"
            android:resource="@xml/camera_files_provider_paths" />

我的min sdk

           minSdkVersion 21
全心思
2023-03-14

从支持库24.2.0开始,您可以使用:

<external-cache-path name="name" path="path" />

有关更多详细信息,请参阅FileProvider文档。

邹星火
2023-03-14

更新:
支持库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,正如你所说,没有外部缓存dir的标记,只有下面的四个。

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";

我要做的是使用外部路径标记。此标记将指向外部目录的根目录,而不是缓存目录。因此,您可以指定从那里到path上的缓存目录的其余路径,也可以使用点使其指向外部目录的根。

   <external-path
    name="external_files"
    path="."/>

当你使用

<external-path
    name="image_external"
    path="cache/image/"/>

方法getFileForUri检查文件的路径是否以/storage/emulated/0/cache/image/开头,而不是以/storage/emulated/0/Android/data/com>开头,因为文件的路径是/storage/emulated/0/Android/data/com。提兹。泉子/cache/image/。这就是你得到例外的原因。

 类似资料:
  • 问题内容: 我在Firebase上运行了PWA。我的图像文件托管在Firebase存储上。我注意到我的浏览器没有保存从存储系统加载的文件的缓存。浏览器会为每次页面刷新请求文件。这会导致不必要的延迟和流量。 我的JS脚本从Firebase存储的下载链接加载文件,例如:https ://firebasestorage.googleapis.com/v0/b/discipulado-7b14b.apps

  • 我在Intellij中运行SpringBoot应用程序时遇到一些问题。@springboot应用程序位于子模块中 MainApplication.java有注释@重要资源("classpath:/beans.xml") “配置”模块有pom.xml,没有java文件。它只生成资源 我试图在Intellij上运行配置,但它为文件bean生成错误FileNotFoundException。xml。这个

  • 问题内容: 我一直在开发一些Node应用程序,并且一直在寻找一种存储与部署相关的设置的良好模式。在Django世界(我来自哪里)中,通常的做法是创建一个包含标准设置(时区等)的文件,然后包含一个用于部署特定设置的文件。与哪个数据库进行通信,什么Memcache套接字,管理员的电子邮件地址等等。 我一直在寻找Node的类似模式。只需一个配置文件就可以了,因此它不必与中的其他所有文件一起使用,但是我发

  • 我无法在缓存目录中写入文件 使用context.filesdir(但不使用context.cachedir)可以很好地工作。我正在使用libaums库读取USB文件。

  • 我使用Codeigniter与Hostgator共享托管。 如何在public_html 403中设置子目录/文件夹?但此文件夹中的文件是可访问的。 例子: /public_html/this_forlder_forbidden/this-file-not-forbidden.ext 例1 /public_html/js/jquery。js /public_html/css/style.css 下

  • 除此之外,是否有一种方法可以更改输出文件名? 这是到目前为止的代码: