我尝试实现一个画廊应用程序,该应用程序还显示所有本地存储的图像文件,这些文件按其包含的目录分组。为此,我建立在 MediaStore API 之上。
如果这些目录和图像文件是由 Google 照片创建的,我的代码找不到本地图像目录。但是,如果我使用 Google Files 在受影响的目录中复制/移动/创建图像文件,那么我的应用程序会找到该图像。
我究竟做错了什么?
注意:我说的是外部存储上 Pictures/ 目录下的真实文件系统目录。我不是在谈论 Google 相册在云中创建的相册。根据开发者文档,MediaStore API 应该可以在 Pictures/ 目录下找到所有图像。
图像,包括照片和屏幕截图,存储在 DCIM/ 和 Pictures/ 目录中。系统将这些文件添加到 MediaStore.Images 表中。
简化代码:
显现
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
简化数据类
public class LocalFolder {
public final long id;
public final Uri coverUri;
public LocalFolder( final long id, final Uri coverUri ) {
this.id = id;
this.coverUri = coverUri;
}
}
为内部数据库播种的简化代码
protected TreeMap< Long, LocalFolder > database;
public void run() {
final Uri collection = ( Build.VERSION.SDK_INT < Build.VERSION_CODES.Q ) ?
MediaStore.Images.Media.EXTERNAL_CONTENT_URI :
MediaStore.Images.Media.getContentUri(MediaStore.VOLUME_EXTERNAL);
final String[] projection = {
MediaStore.Images.Media._ID,
MediaStore.Images.Media.BUCKET_ID };
final Cursor cursor = contentResolver.query(
collection, projection, null, null, null
);
if(cursor == null) return;
// Cache column indices
final int imageIdColumn = cursor.getColumnIndexOrThrow( MediaStore.Images.Media._ID );
final int folderIdColumn = cursor.getColumnIndexOrThrow( MediaStore.Images.Media.BUCKET_ID );
while( cursor.moveToNext() ) {
// Compile all required attributes
final long imageId = cursor.getLong( imageIdColumn );
final long folderId = cursor.getLong( folderIdColumn );
final Uri coverUri = ContentUris.withAppendedId( collection, imageId );
// If the image is contained in a folder, which already has been processed, skip
if( database.containsKey( folderId ) )
continue;
// Create the folder and take the current image as cover image
final LocalFolder localFolder = new LocalFolder( folderId, coverUri );
database.put( folderId, localFolder );
}
cursor.close();
}
重现步骤:
- 创建一个新的共享图像文件
- 打开您喜欢的网络浏览器并下载图像文件
- 图像文件被放入共享的 Downloads/ 目录
- 上面的代码找到了图像(好!)
- 使用 Google 照片将图像文件移动到基于文件系统的新目录中
- 打开谷歌照片
- 打开寄存器“图书馆”
- 打开相册“下载”
- 打开最近添加的图像
- 点击“设置”(右上角的点)
- 点击“移动到文件夹”
- 点击“新建文件夹”
- 新建一个文件夹
- 上面的代码没有找到图像(糟糕!)
- 使用 Google 文件“重新创建”图像文件
- 打开谷歌文件
- 点击汉堡菜单
- 点按设备
- 打开目录图片/
- 打开谷歌相册新建目录对应的子目录
- 长按最近添加的图片文件
- 移动图像文件并将图像文件移回文件夹
- 上面的代码找到了新文件夹和图像(好!)