Я создал образец здесь , чтобы воспроизвести эту проблему. Я запускаю этот проект на эмуляторе с уровнем API 29 и выбираю видео от поставщика фотографий Google. Но я не могу понять, как получить mimeType для выбранного файла. Я использовал метод getType ContentResolver, который возвращает значение null, а также метод запроса ContentResolver, который каким-то образом выдает мне исключение IllegalArgumentException. Я приложил скриншот для того же.
Примечание. Все работает нормально, если я выбираю один и тот же файл при навигации по каталогам, но когда я использую провайдер фотографий 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. Ни один из них не работает.