ACTION_SEND:发送给WhatsApp的mime不正确导致缩略图丢失

时间:2018-03-22 08:30:02

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

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

该应用提供共享功能,该功能利用ACTION_SEND意图将文件导出到其他应用。

根据手机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
  4. 在Android 8.0上,一切都按预期工作。

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

      该应用正在使用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>
      

      paths.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 = createSharingIntent(activity, videos)
      Intent chooser = Intent.createChooser(intent, activity.getString(R.string.share_files));
      activity.startActivity(chooser);
      

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

1 个答案:

答案 0 :(得分:0)

通过确保文件名使用小写字母来解决此问题。

有些Android手机确实做到了这一点,而另一些则没有。