ContentResolver 的查询结果有奇怪的列
ContentResolver's query results have strange columns
我想查询用户选择的图片或视频的数据。我的 onActivityResult 查询具有给定 URI 的图像的数据字段。
protected final String[] queryColumns = {MediaStore.MediaColumns.DATA, MediaStore.MediaColumns._ID, MediaStore.MediaColumns.MIME_TYPE};
[...]
Cursor cursor = getContentResolver().query(uri, queryColumns, null, null, null);
//uri is content://com.android.providers.media.documents/document/image%3A42026
但 DATA 列为空,相反,当我从查询中删除 queryColumns 时,我得到以下列和值:
0, name: document_id type: 3 ,data: image:42026
1, name: mime_type type: 3 ,data: image/jpeg
2, name: _display_name type: 3 ,data: 20170208_193525_Burst01.jpg
3, name: last_modified type: 1 ,data: 1486578925000
4, name: flags type: 1 ,data: 1
5, name: _size type: 1 ,data: 3246750
6, name: filePath type: 3 ,data: /storage/80BF-9F6E/DCIM/Camera/20170208_193525_Burst01.jpg
7, name: drmType type: 1 ,data: 0
8, name: drmMimeType type: 3 ,data: image/jpeg
9, name: drmContentType type: 1 ,data: 0
10, name: canForward type: 1 ,data: 1
11, name: judgeRight type: 1 ,data: -1
这些专栏来自哪里?我在哪里可以找到它们的定义?
启动意图的代码:
protected void galleryIntent() {
Intent intent = new Intent();
intent.setType("image/* video/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
if (Build.VERSION.SDK_INT >= 18) {
intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
startActivityForResult(Intent.createChooser(intent, "Select some files"), PICK_IMAGE_MULTIPLE);
} else {
startActivityForResult(Intent.createChooser(intent, "Select a file"), SELECT_FILE);
}
}
But DATA column is null
那是因为你的Uri
与MediaStore
无关。您不能从 randomly-selected 提供程序中选择 randomly-selected 列,并认为您可以为任何 randomly-selected Uri
.
获得这些列
Where this columns come from?
来自 com.android.providers.media.documents
ContentProvider
,在您的 Android 版本中实施,并且可能由您的设备制造商修改。
Where can I find their definitions?
大多数都不是 Android SDK 的一部分。 OpenableColumns
代表其中两列。
Code for starting an intent
您请求用户从任何支持选择视频的 ACTION_GET_CONTENT
activity 中选择一个视频。如果将 CATEGORY_OPENABLE
添加到 Intent
,则可以使用 ContentResolver
和 openInputStream()
读取 Uri
标识的内容。要求 Uri
由您可以从文件系统读取的文件支持,更不用说在给定 Uri
.
的情况下识别该文件的任何可靠方法了
我想查询用户选择的图片或视频的数据。我的 onActivityResult 查询具有给定 URI 的图像的数据字段。
protected final String[] queryColumns = {MediaStore.MediaColumns.DATA, MediaStore.MediaColumns._ID, MediaStore.MediaColumns.MIME_TYPE};
[...]
Cursor cursor = getContentResolver().query(uri, queryColumns, null, null, null);
//uri is content://com.android.providers.media.documents/document/image%3A42026
但 DATA 列为空,相反,当我从查询中删除 queryColumns 时,我得到以下列和值:
0, name: document_id type: 3 ,data: image:42026
1, name: mime_type type: 3 ,data: image/jpeg
2, name: _display_name type: 3 ,data: 20170208_193525_Burst01.jpg
3, name: last_modified type: 1 ,data: 1486578925000
4, name: flags type: 1 ,data: 1
5, name: _size type: 1 ,data: 3246750
6, name: filePath type: 3 ,data: /storage/80BF-9F6E/DCIM/Camera/20170208_193525_Burst01.jpg
7, name: drmType type: 1 ,data: 0
8, name: drmMimeType type: 3 ,data: image/jpeg
9, name: drmContentType type: 1 ,data: 0
10, name: canForward type: 1 ,data: 1
11, name: judgeRight type: 1 ,data: -1
这些专栏来自哪里?我在哪里可以找到它们的定义?
启动意图的代码:
protected void galleryIntent() {
Intent intent = new Intent();
intent.setType("image/* video/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
if (Build.VERSION.SDK_INT >= 18) {
intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
startActivityForResult(Intent.createChooser(intent, "Select some files"), PICK_IMAGE_MULTIPLE);
} else {
startActivityForResult(Intent.createChooser(intent, "Select a file"), SELECT_FILE);
}
}
But DATA column is null
那是因为你的Uri
与MediaStore
无关。您不能从 randomly-selected 提供程序中选择 randomly-selected 列,并认为您可以为任何 randomly-selected Uri
.
Where this columns come from?
来自 com.android.providers.media.documents
ContentProvider
,在您的 Android 版本中实施,并且可能由您的设备制造商修改。
Where can I find their definitions?
大多数都不是 Android SDK 的一部分。 OpenableColumns
代表其中两列。
Code for starting an intent
您请求用户从任何支持选择视频的 ACTION_GET_CONTENT
activity 中选择一个视频。如果将 CATEGORY_OPENABLE
添加到 Intent
,则可以使用 ContentResolver
和 openInputStream()
读取 Uri
标识的内容。要求 Uri
由您可以从文件系统读取的文件支持,更不用说在给定 Uri
.