El bash de inicio de Intent.ACTION_VIEW no funciona en el archivo de imagen guardado

En primer lugar, permítanme decir que estas preguntas están un poco conectadas con otra pregunta de mi parte. En realidad fue creado por eso.

Tengo el siguiente código para escribir un bitmap descargado de la red a un archivo en la tarjeta SD:

// Get image from url URL u = new URL(url); HttpGet httpRequest = new HttpGet(u.toURI()); HttpClient httpclient = new DefaultHttpClient(); HttpResponse response = (HttpResponse) httpclient.execute(httpRequest); HttpEntity entity = response.getEntity(); BufferedHttpEntity bufHttpEntity = new BufferedHttpEntity(entity); InputStream instream = bufHttpEntity.getContent(); Bitmap bmImg = BitmapFactory.decodeStream(instream); instream.close(); // Write image to a file in sd card File posterFile = new File(Environment.getExternalStorageDirectory().getAbsolutePath()+"/Android/data/com.myapp/files/image.jpg"); posterFile.createNewFile(); BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(posterFile)); Bitmap mutable = Bitmap.createScaledBitmap(bmImg,bmImg.getWidth(),bmImg.getHeight(),true); mutable.compress(Bitmap.CompressFormat.JPEG, 100, out); out.flush(); out.close(); // Launch default viewer for the file Intent intent = new Intent(); intent.setAction(android.content.Intent.ACTION_VIEW); intent.setDataAndType(Uri.parse(posterFile.getAbsolutePath()),"image/*"); ((Activity) getContext()).startActivity(intent); 

Algunas notas Estoy creando el bitmap “mutable” después de ver a alguien usándolo y parece funcionar mejor que sin él. Y estoy usando el método parse en la clase Uri y no el fromFile porque en mi código los llamo en diferentes lugares y cuando estoy creando la intención tengo una ruta de cadena en lugar de un archivo.

Ahora para mi problema. El archivo se crea. La intención inicia un cuadro de diálogo que me pide que seleccione un visor. Tengo 3 espectadores instalados. El visor de imágenes Astro, la galería de medios predeterminada (tengo un milstone en 2.1 pero en el hito la actualización 2.1 no incluía la galería 3d, por lo que es la anterior) y la galería 3d del nexo (encontré la apk en el salvaje).

Ahora cuando lanzo los 3 espectadores sucede lo siguiente:

  • Visor de imágenes Astro: la actividad se inicia pero no veo nada más que una pantalla negra.

  • Galería multimedia: aparece un cuadro de diálogo de excepción que muestra “La galería de medios de la aplicación (proceso com.motorola.gallery) se ha detenido inesperadamente. Inténtelo de nuevo” con una opción de cierre forzado.

  • Galería 3D: todo funciona como debería.

Cuando bash simplemente abrir el archivo usando el administrador de archivos Astro (navegue hasta él y simplemente haga clic) obtengo el mismo diálogo de opción, pero esta vez las cosas son diferentes:

  • Visor de imágenes Astro: todo funciona como debería.

  • Galería de medios: Todo funciona como debería.

  • Galería 3D: se inicia la actividad pero no veo nada más que una pantalla negra.

Como puedes ver, todo es un completo desastre. No tengo idea de por qué sucede esto, pero sucede así cada vez. No es un error aleatorio.

¿Me estoy perdiendo algo cuando estoy creando la intención? ¿O cuando estoy creando el archivo de imagen? ¿Algunas ideas?

EDITAR: Como se señaló en el comentario aquí es la parte de interés en adb logcat. También debo tener en cuenta que he cambiado la forma en que creo el archivo de imagen. Como quiero crear un archivo que refleje un archivo en línea, simplemente lo descargo en lugar de crear un bitmap y luego crear el archivo (esto se hizo porque en algún momento necesitaba el bitmap, pero ahora lo hago al revés). los problemas persisten en el pensamiento y son exactamente los mismos:

I / ActivityManager (18852): Actividad de inicio: Intención {act = android.intent.action.VIEW dat = / sdcard / Android / data / com.myapp / files / image.jpg typ = image / * flg = 0x3800000 cmp = com .motorola.gallery / .ViewImage}

