Consultar MediaStore: unir miniaturas e imágenes (en ID)

Estoy trabajando en una aplicación de tipo "galería de fotos" para Android. Comenzó como un proyecto final para el desarrollo de aplicaciones de Android en Udacity, por lo que su estructura general (actividades, proveedores de contenido, etc.) debe ser muy sólida, y Udacity / Google lo aceptó para su certificación.

Sin embargo, todavía no está 100% terminado, y todavía estoy tratando de mejorarlo.

Lo que quiero hacer debería ser bastante sencillo; Cargue todas las imágenes en el dispositivo (como miniaturas) en un GridView en MainActivity, con DetailActivity que muestra la imagen a tamaño completo + algunos metadatos (título, tamaño, fecha, etc.).

El curso nos obligó a escribir un ContentProvider, por lo que tengo una función query () que esencialmente obtiene datos de MediaStore y devuelve un cursor a GridView de MainActivity. En mi dispositivo, al menos, (Sony Xperia Z1, Android 5.1.1) esto funcionacasi perfectamente. Hay algunos errores y peculiaridades, pero en general puedo encontrar todas las imágenes en mi teléfono en mi aplicación y hacer clic en ellas para ver los detalles.

Sin embargo, cuando intenté instalar la aplicación en el Sony Xperia Z3 de mi amigo, todo falló. No aparecieron imágenes, aunque obviamente verifiqué que en realidad había ~ 100 fotos en su teléfono. Lo mismo en el teléfono de otro amigo (nuevo Samsung S6) :-(

Este es el problema principal. En mi teléfono, donde funcionan las cosas, los errores "secundarios" implican que cuando se toma una nueva foto con la cámara, no se carga automáticamente en mi aplicación (como una miniatura). Parece que necesito descubrir cómo activar un escaneo, o lo que sea necesario para cargar / generar nuevos pulgares. Eso también es bastante alto en mi lista de deseos.

Como dije, estoy seguro de que todo esto realmente debería ser bastante simple, ¿así que tal vez todas mis dificultades indiquen que estoy abordando el problema de una manera completamente incorrecta?Esto es lo que está haciendo mi función query ():

obtener un cursor de todas las miniaturas, desdeMediaStore.Media.Thumbnails.EXTERNAL_CONTENT_URI

obtener un cursor de todas las imágenes, desdeMediaStore.Media.Images.EXTERNAL_CONTENT_URI

únete a estos, enMediaStore.Media.Thumbnails.IMAGE_ID = MediaStore.Media.Images._ID usando unCursorJoiner

devolver el resultadoretCursor (como se produce en la unión)

- por favor encuentre el código completoen este post anterior

Aunque estose ve correcto (para mí), ¿tal vez no es realmente la forma de hacerlo? Por cierto, estoy uniendo pulgares e imágenes, de modo que pueda mostrar algunos metadatos (por ejemplo, fecha de toma) junto con la miniatura, en el GridView. Identifiqué el problema de la unión, en particular, porque si simplifico esto a solo cargar los pulgares en el GridView, todo esto funciona bien, también en el teléfono de mi amigo. (Con la excepción de cargar nuevas fotos).

De alguna manera, mi suposición de queIMAGE_ID y_ID son siempre consistentes no es correcto? He visto unpublicar en AirPair, que describe una aplicación de galería similar, y allí el tutorial trata esto de manera ligeramente diferente. En lugar de intentar unir los cursores, obtiene el cursor de las miniaturas e itera sobre él,Agregar datos de imágenes mediante consultas individuales a MediaStore... Pero, ¿es esa la forma más eficiente de hacer esto? - Sin embargo, su soluciónhace une la miniatura a la imagen correspondiente en la ID:

Cursor imagesCursor = context.getContentResolver().query(
            MediaStore.Images.Media.EXTERNAL_CONTENT_URI, 
            filePathColumn, 
            MediaStore.Images.Media._ID + "=?", new String[]{imageId},  // NB!
            null);

En resumen, necesito ayuda con lo siguiente:

¿Estoy consultando MediaStore correctamente?¿es seguro unir pulgares e imágenes, en ID? ¿Será estable / sincronizado en todo momento?¿Cómo puede mi aplicación generar / recuperar miniaturas de nuevas imágenes automáticamente?

Respuestas a la pregunta(3)

Su respuesta a la pregunta