Android媒体库

简介

在Android开发中,媒体库(MediaStore)是一个非常重要的组件,它提供了访问设备上媒体文件(如照片、音频、视频)的能力。通过媒体库,我们可以获取设备上的媒体文件列表,进行浏览、搜索、播放等操作。本文将介绍Android媒体库的使用方法,并通过代码示例演示其基本功能。

媒体库概览

媒体库是Android提供的一个系统服务,它维护了设备上媒体文件的索引和相关信息。在应用中,我们可以通过ContentResolver对媒体库进行访问。媒体库的数据存储在Android的数据库中,主要包括以下几张表:

  1. Media(媒体文件表):存储了媒体文件的基本信息,如文件路径、文件名、文件大小、创建时间等。
  2. Files(文件表):存储了文件的详细信息,如文件的MIME类型、媒体类型、拍摄时间等。
  3. Images(图片表):存储了图片文件的详细信息,如图片的宽度、高度、Exif信息等。
  4. Audio(音频表):存储了音频文件的详细信息,如音频的时长、艺术家、专辑等。
  5. 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