values.put(ImageColumns.DATA, date);//图片或视频路径
AndroidQ以后则使用MediaColumns.RELATIVE_PATH(注:图片或视频存放的目录)
values.put(MediaColumns.RELATIVE_PATH, Environment.DIRECTORY_DCIM + File.separator + Constance.SYSTEM_CAMERA_FOLDER);//图片或视频保存的目录
2、AndroidQ只存储目录如何与图片视频文件相关联呢?
AndroidQ使用ContentResolver进行insert数据会返回uri,然后通过uri打开输出流再将图片或视频数据存入即可
uri = context.getContentResolver().insert(Images.Media.EXTERNAL_CONTENT_URI, values);
if (null != uri) {
bitmap.compress(Bitmap.CompressFormat.JPEG, quality, context.getContentResolver().openOutputStream(uri));//使用uri打开输出流
}
三、图片保存示例代码
AndroidQ保存图片示例
public static void asynAddImageQ(final Context context, final Bitmap bitmap, final String path, final String fileName, final String mimeType,
final long date, final Location location, final int quality, final int orientation
, final int width, final int height,
final OnScanCompletedListener listener) {
QThreadExecutorProxy.getInstance().runOnAsyncThread(() -> {
String title = fileName;
if (title != null) {
int index = title.lastIndexOf(".");
if (index > 0) {
title = title.substring(0, index);
}
}
ContentValues values = new ContentValues(9);
values.put(ImageColumns.TITLE, title);
values.put(ImageColumns.DISPLAY_NAME, fileName);
values.put(ImageColumns.DATE_TAKEN, date);
values.put(ImageColumns.MIME_TYPE, mimeType);
values.put(ImageColumns.ORIENTATION, orientation);
setImageSize(values, width, height);
if (location != null) {
values.put(ImageColumns.LATITUDE, location.getLatitude());
values.put(ImageColumns.LONGITUDE, location.getLongitude());
}
values.put(MediaColumns.RELATIVE_PATH, Environment.DIRECTORY_DCIM + File.separator + Constance.SYSTEM_CAMERA_FOLDER);//AndroidQ存储目录
Uri uri = null;
try {
uri = context.getContentResolver().insert(Images.Media.EXTERNAL_CONTENT_URI, values);
if (null != uri) {
bitmap.compress(Bitmap.CompressFormat.JPEG, quality, context.getContentResolver().openOutputStream(uri));
}
} catch (Throwable th) {
Log.e(TAG, "Failed to write MediaStore" + th);
}
if (listener != null) {
listener.onScanCompleted(path + File.separator + fileName, uri, orientation);
}
});
}
四、视频保存示例代码
AndroidQ保存视频示例
public static void broadcastVideoFileQ(Context context, InputStream inputStream, String fileName, Location location,
FolderHelper.OnScanCompletedListener listener) {
try {
long dateTaken = System.currentTimeMillis();
ContentValues values = new ContentValues();
values.put(Video.Media.TITLE, fileName);
values.put(Video.Media.DISPLAY_NAME, fileName);
values.put(Video.Media.DATE_TAKEN, dateTaken);
values.put(Video.Media.DATE_MODIFIED, dateTaken / 1000);
values.put(Video.Media.MIME_TYPE, "video/mp4");
values.put(MediaStore.Video.Media.RELATIVE_PATH, Environment.DIRECTORY_DCIM + File.separator + Constance.SYSTEM_CAMERA_FOLDER);
if (location != null) {
values.put(Video.Media.LATITUDE, location.getLatitude());
values.put(Video.Media.LONGITUDE, location.getLongitude());
}
Uri uri = context.getContentResolver()
.insert(Uri.parse(VIDEO_BASE_URI), values);
if (uri != null) {
try {
ParcelFileDescriptor pfd = context.getContentResolver().openFileDescriptor(uri, "rw", null);
//文件输出流
FileOutputStream outputStream = new FileOutputStream(pfd.getFileDescriptor());
int bufferSize = 1024;
byte[] buff = new byte[bufferSize];
int rc = 0;
try {
while ((rc = inputStream.read(buff, 0, bufferSize)) > 0) {
outputStream.write(buff, 0, rc);
}
outputStream.flush();
outputStream.close();
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (listener != null) {
listener.onScanCompleted(FolderHelper.getOrCreateSaveLocation() + fileName, uri, 0);
}
}
} else {
throw new RuntimeException();
}
} catch (Throwable tr) {
tr.printStackTrace();
}
}
五、总结
1、 AndroidQ的图片视频保存其实只需要注意两点
MediaStore ContentProvider字段的改变原来是存储路径ImageColumns.DATA,现在是存储相对目录MediaColumns.RELATIVE_PATH使用ContentResolver进行insert生成uri后,在使用uri打开输出流,将图片或视频数据写入即可。
2、官方文档:访问共享存储空间中的媒体文件
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)