¿Qué es MINI_THUMB_MAGIC y cómo usarlo?

Fondo

He notado una extraña columna para MediaStore.Images.ImageColumns llamada " MINI_THUMB_MAGIC ".

La documentación dice justo eso:

El mini id del pulgar.

Tipo: INTEGER

Valor constante: "mini_thumb_magic"

La pregunta

Mi conjetura es que este campo está relacionado con MediaStore.Images.Thumbnails .

Es correcto ? Si no, ¿qué es esto y cómo lo usas?

Si es correcto, tengo otras preguntas relacionadas con él:

  1. ¿Es una mini imagen del tamaño del original? ¿Utiliza la misma relación de aspecto o hace recorte en el centro?

  2. ¿Por qué el tamaño de "MICRO" es cuadrado (96 x 96) y el tamaño de "MINI" es un rectángulo no cuadrado (512 x 384)?

  3. ¿Como lo usas? Mi conjetura es que se hace usando " THUMB_DATA ", que es un blob, así que lo usas así, pero entonces ¿cuál es el propósito de usar " getThumbnail " si ya tienes este campo?

  4. ¿Obtiene una miniatura girada en caso de que el valor de orientación no sea 0? Lo que significa que si deseo mostrarlo, no necesitaré girar la imagen?

  5. ¿Es posible hacer una consulta de las imágenes junto con sus miniaturas? Tal vez utilizando inner join?

  6. ¿Está disponible para todos los dispositivos y versiones Android?

  7. ¿Por qué se llama "magia"? ¿Es porque también está disponible para videos (y por alguna razón no existe para la música, como podría ser la foto de portada del álbum, por ejemplo)?

Compruebe este archivo: https://github.com/android/platform_packages_providers_mediaprovider/blob/master/src/com/android/providers/media/MediaThumbRequest.java en el código fuente de Android. Este valor es un número mágico que permite determinar si la miniatura sigue siendo válida. Yo no investigar ese archivo más, pero no debería ser cuestión de poco para bucear más profundo. A sus preguntas:

  1. No, no mini-imagen de tamaño
  2. Bueno, supongo que es una definición de Google que quiere tener una miniatura cuadrada para algunas listas, donde sólo las vistas previas muy pequeñas deben ser visibles y donde muchos elementos deben caber en la pantalla y hay otro formato de miniatura donde las imágenes son más grandes …
  3. No lo sé, pero de acuerdo con el documento de Google, uno (THUMB_DATA) es sólo algunos raw byte matriz de la miniatura (dunno en qué formato) y el otro (getThumbnail) recupera un objeto de mapa de bits de pleno derecho …
  4. No lo sé
  5. No lo sé
  6. Supongo que sí, ya que es parte del código fuente de AOSP.
  7. La palabra "magia" se utiliza a menudo para algún tipo de identificador. Hay "paquetes mágicos" que pueden despertar una computadora desde el sueño o apagado a través de la red, hay números mágicos en los discos duros, donde algunos sectores (por ejemplo, el MBR) tiene los valores hexadecimales AA 55 en sus últimas dos bytes, Son también números mágicos en los archivos de imagen que ayudan a los paquetes de software a determinar el tipo de imagen (por ejemplo, los archivos GIF comienzan con GIF89a o GIF87a (ASCII), los archivos JPEG comienzan con FF D8 hexadecimal) y hay muchos, muchos más ejemplos. Por lo tanto, los números mágicos son un término muy común aquí 🙂

De acuerdo con el código fuente en la siguiente URL, el número mágico es el Id de la imagen original * una constante. Ese valor entonces se utiliza para comprobar para un int largo. Si int no es como se esperaba, se considera fuera de sincronización con el medio de imagen.

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; } 

Recibí la excepción de tiempo de ejecución al intentar obtener el Id original de una miniatura buscando el recorrido de la miniatura. (BTW, el disco no está lleno y no es de sólo lectura.)

  • ¿Cómo agregar datos iniciales a la base de datos SQLite?
  • SelectionArgs en SQLiteQueryBuilder no funciona con valores enteros en columnas
  • Utilización de la base de datos legible y escrita de SQLite
  • Ejemplo de cuenta de SQLite
  • ¿Importa si escribo "INTEGER" o "int" en el comando sql dentro de java?
  • Lectura de transacciones no confirmadas en Android
  • ¿Qué diferencia hay entre SQLite y SQL?
  • Cómo obtener los nombres de todas las tablas presentes en una base de datos en Android lite de SQL
  • Ormlite interior ensambla en tres tablas
  • Actualizar una columna como suma de otras dos columnas
  • Android con SQL Server 2008
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.