Выбор видео у провайдера Google Photos не дает информации о типе mimetype. - PullRequest
6 голосов
/ 12 февраля 2020

Я создал образец здесь , чтобы воспроизвести эту проблему. Я запускаю этот проект на эмуляторе с уровнем API 29 и выбираю видео от поставщика фотографий Google. Но я не могу понять, как получить mimeType для выбранного файла. Я использовал метод getType ContentResolver, который возвращает значение null, а также метод запроса ContentResolver, который каким-то образом выдает мне исключение IllegalArgumentException. Я приложил скриншот для того же. enter image description here

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

Это мой код ::

protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent intent) {
        super.onActivityResult(requestCode, resultCode, intent);
        if (resultCode == RESULT_OK && requestCode == IMAGE_VIDEO_FETCH) {
            Uri selectedFileURI = intent.getData();
            String type = this.getContentResolver().getType(selectedFileURI);

            if (type == null || TextUtils.isEmpty(type)) {
                // This shouldn't happen right?
                // Since https://developer.android.com/training/secure-file-sharing/retrieve-info
                // mentions a FileProvider determines the file's MIME type from its filename extension. I've to add this block
                Cursor cursor = null;
                try {
                    cursor = getContentResolver().query(selectedFileURI, null, null, null, null);
                    if (cursor != null && cursor.moveToFirst()) {
                        int colIndex = cursor.getColumnIndex(MediaStore.MediaColumns._ID);
                        type = cursor.getString(colIndex);
                    }
                } catch (IllegalArgumentException e) {
                    Log.d("Check Type :: ", type + "");
                    e.printStackTrace();
                } finally {
                    if (cursor != null) {
                        cursor.close();
                    }
                }
            } else {
                Log.d("Type:: ", type + "");
            }
        }
    }

И вот как я начинаю намерение ::

Intent i = new Intent(Intent.ACTION_GET_CONTENT);
i.setType("video/*");
startActivityForResult(i, IMAGE_VIDEO_FETCH);

Может кто-нибудь помочь мне с правильный способ выяснить mimetype выбранного файла? PS: я пробовал ContentResolver.getType, MimeTypeMap и ContentResolver.query. Ни один из них не работает.

Ответы [ 2 ]

1 голос
/ 21 февраля 2020

Я потратил пару дней, пытаясь выяснить, где существует проблема. К сожалению, это оказалось ошибкой в ​​google photos версии 4.17, которая, по-видимому, исправлена ​​в версии 4.32

Вот связанная проблема Google https://issuetracker.google.com/issues/149416521

0 голосов
/ 21 февраля 2020

Это то, что я использую для получения MimeType: к сожалению, оно в Kotlin, но давайте попробуем использовать Kotlin, гораздо лучше.

 @SuppressLint("DefaultLocale")
fun getMimeType(uri: Uri): String {
    val mimeType: String
    mimeType = if (uri.scheme == ContentResolver.SCHEME_CONTENT) {
       // Replace MyApplication.getInstance() by your context
        val cr = MyApplication.getInstance().contentResolver
        cr.getType(uri).toString()
    } else {
        val fileExtension = MimeTypeMap.getFileExtensionFromUrl(
            uri
                .toString()
        )
        MimeTypeMap.getSingleton().getMimeTypeFromExtension(
            fileExtension.toLowerCase()
        ).toString()
    }
    return mimeType
}

Надеюсь, это поможет!

...