在Android Q中,应用程序保存媒体文件后,在相册中不会自动显示。这是因为在Android Q中,应用程序需要明确将媒体文件添加到媒体媒体库中,才能在相册中显示。
下面是一个示例代码,展示如何将媒体文件添加到媒体库中:
import android.content.ContentResolver;
import android.content.ContentValues;
import android.content.Context;
import android.net.Uri;
import android.os.Build;
import android.provider.MediaStore;
import android.util.Log;
import java.io.File;
public class MediaStoreHelper {
// 将媒体文件添加到媒体库中
public static void addToMediaStore(Context context, String filePath, String mimeType) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
ContentResolver resolver = context.getContentResolver();
ContentValues contentValues = new ContentValues();
contentValues.put(MediaStore.MediaColumns.DISPLAY_NAME, "My File");
contentValues.put(MediaStore.MediaColumns.MIME_TYPE, mimeType);
contentValues.put(MediaStore.MediaColumns.RELATIVE_PATH, Environment.DIRECTORY_PICTURES);
contentValues.put(MediaStore.MediaColumns.IS_PENDING, 1);
Uri collection = MediaStore.Images.Media.getContentUri(MediaStore.VOLUME_EXTERNAL_PRIMARY);
Uri item = resolver.insert(collection, contentValues);
if (item != null) {
try {
resolver.openOutputStream(item).use {
// 将文件复制到输出流
// 在这里可以使用任何文件复制的方法,如 FileInputStream 和 FileOutputStream
// 这里只是一个简单的示例
File file = new File(filePath);
FileInputStream inputStream = new FileInputStream(file);
OutputStream outputStream = resolver.openOutputStream(item);
byte[] buffer = new byte[4096];
int bytesRead;
while ((bytesRead = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, bytesRead);
}
outputStream.flush();
outputStream.close();
inputStream.close();
contentValues.clear();
contentValues.put(MediaStore.MediaColumns.IS_PENDING, 0);
resolver.update(item, contentValues, null, null);
}
} catch (IOException e) {
Log.e("MediaStoreHelper", "Failed to add file to MediaStore", e);
}
}
} else {
// Android Q 以下版本的媒体文件处理方式
// 可以使用之前的方式将文件保存到磁盘,并通过广播通知媒体库刷新
}
}
}
在这个示例代码中,addToMediaStore()
方法接收一个文件路径和MIME类型作为参数,并将文件添加到媒体库中。首先,它创建一个ContentValues
对象,设置文件的显示名称、MIME类型、相对路径以及IS_PENDING
标志。然后,它使用ContentResolver
插入一个新的媒体文件,并获取返回的Uri
。接下来,它打开一个输出流,并将文件复制到输出流中。最后,它通过更新媒体文件的IS_PENDING
标志来完成添加操作。
请注意,这个示例代码只适用于Android Q及以上版本。对于Android Q以下的版本,可以使用之前的方式将文件保存到磁盘,并通过广播通知媒体库刷新。
上一篇:Android Q Api 29 - 如何从“存储访问框架(Storage Access Framework)”中获取存储(SD卡)的大小(总大小或可用大小)
下一篇:Android Q 背景限制