Android Q读写共享目录媒体文件
有些人通过文件名称去查找共享目录下媒体文件却获取不到,可能是由于查询条件写错了。注意下MediaStore.Video.Media.DISPLAY_NAME 参数,我用MediaStore.Video.Media.BUCKET_DISPLAY_NAME这个就查询不到,具体这两个有什么不同,可以自己去查资料。
1.在共享目录中保存图片视频,下面给出的代码是保存图片,要保存视频就把MediaStore.Images改成MediaStore.Video就可以。
/**
* 保存图片到共享目录,不用SAF存储
* @param context
* @param bitmap 图片bitmap
* @param fileName 图片名称
* @param mime_type 类型:图片为image/jpeg,视频为video/mpeg
*/
public static boolean addPictureToAlbum(Context context, Bitmap bitmap, String fileName,String mime_type) {
ContentValues contentValues = new ContentValues();
contentValues.put(MediaStore.Images.Media.DISPLAY_NAME, fileName);
contentValues.put(MediaStore.Images.Media.DESCRIPTION, fileName);
contentValues.put(MediaStore.Images.Media.MIME_TYPE, mime_type);
Uri uri = context.getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues);
OutputStream outputStream = null;
try {
outputStream = context.getContentResolver().openOutputStream(uri);
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, outputStream);
outputStream.close();
} catch (Exception e) {
e.printStackTrace();
return false;
}
return true;
}
2.读取共享目录下的图片
/**
* 读取共享目录下图片文件
* @param context 上下文
* @param filename 文件名称(带后缀a.jpg),是MediaStore查找文件的条件之一
* @return
*/
public static List<InputStream> getImageFile(Context context, String filename) {
String[] projection = {MediaStore.Images.Media._ID,
MediaStore.Images.Media.DATA,
MediaStore.Images.Media.DATE_ADDED,
MediaStore.Images.Thumbnails.DATA
};
List<InputStream> insList = new ArrayList<>();
ContentResolver resolver = context.getContentResolver();
String sortOrder = MediaStore.Images.Media.DATE_MODIFIED + " DESC";//根据日期降序查询
String selection = MediaStore.Images.Media.DISPLAY_NAME + "='" + filename + "'"; //查询条件 “显示名称为?”
Cursor cursor = resolver.query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, projection, selection, null, sortOrder);
if (cursor != null && cursor.moveToFirst()) {
//媒体数据库中查询到的文件id
int columnId = cursor.getColumnIndex(MediaStore.Images.Media._ID);
do {
//通过mediaId获取它的uri
int mediaId = cursor.getInt(columnId);
// String tPath = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA)); //获取图片路径
Uri itemUri = Uri.withAppendedPath(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "" + mediaId );
try {
//通过uri获取到inputStream
ContentResolver cr = context.getContentResolver();
InputStream ins=cr.openInputStream(itemUri);
insList.add(ins);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
} while (cursor.moveToNext());
}
return insList;
}
3.读取共享目录下的视频
/**
* 读取共享目录下视频文件
* @param context
* @param filename 文件名称(带后缀a.mp4),是MediaStore查找文件的条件之一
* @return
*/
public static List<InputStream> getVideoFile(Context context, String filename) {
String[] projection = {MediaStore.Video.Media._ID,
MediaStore.Video.Media.DATA,
MediaStore.Video.Media.DATE_ADDED,
MediaStore.Video.Thumbnails.DATA
};
List<InputStream> insList = new ArrayList<>();
ContentResolver resolver = context.getContentResolver();
String sortOrder = MediaStore.Video.Media.DATE_MODIFIED + " DESC";//根据日期降序查询
String selection = MediaStore.Video.Media.DISPLAY_NAME + "='" + filename + "'"; //查询条件 “显示名称为?”
Cursor cursor = resolver.query(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, projection, selection, null, sortOrder);
if (cursor != null && cursor.moveToFirst()) {
//媒体数据库中查询到的文件id
int columnId = cursor.getColumnIndex(MediaStore.Video.Media._ID);
do {
//通过mediaId获取它的uri
int mediaId = cursor.getInt(columnId);
// String tPath = cursor.getString(cursor.getColumnIndex(MediaStore.Video.Media.DATA)); //获取图片路径
Uri itemUri = Uri.withAppendedPath(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, "" + mediaId );
try {
//通过uri获取到inputStream
ContentResolver cr = context.getContentResolver();
InputStream ins=cr.openInputStream(itemUri);
insList.add(ins);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
} while (cursor.moveToNext());
}
return insList;
}