想要获取当前Android设备上的音频或视频文件,需要用到ContentResolver(内容解析器),系统通过ContentProvider(内容提供者)对外开放了这些数据。一般我们获取到这些数据需要进行如下操作:
new Thread(new Runnable() {
@Override
public void run() {
array = new ArrayList<>();
//获取ContentResolver实例
ContentResolver resolver = getContentResolver();
//需要查询的内容,名称,时长,大小,路径,演唱者等
String[] strs = {MediaStore.Video.Media.DISPLAY_NAME, MediaStore.Video.Media.DURATION,
MediaStore.Video.Media.SIZE, MediaStore.Video.Media.DATA, MediaStore.Video.Media.ARTIST};
//查询路径(此处为外部路径)
Uri uri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
//开始查询,查询结果是一个cursor对象
Cursor cursor = resolver.query(uri, strs, null, null, null);
//若查询的Uri不存在,则cursor为空,所以要做非空判断
if (cursor != null) {
while (cursor.moveToNext()) {
//MediaItem 用来存储这些信息的数据模型
MediaItem item = new MediaItem();
array.add(item);
item.setName(cursor.getString(0));
item.setDuration(cursor.getLong(1));
item.setSize(cursor.getLong(2));
item.setData(cursor.getString(3));
item.setArtist(cursor.getString(4));
}
//记得关闭cursor
cursor.close();
}
//通知UI线程更新列表
mHandler.sendEmptyMessage(1);
}
}).start();
特别注意
- 查询操作是一个耗时操作,所以需要把它放到子线程中,查询完成后通过Handler发送给主线程更新UI
- Android6.0需要动态请求权限 Manifest.permission.WRITE_EXTERNAL_STORAGE
if (ContextCompat.checkSelfPermission(this,
Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
} else {
//获取数据
}