从 Google 照片提供者中选择视频不提供 mimetype 信息
Selecting video from Google Photos provider doesn't give mimetype information
我创建了一个示例 here 来重现此问题。
我 运行 这个项目是在模拟器上 API 级别 29 和 select 从 google 照片提供商那里下载视频。
但我不知道如何获取 selected 文件的 mimeType。
我使用了 returns null 的 ContentResolver 的 getType 方法以及以某种方式向我抛出 IllegalArgumentException 的 ContentResolver 查询方法。我附上了相同的屏幕截图。
注意:如果我通过目录导航 select 同一文件,一切正常,但是当我使用 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);
谁能帮我找出 selected 文件的 mimetype 的正确方法?
PS:我试过 ContentResolver.getType、MimeTypeMap 和 ContentResolver.query。 None 其中有效。
这是我用来获取 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
}
希望对您有所帮助!
我浪费了几天时间试图找出问题所在。不幸的是,它是 google 照片版本 4.17 中的一个错误,似乎在版本 4.32
中已修复
这是链接的 google 问题 https://issuetracker.google.com/issues/149416521
我创建了一个示例 here 来重现此问题。
我 运行 这个项目是在模拟器上 API 级别 29 和 select 从 google 照片提供商那里下载视频。
但我不知道如何获取 selected 文件的 mimeType。
我使用了 returns null 的 ContentResolver 的 getType 方法以及以某种方式向我抛出 IllegalArgumentException 的 ContentResolver 查询方法。我附上了相同的屏幕截图。
注意:如果我通过目录导航 select 同一文件,一切正常,但是当我使用 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);
谁能帮我找出 selected 文件的 mimetype 的正确方法? PS:我试过 ContentResolver.getType、MimeTypeMap 和 ContentResolver.query。 None 其中有效。
这是我用来获取 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
}
希望对您有所帮助!
我浪费了几天时间试图找出问题所在。不幸的是,它是 google 照片版本 4.17 中的一个错误,似乎在版本 4.32
中已修复这是链接的 google 问题 https://issuetracker.google.com/issues/149416521