想要获取当前Android设备上的音频或视频文件,需要用到ContentResolver(内容解析器),系统通过ContentProvider(内容提供者)对外开放了这些数据。一般我们获取到这些数据需要进行如下操作:
new Thread(new Runnable() {@Overridepublic 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)); }//记得关闭cursorcursor.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 {//获取数据}