- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在创建一个 Android 应用程序,用户可以在其中选择要共享的多个图像之一(存储在 drawable
文件夹中),该应用程序会打开一个标准的 ACTION_SEND 选择器以允许他们将其分享到任何支持 PNG 的应用程序,如下所示:
Uri imageUri = Uri.parse("android.resource://com.owlswipe.imagesharer/" + getImage());
Intent sendIntent = new Intent();
sendIntent.setAction(Intent.ACTION_SEND);
sendIntent.putExtra(Intent.EXTRA_STREAM, imageUri);
sendIntent.setType("image/png");
sendIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
startActivity(Intent.createChooser(sendIntent, "share to an app"));
public int getImage() {
return R.drawable.firstimage;
}
但是,如果用户选择将其分享到 Whatsapp,它就无法正常工作:它不会将其解释为图像(就像您通常将照片分享到 Whatsapp 一样),它认为这是一个名为“无标题”的文档,并且不显示为图像。
在计算机上打开此无标题文档会发现它名为 DOC-20180721-WA0012.
,没有文件扩展名!在文件名末尾手动添加 png
显示正确的图像。
使这个更奇怪(但绝对可以以某种方式解决!):
例如,如果用户选择在 SMS 应用程序中打开图片,则图片会正常显示。
这在多台设备上都发生过(P beta 上的 Pixel 2 和 7.1.1 上的 Nokia 2)
此问题不会发生在其他应用程序中,在这些应用程序中,PNG 可以像普通图像一样通过 Whatsapp 发送(尽管它们似乎确实会被 Whatsapp 自动转换为 JPEG)。
我该怎么做才能确保 Whatsapp 将我的图像视为正确的 PNG 文件?或者,如何从我的应用程序中正确共享预加载图像,以便每个应用程序都能正确解释它?
最佳答案
我通过正确实现 FileProvider 解决了这个问题! This guide helped me so much , 但我会在这里做一个简短的总结。
在您的 Manifest 的 application
标记中,开始声明您的新 FileProvider,如下所示:
<provider
android:name="android.support.v4.content.FileProvider"
android:grantUriPermissions="true"
android:exported="false"
android:authorities="${applicationId}">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_provider_paths"/>
</provider>
然后,创建一个名为 xml
的新目录(在 Android Studio 中按住 control 并单击 res
并转到 New > Directory)。然后,在 xml
中创建一个名为 file_provider_paths
的新文件(按住 Control 键并单击新的 xml
目录,然后转到新建 > 文件,然后命名它 file_provider_paths.xml
)。将这段代码添加到新的 xml 文件中:
<paths>
<cache-path name="cache" path="/" />
<files-path name="files" path="/" />
</paths>
最后,在您的 MainActivity 或任何地方使用它:
// create new Intent
Intent intent = new Intent();
intent.setAction(Intent.ACTION_SEND);
// set flag to give temporary permission to external app to use your FileProvider
intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
// generate URI, I defined authority as the application ID in the Manifest, the last param is file I want to open
Uri uri = FileProvider.getUriForFile(this, BuildConfig.APPLICATION_ID, imageFile);
intent.putExtra(Intent.EXTRA_STREAM, uri);
// Set type to only show apps that can open your PNG file
intent.setType("image/png");
// start activity!
startActivity(Intent.createChooser(intent, "send"));
为了从我的 drawable
目录中的图像中获取 imageFile
,我首先将其转换为 Bitmap,然后转换为 File 对象,如下所示:
// create file from drawable image
Bitmap bm = BitmapFactory.decodeResource(this.getResources(), R.drawable.yourbeautifulimage);
File filesDir = getApplicationContext().getFilesDir();
File imageFile = new File(filesDir, "ABeautifulFilename.png");
OutputStream os;
try {
os = new FileOutputStream(imageFile);
bm.compress(Bitmap.CompressFormat.PNG, 100, os); // 100% quality
os.flush();
os.close();
} catch (Exception e) {
Log.e(getClass().getSimpleName(), "Error writing bitmap", e);
}
大功告成,每个应用现在都可以看到您共享的图片了!
关于java - 将可绘制图像正确共享到其他应用程序(如果没有 FileProvider,将 PNG 共享到 Whatsapp 会失败),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51461324/
我有以下代码,它只适用于 Android 7 及以下版本。 Android 8 只显示一个空白文件,我手动打开 pdf 并且工作正常。 我有以下代码,这是 repo : private static
fileProvider 似乎没有将我的图像保存到外部存储。当我进入我的文件时,它创建了目录,但没有创建文件。我对 Android 编码相对陌生,所以请原谅我缺乏知识。 Fileprovider 位于
在我的 Android 应用程序中,我需要从 FileProvider 公开一些文件。如果没有加密,这非常简单:我只需将 FileProvider 添加到 manifest.xml 即可。
我有一个应用程序,我在其中捕获图像并将其设置为 ImageView,然后将其上传到服务器。但是,每当我捕获图像时,图像都不会显示,当我尝试上传图像时,我会得到 FileNotFoundExceptio
我有一个运行良好的 FileProvider,我可以将文件共享给任何应用程序,这是我的代码: 文件路径.xml: 设置共享 Intent : File f = new
我想使用 FileProvider访问 MyFirstApplication MySecondApplication 中的文件存储在内部目录中。我已经阅读了 FileProvider 的文档和示例。
我正在尝试做this tutorial . 我已遵循所有步骤,但由于错误说明而无法构建 Unresolved Class FileProvider 我已经安装了支持存储库。我目前的成绩如下: appl
我理解为什么 FileProvider 对于与另一个应用共享一个应用的私有(private)文件(应用的内部存储中的文件),同时控制权限很有用。 文档解释了如何使用它来共享外部存储(SD 卡等)中的文
我是 Android 编程的新手,学习过几个不同的教程。目标是将 pdf 文件从 Assets 文件夹复制到外部存储,然后在按下按钮打开 PDF 查看器时打开 Intent。我尝试使用 FilePro
我正在尝试测试 FileProvider tutorial . 它要求在 list 中包含: 在 list 中,我得到错误: Cannot resolve symbol FileProvider
我如何使用 FileProvider 提供辅助外部存储中的文件? ? 当前执行 FileProvider仅处理 ContextCompat.getExternalFilesDirs 返回的第一个目录
对于 Cache 目录中的文件,我可以在 xml 中添加它来设置 FileProvider 但是如果我将文件存储在外部缓存目录中,我无法获取外部缓存路径标签或类似的东西来设置 FilePro
我的 list 中有以下 FileProvider: 我在应用启动时遇到以下异常: java.lang.RuntimeException: Unable to
我无法打开下载文件夹中的任何文件。 我可以下载一个文件并保存在下载文件夹中: DownloadManager.Request request = new DownloadManager.Requ
我很好奇使用 android.support.v4.content.FileProvider 时的权限生命周期。 FileProvider 的文档说: Set the android:grantUri
我正在尝试让 Camera App 将输出存储到我的内部存储中。我还了解第三方应用程序无法访问我的应用程序的内部存储但是我们可以通过 FileProvider 公开内部目录来做到这一点。我已按照此处的
背景 针对 API 24 或更高版本,开发人员无需使用简单的“Uri.fromFile”命令,而是需要使用 FileProvider(或他们自己的 ContentProvider),以便让其他应用程序
A 正在开发 Android 项目。 我需要提供 ContentProvider 以提供对某些目录的访问。 FileProvider 这对我来说是一个很好的解决方案。 是否可以使用 FileProvi
这个问题已经有答案了: Permission Denial with File Provider through intent (4 个回答) 已关闭去年。 我正在尝试与 FileProvider 共
我制作了一个应用程序,该应用程序在一个文件夹(由同一应用程序创建)内创建一个 *.csv 文件,同时该文件位于 Android 的下载文件夹内。 该文件可以通过 ShareIntent 共享,问题是当
我是一名优秀的程序员,十分优秀!