0

我尝试实现一个画廊应用程序,该应用程序还显示所有本地存储的图像文件,这些文件按其包含的目录分组。为此,我建立在 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();
}

重现步骤:

  1. 创建一个新的共享图像文件
    1. 打开您喜欢的网络浏览器并下载图像文件
    2. 图像文件被放入共享的 Downloads/ 目录
  2. 上面的代码找到了图像(好!)
  3. 使用 Google 照片将图像文件移动到基​​于文件系统的新目录中
    1. 打开谷歌照片
    2. 打开寄存器“图书馆”
    3. 打开相册“下载”
    4. 打开最近添加的图像
    5. 点击“设置”(右上角的点)
    6. 点击“移动到文件夹”
    7. 点击“新建文件夹”
    8. 新建一个文件夹
  4. 上面的代码没有找到图像(糟糕!)
  5. 使用 Google 文件“重新创建”图像文件
    1. 打开谷歌文件
    2. 点击汉堡菜单
    3. 点按设备
    4. 打开目录图片/
    5. 打开谷歌相册新建目录对应的子目录
    6. 长按最近添加的图片文件
    7. 移动图像文件并将图像文件移回文件夹
  6. 上面的代码找到了新文件夹和图像(好!)
4

0 回答 0