我正在创建一个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文件?另外,如何正确共享我的应用程序中预加载的图像,以便每个应用程序都能正确解释它?
答案 0 :(得分:3)
我通过正确实现FileProvider解决了这个问题! This guide helped me so much,但在这里我会做一个简短的总结。
在清单的obj = { a: 1, b:2}
Object.keys(obj).forEach( key => console.log(`${key} => ${obj[key]}`))
标记中,像这样开始声明新的FileProvider:
application
然后,创建一个名为<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>
的新目录(在Android Studio中按住Control键并单击xml
,然后转到“新建”>“目录”)。然后,在res
内创建一个名为xml
的新文件(按住Control键并单击新的file_provider_paths
目录,然后转到“新建”>“文件”,并将其命名为xml
)。将此代码添加到该新的xml文件中:
file_provider_paths.xml
最后,在您的MainActivity或类似的地方使用它:
<paths>
<cache-path name="cache" path="/" />
<files-path name="files" path="/" />
</paths>
要从// 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"));
目录中的图像中获得imageFile
,我首先将其转换为位图,然后转换为File对象,如下所示:
drawable
完成后,每个应用程序现在都可以看到您的共享图像!