我注意到MediaStore.Images.ImageColumns的一个奇怪的列名为“MINI_THUMB_MAGIC”。
文档说明了这一点:
迷你拇指身份。
输入:INTEGER
常数值:“mini_thumb_magic”
我猜这个字段与MediaStore.Images.Thumbnails有关。
这是对的吗?如果没有,这是什么以及如何使用它?
如果它是正确的,我还有其他相关的问题:
这是原始图片的小尺寸图片吗?它使用相同的宽高比还是对它进行中心裁剪?
“MICRO”的大小是方形(96 x 96),“MINI”的大小是非方形矩形(512 x 384)?
你是如何使用它的?我猜这是通过使用“THUMB_DATA”来完成的,这是一个blob,所以你像this一样使用它,但是如果你已经使用“getThumbnail”的目的是什么有这个领域吗?
如果方向值不为0,是否会获得旋转的缩略图?意思是如果我想展示它,我不需要旋转图像?
是否可以与缩略图一起查询图像?也许使用内连接?
是否适用于所有Android设备和版本?
为什么它甚至被称为“魔术”?是因为它也适用于视频(由于某种原因,音乐不存在,例如,它可能是专辑的封面照片)?
答案 0 :(得分:2)
在Android源代码中检查此文件:https://github.com/android/platform_packages_providers_mediaprovider/blob/master/src/com/android/providers/media/MediaThumbRequest.java。此值是一些幻数,可以确定缩略图是否仍然有效。我没有进一步调查该文件,但深入研究应该没有问题。 对你的问题:
答案 1 :(得分:0)
根据以下URL的源代码,Magic Number是原始图像的Id *常量。然后使用该值检查long int。如果int不符合预期,则认为它与图像媒体不同步。
// 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