尽管使用了ContentProvider,但无法从内部存储共享图像

时间:2015-12-06 10:10:36

标签: android android-contentprovider

我的Android应用程序使用Facebook的Fresco库从互联网上下载一些图像。为了在WebView中显示这些图像并共享它们,我使用Fresco检索图像并将它们写入App的内部缓存目录中的临时文件:

final File tempFile = new File(new File(cx.getCacheDir(), "fresco_cache/"), filename);
saveInputStream(tempFile, is, new FileSaverCallback() {
    @Override
    public void onSuccess() {
        Uri localUri = CacheContentProvider.getContentUriFromUrlOrUri(url);
        callback.onSuccess(url, localUri.toString());
    }

    @Override
    public void onFailure() {
        callback.onFailure(url);
    }
});

然后,我有一个自定义ContentProvider用于提供对这些文件的访问。提供程序成功解析Uri,因为我在内部使用内容URI而不是真实文件路径。但是,当我尝试使用

分享图像时
Intent shareIntent = new Intent();
shareIntent.setAction(Intent.ACTION_SEND);
shareIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse(ARG_IMAGE_URI));
shareIntent.setType("image/*");
startActivity(Intent.createChooser(shareIntent, "Share"));

共享不适用于大多数应用程序,但可以与少数应用程序一起使用。例如,我可以使用K-9将文件附加到电子邮件中,但不能与Google Keep共享(它说:“导入数据时出错”)。

我的ContentProvider注册如下:

<provider
    android:name=".helpers.CacheContentProvider"
    android:authorities="my.app.files"
    android:exported="true"
    android:grantUriPermissions="true"/>

我检查过,openFile()函数被正确调用并返回有效的ParcelFileOpener

@Override
public ParcelFileDescriptor openFile(Uri uri, String mode) throws FileNotFoundException {
    final File f = getFileForUri(getContentUriFromUrlOrUri(uri.toString()));

    if (f.exists())
        return ParcelFileDescriptor.open(f, ParcelFileDescriptor.MODE_READ_ONLY);

    throw new FileNotFoundException(uri.getPath());
}

如何调试该问题?我该怎么办?

编辑:共享用于处理我的代码的旧实现,我使用Universal Image Loader而不是Fresco。我看到的唯一区别是,现在图像被保存到内部缓存,而在它们保存到/sdcard/data/my.app/..之前。

1 个答案:

答案 0 :(得分:0)

当某个软件包想要访问我的应用程序的内部文件时,会发现缺少权限。我无法弄清楚如何正确地授予这些权限,尽管我尝试了在这个主题的许多SO帖子中找到的所有内容。切换到外部存储而不是内部存储解决了这个问题。