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;
}