我的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/..
之前。
答案 0 :(得分:0)
当某个软件包想要访问我的应用程序的内部文件时,会发现缺少权限。我无法弄清楚如何正确地授予这些权限,尽管我尝试了在这个主题的许多SO帖子中找到的所有内容。切换到外部存储而不是内部存储解决了这个问题。