I / ActivityManager (18852): Iniciar proc com.motorola.gallery:ViewImage para la actividad com.motorola.gallery/.ViewImage: pid = 29187 uid = 10017 gids = {3003, 1015}

I / dalvikvm (29187): El hilo del depurador no está activo, ignorando el envío de DDM (t = 0x41504e4d l = 38)

I / dalvikvm (29187): El hilo del depurador no está activo, ignorando el envío de DDM (t = 0x41504e4d l = 64)

I / ActivityManager (18852): El proceso com.handcent.nextsms (pid 29174) ha muerto.

I / ViewImage (29187): en la imagen de visualización enCreate!

D / AndroidRuntime (29187): apagar VM

W / dalvikvm (29187): threadid = 3: el hilo sale con una excepción no detectada (group = 0x4001b170)

E / AndroidRuntime (29187): controlador no capturado: el hilo sale principal debido a una excepción no detectada

E / AndroidRuntime (29187): java.lang.RuntimeException: No se puede iniciar la actividad ComponentInfo {com.motorola.gallery/com.motorola.gallery.ViewImage}: java.lang.NullPointerException

E / AndroidRuntime (29187): en android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2496)

E / AndroidRuntime (29187): en android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:2512)

E / AndroidRuntime (29187): en android.app.ActivityThread.access $ 2200 (ActivityThread.java:119)

E / AndroidRuntime (29187): en android.app.ActivityThread $ H.handleMessage (ActivityThread.java:1863)

E / AndroidRuntime (29187): en android.os.Handler.dispatchMessage (Handler.java:99)

E / AndroidRuntime (29187): en android.os.Looper.loop (Looper.java:123)

E / AndroidRuntime (29187): en android.app.ActivityThread.main (ActivityThread.java:4363)

E / AndroidRuntime (29187): en java.lang.reflect.Method.invokeNative (método nativo)

E / AndroidRuntime (29187): en java.lang.reflect.Method.invoke (Method.java:521)

E / AndroidRuntime (29187): en com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:860)

E / AndroidRuntime (29187): en com.android.internal.os.ZygoteInit.main (ZygoteInit.java:618)

E / AndroidRuntime (29187): en dalvik.system.NativeStart.main (Método nativo)

E / AndroidRuntime (29187): Causado por: java.lang.NullPointerException

E / AndroidRuntime (29187): en com.motorola.gallery.ImageManager.allImages (ImageManager.java:5621)

E / AndroidRuntime (29187): en com.motorola.gallery.ImageManager.getSingleImageListByUri (ImageManager.java:5515)

E / AndroidRuntime (29187): en com.motorola.gallery.ViewImage.onCreate (ViewImage.java:1801)

E / AndroidRuntime (29187): en android.app.Instrumentation.callActivityOnCreate (Instrumentation.java:1047)

E / AndroidRuntime (29187): en android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2459)

E / AndroidRuntime (29187): … 11 más

Utilicé este truco para corregir el error:

 ... Uri hacked_uri = Uri.parse("file://" + uri.getPath()); intent.setDataAndType(hacked_uri, "image/*"); ... 

Utilicé este código para mi aplicación y funciona bien. Solo hice un pequeño cambio.

He cambiado esto:

 intent.setDataAndType(Uri.parse(posterFile.getAbsolutePath()),"image/*"); 

Para esto:

 intent.setDataAndType(Uri.fromFile(posterFile),"image/*"); 

Decidí crear mi propia actividad que simplemente dibuja la imagen en la pantalla. No es una solución perfecta pero cumple con mis estándares básicos … Funciona 🙂

yo uso este código

  MediaScannerConnection.scanFile(PayamKhosusiActivity.this, new String[] { filez.toString() }, null, new MediaScannerConnection.OnScanCompletedListener() { @Override public void onScanCompleted(String path, Uri uri) { Log.wtf("onScanCompleted", "yes"); Intent intent = new Intent(Intent.ACTION_VIEW, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); intent.setDataAndType(uri, "image/*"); intent.setFlags(FLAG_GRANT_READ_URI_PERMISSION | FLAG_GRANT_WRITE_URI_PERMISSION); //must for reading data from directory startActivity(intent); } });