android - ACTION_SEND : Incorrect mime sent to WhatsApp resulting in missing Thumbnails

标签 android android-intent android-support-library android-sharing

我的应用程序管理从 IoT 设备下载的一些视频和照片。它从这些设备下载视频和照片并将它们放在应用程序外部 Downloads目录(使用 context.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS) 检索)。

该应用程序提供了一个分享功能,它利用了ACTION_SEND Intent 将文件导出到另一个应用程序。

根据手机的 Android 操作系统版本,我观察到我的应用程序有不同的行为。我的测试很简单:将同一个文件(一张照片)共享到 3 个不同的应用程序:1) WhatsApp,2) Gmail 3) InShot .

在Android 7.0上,App行为不完整:

  1. WhatsApp:无法显示图像缩略图,文件作为“文档”发送。 WhatsApp demonstration screenshot
  2. Gmail:没问题,文件已正确发送到 Gmail,包括缩略图 Gmail demonstration
  3. InShot:无法检索文件并显示错误消息。 InShot demontration

在 Android 8.0 上,一切正常。

  1. WhatsApp:显示视频或照片编辑器,然后正确复制文件。
  2. Gmail:没问题,如上所述。
  3. InShot:没问题,可以导入文件。

代码

该应用程序正在使用 FileProvider导出文件,因为它现在是 Android 上的标准。

支持库版本为 27.1.0

相关代码部分如下所示:

AndroidManifest.xml

没什么特别的,只有默认配置和指向 paths.xml 的链接。 applicationId 和 filesAuthority 占位符已正确替换。

<provider
    android:name="android.support.v4.content.FileProvider"
    android:authorities="${applicationId}${filesAuthority}"
    android:exported="false"
    android:grantUriPermissions="true">
    <meta-data
        android:name="android.support.FILE_PROVIDER_PATHS"
        android:resource="@xml/paths"/>
</provider>

路径.xml

<?xml version="1.0" encoding="utf-8"?>
<paths>
    <external-files-path
        name="Download"
        path="Download"/>
</paths>

createSharingIntent(context: Context, videos: List<Video>): Intent

var hasVideos = false
var hasImages = false

var items = emptyArray<ClipData.Item>()
var contentTypes = emptyArray<String>()

// Create ClipData items & contentTypes which help to further specify the Intent contents.
for (video in videos) {
    items += ClipData.Item(FileProvider.getUriForFile(context, BuildConfig.FILES_AUTHORITY, File(video.path)))
    contentTypes += (if (video.isJpg) IMAGE_JPG else MediaFormat.MIMETYPE_VIDEO_AVC)

    if (video.isJpg) {
        hasImages = true
    } else {
        hasVideos = true
    }
}

// Build the Intent
val intent: Intent

val intentType = when {
    hasImages && hasVideos -> "*/*"
    hasImages -> IMAGE_JPG
    else -> MediaFormat.MIMETYPE_VIDEO_AVC
}

intent = if (items.size > 1) {
    Intent().setAction(Intent.ACTION_SEND_MULTIPLE)
            .setType(intentType)
            .putParcelableArrayListExtra(Intent.EXTRA_STREAM, ArrayList(items.map { it.uri }))
} else {
    Intent().setAction(Intent.ACTION_SEND)
            .setDataAndTypeAndNormalize(items[0].uri, intentType)
            .putExtra(Intent.EXTRA_STREAM, items[0].uri)
}

intent.flags = Intent.FLAG_GRANT_READ_URI_PERMISSION.or(Intent.FLAG_GRANT_WRITE_URI_PERMISSION)

// Specify more detail in ClipData - which might be helpful for 
val clipData = ClipData("Export", contentTypes, items[0])
for (i in 1 until items.size) {
    clipData.addItem(items[i])
}
intent.clipData = clipData

return intent

接受 Intent 并发送

Intent intent = createSharingIntent(activity, videos)
Intent chooser = Intent.createChooser(intent, activity.getString(R.string.share_files));
activity.startActivity(chooser);

创建相同的行为缺少什么 - 最重要的是 - 确保 WhatsApp 和其他应用程序可以正确看到图像,例如 Gmail?

最佳答案

通过确保以小写形式传递文件名解决了这个问题。

一些 Android 手机确实遇到了这个问题,而另一些则没有。

关于android - ACTION_SEND : Incorrect mime sent to WhatsApp resulting in missing Thumbnails,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49423832/

相关文章:

android - 如何获取 1 个月的 GPRS 移动数据使用量?

android - 如何在带有改造的android中显示HTML响应

java - Android应用程序java lang异常

android - 获取接收者的 Intent 过滤器

java - 找不到处理 Intent 应用程序设置的 Activity

android - NotificationCompat 和 API 检查

android - Android中是否有像图像处理中的OpenCV这样的音频处理库?

android - 没有找到 android :elevation 的资源标识符

Android 支持工具栏无法正确显示自定义可绘制对象

android - Gradle Build for lib:androidJavadocs失败