什么是MINI_THUMB_MAGIC以及如何使用它?

时间:2014-01-23 15:56:37

标签: android sql android-gallery android-contentresolver mediastore

背景

我注意到MediaStore.Images.ImageColumns的一个奇怪的列名为“MINI_THUMB_MAGIC”。

文档说明了这一点:

  

迷你拇指身份。

     

输入:INTEGER

     

常数值:“mini_thumb_magic”

问题

我猜这个字段与MediaStore.Images.Thumbnails有关。

这是对的吗?如果没有,这是什么以及如何使用它?

如果它是正确的,我还有其他相关的问题:

  1. 这是原始图片的小尺寸图片吗?它使用相同的宽高比还是对它进行中心裁剪?

  2. “MICRO”的大小是方形(96 x 96),“MINI”的大小是非方形矩形(512 x 384)?

  3. 你是如何使用它的?我猜这是通过使用“THUMB_DATA”来完成的,这是一个blob,所以你像this一样使用它,但是如果你已经使用“getThumbnail”的目的是什么有这个领域吗?

  4. 如果方向值不为0,是否会获得旋转的缩略图?意思是如果我想展示它,我不需要旋转图像?

  5. 是否可以与缩略图一起查询图像?也许使用内连接?

  6. 是否适用于所有Android设备和版本?

  7. 为什么它甚至被称为“魔术”?是因为它也适用于视频(由于某种原因,音乐不存在,例如,它可能是专辑的封面照片)?

3 个答案:

答案 0 :(得分:2)

在Android源代码中检查此文件:https://github.com/android/platform_packages_providers_mediaprovider/blob/master/src/com/android/providers/media/MediaThumbRequest.java。此值是一些幻数,可以确定缩略图是否仍然有效。我没有进一步调查该文件,但深入研究应该没有问题。 对你的问题:

  1. 不,没有迷你尺寸的图片
  2. 嗯,我想这是谷歌的一个定义,他希望为某些列表设置一个方形缩略图,其中只有非常小的预览应该是可见的,而且许多项目应该放在屏幕上,而另一个则是另一个缩略图格式,图像更大......
  3. 我不知道,但根据谷歌的文档,一个(THUMB_DATA)只是缩略图的一些原始字节数组(dunno以哪种格式),另一个(getThumbnail)检索一个完整的位图对象......
  4. 不知道
  5. 不知道
  6. 我想是的,因为它是AOSP源代码的一部分。
  7. 这个词"魔法"通常用于某种标识符。有"魔术包"谁可以从睡眠中唤醒计算机或通过网络关机,硬盘上有魔术数字,其中某些扇区(例如MBR)在其最后两个字节位置上具有十六进制值AA 55,图像中也有幻数帮助软件包确定图像类型的文件(例如GIF文件以GIF89a或GIF87a(ASCII)开头,JPEG文件以FF D8十六进制开头)还有很多很多例子。所以,魔术数字在这里是一个非常常见的术语: - )

答案 1 :(得分:0)

根据以下URL的源代码,Magic Number是原始图像的Id *常量。然后使用该值检查long int。如果int不符合预期,则认为它与图像媒体不同步。

http://grepcode.com/file/repo1.maven.org/maven2/org.robolectric/android-all/4.4_r1-robolectric-0/android/media/MiniThumbFile.java#MiniThumbFile.getMagic%28long%29

// Get the magic number for the specified id in the mini-thumb file.
// Returns 0 if the magic is not available.
public synchronized long getMagic(long id) {
   // check the mini thumb file for the right data.  Right is
   // defined as having the right magic number at the offset
   // reserved for this "id".
   RandomAccessFile r = miniThumbDataFile();
   if (r != null) {
       long pos = id * BYTES_PER_MINTHUMB;
       FileLock lock = null;
       try {
           mBuffer.clear();
           mBuffer.limit(1 + 8);

           lock = mChannel.lock(pos, 1 + 8, true);
           // check that we can read the following 9 bytes
           // (1 for the "status" and 8 for the long)
           if (mChannel.read(mBuffer, pos) == 9) {
               mBuffer.position(0);
               if (mBuffer.get() == 1) {
                   return mBuffer.getLong();
               }
           }
       } catch (IOException ex) {
           Log.v(TAG, "Got exception checking file magic: ", ex);
       } catch (RuntimeException ex) {
           // Other NIO related exception like disk full, read only channel..etc
           Log.e(TAG, "Got exception when reading magic, id = " + id +
                   ", disk full or mount read-only? " + ex.getClass());
       } finally {
           try {
               if (lock != null) lock.release();
           }
           catch (IOException ex) {
               // ignore it.
           }
       }
   }
   return 0;
}

通过查找缩略图的路径尝试获取缩略图的原始Id时,我收到了运行时异常。 (顺便说一句,磁盘不满,而且它不是只读的。)

答案 2 :(得分:0)

这有点奇怪的参数......
在探索Gallery源代码时,
注意到正在从光标读取值,但是从未使用过:

@Override
    protected BaseImage loadImageFromCursor(Cursor cursor) {
        long id = cursor.getLong(INDEX_ID);
        String dataPath = cursor.getString(INDEX_DATA_PATH);
        long dateTaken = cursor.getLong(INDEX_DATE_TAKEN);
        if (dateTaken == 0) {
            dateTaken = cursor.getLong(INDEX_DATE_MODIFIED) * 1000;
        }

//在这里他们读了它====>>

        long miniThumbMagic = cursor.getLong(INDEX_MINI_THUMB_MAGIC);
        int orientation = cursor.getInt(INDEX_ORIENTATION);
        String title = cursor.getString(INDEX_TITLE);
        String mimeType = cursor.getString(INDEX_MIME_TYPE);
        if (title == null || title.length() == 0) {
            title = dataPath;
        }

//并且根本不使用==>>>

        return new Image(this, mContentResolver, id, cursor.getPosition(),
                contentUri(id), dataPath, mimeType, dateTaken, title,
                orientation);
    } 

可能它曾用于以前的API。

参考:https://android.googlesource.com/platform/packages/apps/Gallery/+/android-8.0.0_r12/src/com/android/camera/gallery/ImageList.java?autodive=0%2F%2F
和视频列表: https://android.googlesource.com/platform/packages/apps/Gallery/+/android-8.0.0_r12/src/com/android/camera/gallery/VideoList.java?autodive=0%2F%2F