前提:由于6.0以后读取存储文件属于危险权限,需要动态申请权限
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
1、借助系统自带的文件浏览器
这种方式定制化能力为0,但实现实现起来很简单
/** * 开启文件浏览器 */ Intent intent = new Intent(Intent.ACTION_GET_CONTENT); // image/* :图片类型资源 audio/*:音频文件 video/*:视频文件 intent.setType("*/*"); intent.addCategory(Intent.CATEGORY_OPENABLE); //设置多选 intent.putExtra(EXTRA_ALLOW_MULTIPLE, true); startActivityForResult(intent,1);之后获取回调结果
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); //判断是否选择 if(requestCode == Activity.RESULT_OK){ Uri uri = data.getData(); //获得到文件uri /** * 后续若需要file或绝对路劲在根据uri转 */ } }
2、借助MediaStore MediaStore是android系统提供的一个多媒体数据库,专门用于存放多媒体信息的,通过ContentResolver即可对数据库进行操作。
MediaStore.Files: 共享的文件,包括多媒体和非多媒体信息
MediaStore.Audio: 存放音频信息
MediaStore.Image: 存放图片信息
MediaStore.Vedio: 存放视频信息
//以查找视频为例 void getVideo() { List<String> list = new ArrayList<>(); String[] projection = new String[]{MediaStore.Video.Media.DATA, MediaStore.Video.Media .DURATION}; Cursor cursor = context.getContentResolver().query( MediaStore.Video.Media.EXTERNAL_CONTENT_URI, projection, null, null, MediaStore.Video.VideoColumns.IS_PRIVATE); while (cursor.moveToNext()) { String path = cursor .getString(cursor .getColumnIndexOrThrow(MediaStore.Video.Media.DATA)); long duration = cursor .getInt(cursor .getColumnIndexOrThrow(MediaStore.Video.Media.DURATION)); list.add(path); } cursor.close(); }
其中 cursor的query步骤的参数: public final Cursor query( Uri uri, //数据资源路径 String[] projection, //查询的列 String selection, //查询的条件 String[] selectionArgs, //条件填充值 String sortOrder){}
获取音乐文件
fun getMusicFromSD(context: Context):ArrayList<Song>{ var tmpList:ArrayList<Song> = ArrayList() val cursor:Cursor = context.contentResolver.query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null,null,null, MediaStore.Audio.Media.DEFAULT_SORT_ORDER) while(cursor.moveToNext()){ var tmpSong = Song( cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.TITLE)), cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ARTIST)), cursor.getLong(cursor.getColumnIndex(MediaStore.Audio.Media.DURATION)), cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DATA)), cursor.getLong(cursor.getColumnIndex(MediaStore.Audio.Media.SIZE)) ) tmpList.add(tmpSong) } return tmpList }对于查找到的对象,可以构建自己的base类进行封装,可获到到文件名,大小,路劲,作者等资源特有类型
MediaStore官方文档