【发布时间】:2021-12-28 04:18:43
【问题描述】:
我想在 Android >=10 上使用 Media Store 访问共享存储中的媒体文件/视频。 我阅读了谷歌开发者文档但没有得到答案(https://developer.android.com/training/data-storage/shared/media)。 我想使用 MediaStore.Video 从共享存储访问视频。
我尝试了以下代码,但它没有工作,甚至没有打开选择菜单的菜单:
public class MainActivity extends AppCompatActivity {
List<Video> videoList = new ArrayList<Video>(); //Video is a class.
Uri collection;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//Media Store
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
collection = MediaStore.Video.Media.getContentUri(MediaStore.VOLUME_EXTERNAL);
} else {
collection = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
}
String[] projection = new String[] {
MediaStore.Video.Media._ID,
MediaStore.Video.Media.DISPLAY_NAME,
MediaStore.Video.Media.DURATION,
MediaStore.Video.Media.SIZE
};
String selection = MediaStore.Video.Media.DURATION +
" >= ?";
String[] selectionArgs = new String[] {
String.valueOf(TimeUnit.MILLISECONDS.convert(5, TimeUnit.MINUTES))
};
String sortOrder = MediaStore.Video.Media.DISPLAY_NAME + " ASC";
try (Cursor cursor = getApplicationContext().getContentResolver().query(
collection,
projection,
selection,
selectionArgs,
sortOrder)) {
// Cache column indices.
int idColumn = ((Cursor) cursor).getColumnIndexOrThrow(MediaStore.Video.Media._ID);
int nameColumn = cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DISPLAY_NAME);
int durationColumn = cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DURATION);
int sizeColumn = cursor.getColumnIndexOrThrow(MediaStore.Video.Media.SIZE);
while (cursor.moveToNext()) {
// Get values of columns for a given video.
long id = cursor.getLong(idColumn);
String name = cursor.getString(nameColumn);
int duration = cursor.getInt(durationColumn);
int size = cursor.getInt(sizeColumn);
Uri contentUri = ContentUris.withAppendedId(
MediaStore.Video.Media.EXTERNAL_CONTENT_URI, id);
// Stores column values and the contentUri in a local object
// that represents the media file.
videoList.add(new Video(contentUri, name, duration, size));
}
}
}
}
//Video Class
public class Video {
private final Uri uri;
private final String name;
private final int duration;
private final int size;
public Uri getUri() {
return uri;
}
public String getName() {
return name;
}
public int getDuration() {
return duration;
}
public int getSize() {
return size;
}
public Video(Uri uri, String name, int duration, int size) {
this.uri = uri;
this.name = name;
this.duration = duration;
this.size = size;
}
}
【问题讨论】:
-
want to access the media files/ videos from the shared storage using Media Store好的。但也将其放在您帖子的主题中。 -
检查是否返回任何视频而不添加任何过滤器,为
selection和selectionArgs传递null并查看。
标签: java android scoped-storage