Android 实现 文件操作获取所有视频,异步查询媒体数据库获取视频的时长,并将视频通过recyclerView展示出来,每个item展示获取的视频时长代码实现
时间: 2023-04-08 14:01:02 浏览: 73
以下是代码实现:
```
// 获取所有视频
String[] projection = {MediaStore.Video.Media._ID, MediaStore.Video.Media.DATA};
Cursor cursor = getContentResolver().query(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, projection, null, null, null);
// 异步查询媒体数据库获取视频的时长
new AsyncTask<Void, Void, Void>() {
@Override
protected Void doInBackground(Void... voids) {
if (cursor != null) {
while (cursor.moveToNext()) {
int id = cursor.getInt(cursor.getColumnIndex(MediaStore.Video.Media._ID));
String path = cursor.getString(cursor.getColumnIndex(MediaStore.Video.Media.DATA));
MediaMetadataRetriever retriever = new MediaMetadataRetriever();
retriever.setDataSource(path);
String duration = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION);
// 将视频通过recyclerView展示出来
runOnUiThread(() -> {
Video video = new Video(id, path, duration);
videoList.add(video);
adapter.notifyItemInserted(videoList.size() - 1);
});
}
cursor.close();
}
return null;
}
}.execute();
```
其中,Video类的定义如下:
```
public class Video {
private int id;
private String path;
private String duration;
public Video(int id, String path, String duration) {
this.id = id;
this.path = path;
this.duration = duration;
}
public int getId() {
return id;
}
public String getPath() {
return path;
}
public String getDuration() {
return duration;
}
}
```
在RecyclerView的Adapter中,可以通过ViewHolder展示获取的视频时长:
```
public class VideoAdapter extends RecyclerView.Adapter<VideoAdapter.ViewHolder> {
private List<Video> videoList;
static class ViewHolder extends RecyclerView.ViewHolder {
ImageView videoImage;
TextView videoDuration;
public ViewHolder(View view) {
super(view);
videoImage = view.findViewById(R.id.video_image);
videoDuration = view.findViewById(R.id.video_duration);
}
}
public VideoAdapter(List<Video> videoList) {
this.videoList = videoList;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.video_item, parent, false);
ViewHolder holder = new ViewHolder(view);
return holder;
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
Video video = videoList.get(position);
holder.videoImage.setImageBitmap(getVideoThumbnail(video.getPath()));
holder.videoDuration.setText(formatDuration(video.getDuration()));
}
@Override
public int getItemCount() {
return videoList.size();
}
// 获取视频缩略图
private Bitmap getVideoThumbnail(String path) {
MediaMetadataRetriever retriever = new MediaMetadataRetriever();
retriever.setDataSource(path);
return retriever.getFrameAtTime();
}
// 格式化视频时长
private String formatDuration(String duration) {
long milliseconds = Long.parseLong(duration);
long seconds = milliseconds / 1000;
long minutes = seconds / 60;
seconds = seconds % 60;
return String.format("%02d:%02d", minutes, seconds);
}
}
```