Estaba probando nuestra aplicación en una tableta y un teléfono que ejecutaban ICS y usaban la misma cuenta de Google. Si tomo una foto en una, se mostrará en el otro dispositivo (sincronización a través de Picasa). Lo extraño es que la foto aparece en ambos dispositivos cuando lo haga lo normalACTION_PICK con MediaStore.Images.Media.INTERNAL_CONTENT_URI que permite a los usuarios seleccionar imágenes sincronizadas a través de picasa (¿no en el dispositivo?)
Intent intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.INTERNAL_CONTENT_URI);
para permitir al usuario elegir una imagen desde la galería. Mi onActivityResult() tiene el siguiente aspecto:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode != Activity.RESULT_OK) {
return; // user cancelled
}
Uri imageUri = data.getData();
if (imageUri == null) {
// (code to show error message goes here)
return;
}
// Get image path from media store
String[] filePathColumn = { android.provider.MediaStore.MediaColumns.DATA };
Cursor cursor = this.getContentResolver().query(imageUri, filePathColumn, null, null, null);
if(cursor == null || !cursor.moveToFirst()) {
// (code to show error message goes here)
return;
}
int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
String imagePath = cursor.getString(columnIndex);
cursor.close();
if (imagePath == null) {
// error happens here
}
}
Todo está bien hasta el final cuando imagePath es nulo. El código funciona perfectamente para otras fotos en el dispositivo pero no para la sincronizada. Después de agregar un poco de código de registro, parece que esto está sucediendo a algunos de nuestros usuarios en producción, aunque muy raramente (menos de 1 de cada 10.000 fotos).
Entiendo que ACTION_GET_CONTENT tiene el indicador EXTRA_LOCAL_ONLY para mostrar solo los archivos locales, pero esto solo está disponible en la versión 11 de la API en adelante. ACTION_GET_CONTENT también tiene CATEGORY_OPENABLE para mostrar solo los datos que se pueden abrir. ¿Es mi intención ACTION_PICK de alguna manera (¿incorrectamente?) Mostrar fotos que en realidad no son locales ni se pueden abrir? De acuerdo con la documentación, usar INTERNAL_CONTENT_URI solo se supone que muestra fotos almacenadas internamente.
¿O hay algún problema con mi código onActivityResult()? He visto un montón de diferentes variantes:.
- comprobación para asegurarse de data.getData() getPath() no es nulo
- usando MediaStore.Images.Media.DATA como la proyección en lugar de MediaStore .MediaColumns.DATA
- usando MediaStore.Images.ImageColumns.DATA como la proyección en lugar de MediaStore.MediaColumns.DATA
- usando managedQuery() para obtener el cursor en lugar de getContentResolver(). query()
- usando CursorLoader obtener el Cursor (API 11+)
- usando getColumnIndexOrThrow() en lugar de getColumnIndex()
- llamando cursor.getColumnIndex (MediaStore.Images.Media.DATA) y luego llamar cursor.moveToFirst()
- usando "userimage" como el nombre de la columna (parámetro para getColumnIndex ())
¿Alguno de estos cambios solucionaría el problema?