Android媒体库
简介
在Android开发中,媒体库(MediaStore)是一个非常重要的组件,它提供了访问设备上媒体文件(如照片、音频、视频)的能力。通过媒体库,我们可以获取设备上的媒体文件列表,进行浏览、搜索、播放等操作。本文将介绍Android媒体库的使用方法,并通过代码示例演示其基本功能。
媒体库概览
媒体库是Android提供的一个系统服务,它维护了设备上媒体文件的索引和相关信息。在应用中,我们可以通过ContentResolver对媒体库进行访问。媒体库的数据存储在Android的数据库中,主要包括以下几张表:
- Media(媒体文件表):存储了媒体文件的基本信息,如文件路径、文件名、文件大小、创建时间等。
- Files(文件表):存储了文件的详细信息,如文件的MIME类型、媒体类型、拍摄时间等。
- Images(图片表):存储了图片文件的详细信息,如图片的宽度、高度、Exif信息等。
- Audio(音频表):存储了音频文件的详细信息,如音频的时长、艺术家、专辑等。
- Video(视频表):存储了视频文件的详细信息,如视频的时长、分辨率、拍摄地点等。
媒体库的基本用法
下面通过代码示例,演示如何使用媒体库获取设备上的媒体文件列表,并显示在RecyclerView中。
添加权限和依赖
首先,在AndroidManifest.xml文件中添加以下权限:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
然后,在app/build.gradle文件中添加以下依赖:
implementation 'androidx.recyclerview:recyclerview:1.2.1'
创建数据模型
我们首先需要定义一个数据模型类,用于保存媒体文件的基本信息。在这里,我们定义一个MediaItem类:
public class MediaItem {
private String path; // 文件路径
private String name; // 文件名
private long size; // 文件大小
public MediaItem(String path, String name, long size) {
this.path = path;
this.name = name;
this.size = size;
}
// 省略getter和setter方法
}
创建RecyclerView Adapter
接下来,我们需要创建一个RecyclerView的适配器来显示媒体文件列表。在这里,我们定义一个MediaAdapter类:
public class MediaAdapter extends RecyclerView.Adapter<MediaAdapter.ViewHolder> {
private List<MediaItem> mediaList;
public MediaAdapter(List<MediaItem> mediaList) {
this.mediaList = mediaList;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_media, parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
MediaItem mediaItem = mediaList.get(position);
holder.tvName.setText(mediaItem.getName());
holder.tvSize.setText(String.format(Locale.getDefault(), "%.2f MB", mediaItem.getSize() / (1024.0 * 1024.0)));
}
@Override
public int getItemCount() {
return mediaList.size();
}
public static class ViewHolder extends RecyclerView.ViewHolder {
public TextView tvName;
public TextView tvSize;
public ViewHolder(@NonNull View itemView) {
super(itemView);
tvName = itemView.findViewById(R.id.tv_name);
tvSize = itemView.findViewById(R.id.tv_size);
}
}
}
查询媒体文件列表
在MainActivity中,我们使用ContentResolver查询媒体文件列表,并绑定到RecyclerView上。在这里,我们使用AsyncTask来执行查询操作,以避免在主线程中执行耗时操作。以下是查询媒体文件列表的代码示例:
public class MainActivity extends AppCompatActivity {
private RecyclerView recyclerView;
private MediaAdapter mediaAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
recyclerView = findViewById(R.id.recycler_view);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
mediaAdapter = new MediaAdapter(new