Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/204.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 操作\发送:发送到WhatsApp的mime不正确,导致缺少缩略图_Android_Android Intent_Android Support Library_Android Sharing - Fatal编程技术网

Android 操作\发送:发送到WhatsApp的mime不正确,导致缺少缩略图

Android 操作\发送:发送到WhatsApp的mime不正确,导致缺少缩略图,android,android-intent,android-support-library,android-sharing,Android,Android Intent,Android Support Library,Android Sharing,我的应用程序管理从物联网设备下载的一些视频和照片。它从这些设备下载视频和照片,并将它们放在Apps externaldownloads目录中(通过context.getExternalFilesDir(Environment.directory\u downloads)检索) 该应用程序提供了一个共享功能,利用操作发送意图将文件导出到另一个应用程序 我观察到我的应用程序的不同行为,基于手机的Android操作系统版本。我的测试很简单:将同一个文件(一张照片)共享给3个不同的应用程序:1)What

我的应用程序管理从物联网设备下载的一些视频和照片。它从这些设备下载视频和照片,并将它们放在Apps external
downloads
目录中(通过
context.getExternalFilesDir(Environment.directory\u downloads)
检索)

该应用程序提供了一个共享功能,利用
操作发送
意图将文件导出到另一个应用程序

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

在Android 7.0上,应用程序行为不完整:
  • WhatsApp:无法显示图像缩略图,文件作为“文档”发送。
  • Gmail:没问题,文件被正确地发送到Gmail,包括一个缩略图
  • InShot:无法检索文件并显示错误消息。
  • 在安卓8.0上,一切正常。
  • WhatsApp:显示视频或照片编辑器,然后正确复制文件
  • Gmail:没问题,如上所述
  • InShot:没问题,文件可以导入
  • 代码 该应用程序使用的是导出文件,因为这是Android上的标准

    支持库版本为27.1.0

    相关代码部分如下所示:

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

    <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>
    

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

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


    一些安卓手机确实遇到了这个问题,而其他手机没有。

    显然,我对MIME的看法是不正确的-文件扩展名必须是小写。感谢您提及解决方案。我对此简直发疯了:)只是想知道你是怎么想出这个解决方案的?@zeke主要是通过在办公室的所有不同Android手机上做大量的头发和测试。
    <?xml version="1.0" encoding="utf-8"?>
    <paths>
        <external-files-path
            name="Download"
            path="Download"/>
    </paths>
    
    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);