Android共享意图的位图 – 是否有可能不保存之前共享?
我尝试使用共享意图从我的应用程序导出位图,而不保存临时位置的文件。 我发现的所有例子是两步1)保存到SD卡,并创build该文件的Uri 2)开始与此Uri意图
是否有可能使它不需要WRITE_EXTERNAL_STORAGE权限,保存文件[并在之后删除]? 如何解决没有ExternalStorage的设备?
我有这个相同的问题。 我不想要求读写外部存储的权限。 而且,当手机没有SD卡或者卡没有安装时,有时候会出现问题。
以下方法使用名为FileProvider的ContentProvider 。 从技术上讲,在共享之前,您仍然保存位图(在内部存储器中),但不需要请求任何权限。 另外,每次共享位图时,图像文件都会被覆盖。 而且由于它在内部caching中,所以当用户卸载应用程序时,它将被删除。 所以在我看来,这和保存图像一样好。 此方法比将其保存到外部存储更安全。
文档非常好(参见下面的深入阅读),但是有些部分有点棘手。 这是一个为我工作的总结。
在Manifest中设置FileProvider
<manifest> ... <application> ... <provider android:name="android.support.v4.content.FileProvider" android:authorities="com.example.myapp.fileprovider" android:grantUriPermissions="true" android:exported="false"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/filepaths" /> </provider> ... </application> </manifest>
将com.example.myapp
replace为您的应用程序包名称。
创buildres / xml / filepaths.xml
<?xml version="1.0" encoding="utf-8"?> <paths xmlns:android="http://schemas.android.com/apk/res/android"> <cache-path name="shared_images" path="images/"/> </paths>
这告诉FileProvider在哪里获得文件共享(在这种情况下使用caching目录)。
将图像保存到内部存储器
// save bitmap to cache directory try { File cachePath = new File(context.getCacheDir(), "images"); cachePath.mkdirs(); // don't forget to make the directory FileOutputStream stream = new FileOutputStream(cachePath + "/image.png"); // overwrites this image every time bitmap.compress(Bitmap.CompressFormat.PNG, 100, stream); stream.close(); } catch (IOException e) { e.printStackTrace(); }
分享图像
File imagePath = new File(context.getCacheDir(), "images"); File newFile = new File(imagePath, "image.png"); Uri contentUri = FileProvider.getUriForFile(context, "com.example.myapp.fileprovider", newFile); if (contentUri != null) { Intent shareIntent = new Intent(); shareIntent.setAction(Intent.ACTION_SEND); shareIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); // temp permission for receiving app to read this file shareIntent.setDataAndType(contentUri, getContentResolver().getType(contentUri)); shareIntent.putExtra(Intent.EXTRA_STREAM, contentUri); startActivity(Intent.createChooser(shareIntent, "Choose an app")); }
进一步阅读
- FileProvider
- 存储选项 – 内部存储
- 共享文件
- 保存文件
我尝试使用共享意图从我的应用程序导出位图,而不保存临时位置的文件。
理论上这是可能的。 实际上,这可能是不可能的。
从理论上讲,你需要共享的是一个Uri
,它将parsing为位图。 最简单的方法是如果这是一个可以被其他应用程序直接访问的文件,比如在外部存储上。
为了不写入flash,你需要实现你自己的ContentProvider
,找出如何实现openFile()
来返回你的内存位图,然后在ACTION_SEND
Intent
传递一个代表该位图的Uri
。 由于openFile()
需要返回一个ParcelFileDescriptor
,我不知道如果没有磁盘表示,你会怎么做,但我没有花太多时间search。
是否有可能使它不需要WRITE_EXTERNAL_STORAGE权限,保存文件[并在之后删除]?
如果您不想在外部存储上使用它,则可以使用内部存储上的文件转到ContentProvider
路由。 此示例项目演示了一个ContentProvider
,它通过ACTION_VIEW
将PDF文件提供给设备上的PDF查看器; ACTION_SEND
可以使用相同的方法。