ACTION_SEND: неверная MIME отправлена ​​в WhatsApp, что приводит к отсутствию миниатюр

Мое приложение управляет несколькими видео и фотографиями, загруженными с устройства IoT. Он загружает видео и фотографии с этих устройств и размещает их во внешних приложениях. Downloads каталог (извлекается с context.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS)).

Приложение предлагает функцию обмена, которая использует ACTION_SEND намерение экспортировать файл в другое приложение.

Я наблюдал различное поведение с моим приложением, основанным на версии ОС Android телефонов. Мой тест прост: поделитесь одним и тем же файлом (одной фотографией) с 3 различными приложениями: 1) WhatsApp, 2) Gmail 3) InShot.

На Android 7.0 поведение приложения неполное:

  1. WhatsApp: невозможно отобразить миниатюру изображения, файл отправляется как "документ". Скриншот демонстрации WhatsApp
  2. Gmail: нет проблем, файл передается в Gmail правильно, включая миниатюру Демонстрация Gmail
  3. InShot: не удается получить файл и показывает сообщение об ошибке. InShot демонстрация

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

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?

0 ответов

Этот вопрос был решен путем обеспечения передачи имени файла в нижнем регистре.

Некоторые телефоны на базе Android отключились, а другие нет.

Другие вопросы по тегам