在 Android API 29 及更高版本中,您可以使用以下代码将文件、图像和视频存储到外部存储。
//首先,如果您使用“android.media.action.IMAGE_CAPTURE”选择文件,则将该文件存储在应用程序私有路径(getExternalFilesDir())中,如下所示。
File destination = new File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), fileName);
//然后使用内容提供者访问媒体存储,如下所示。
ContentValues values = new ContentValues();
values.put(MediaStore.Images.Media.TITLE, fileName);
values.put(MediaStore.Images.Media.DISPLAY_NAME, fileName);
//如果您想要特定的 mime 类型,请在此处指定您的 mime 类型。否则将其留空,它将采用默认文件 mime 类型
values.put(MediaStore.Images.Media.MIME_TYPE, "MimeType");
values.put(MediaStore.Images.Media.DATE_ADDED, System.currentTimeMillis() / 1000);
values.put(MediaStore.Images.Media.DATE_TAKEN, System.currentTimeMillis());
values.put(MediaStore.Images.Media.RELATIVE_PATH, "Pictures/" + "path"); // specify
storage path
// 使用内容提供者插入媒体存储,它将返回 URI。
Uri uri = cxt.getContentResolver().insert(MediaStore.Files.getContentUri("external"), values);
//使用该URI打开文件。
ParcelFileDescriptor descriptor = context.getContentResolver().openFileDescriptor(uri,"w"); //"w" specify's write mode
FileDescriptor fileDescriptor = descriptor.getFileDescriptor();
// 从私有路径读取文件。
InputStream dataInputStream = cxt.openFileInput(privatePath_file_path);
//将文件写入输出文件流。
OutputStream output = new FileOutputStream(fileDescriptor);
byte[] buf = new byte[1024];
int bytesRead;
while ((bytesRead = dataInputStream.read(buf)) > 0)
{
output.write(buf, 0, bytesRead);
}
datanputStream.close();
output.close();
}