某些场景下第三方的相册UI并不符合我们预期的要求所以我们必须自己遍历相册开发出相应的功能以及UI
1.首先要取得相应的权限:
<!-- 读取权限相册 拍照 -->
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
2.动态申请权限:
/**
* 检查权限
* @param context
* @param code
* @param strings
* @return
*/
public static String[] checkpPermissionsApply(Context context,int code,String ...strings){
List<String> premissionList = new ArrayList<>();
boolean flag = false;
for(int i = 0;i < strings.length;i++) {
if(PermissionChecker.checkSelfPermission(context,strings[i]) != PermissionChecker.PERMISSION_GRANTED) {
premissionList.add(strings[i]);
}
}
String[] permissions = premissionList.toArray(new String[premissionList.size()]);
if(premissionList.size() >0) {
ActivityCompat.requestPermissions((Activity) context,permissions,code);
}
return permissions;
}
调用:
String[] pers = checkpPermissionsApply(this, 243, Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE);
if (pers.length == 0) {
//说明权限以及申请完成
//业务逻辑放这里
}
3.遍历相册:
这里用到的是query数据库查找语法以及ContentResolver程序内容提供器的用法以及Cursor指针用法
/**
* 相册遍历
*/
private void scanEgineAllImage() {
allImagePathList.clear();
Uri uriImage = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
ContentResolver contentResolver = getContentResolver();
Cursor mCursor = contentResolver.query(uriImage, null, MediaStore.Images.Media.MIME_TYPE + "=? or "
+ MediaStore.Images.Media.MIME_TYPE + " =? ", new String[]{"image/jpeg", "image/png"},
MediaStore.Images.Media.DATE_MODIFIED + " desc");
mCursor.moveToPosition(mCurrentPosition);
int i = 0; //查找300条索引图片
//每次查询300张图片
while (mCursor.moveToNext() && i < 300) {
i++;
//获取图片路径 DATA 常量 需要授予读写权限才可以读取图片
String path = mCursor.getString(mCursor.getColumnIndex(MediaStore.Images.Media.DATA));
if (new File(path).exists()) {
//如果文件存在则加入到自己定义的List中 这里存入的是图片路径
allImagePathList.add(new ImageSelectBean(path, false));
}
}
//用完回收
mCursor.close();
mCurrentPosition += i;
if (i < 300) {
isScanFlag = true;//扫描完成
}
}