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.myappreplace为您的应用程序包名称。

创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可以使用相同的方法。