2010-06-02 9 views
6

Prima di tutto lasciatemi dire che questa domanda è leggermente collegata a me da another question. In realtà è stato creato per questo.Avvio Intent.ACTION_VIEW intento non funziona sul file di immagine salvato

Ho il seguente codice per scrivere una bitmap scaricato dalla rete in un file nella scheda 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); 

Alcune note. Sto creando la bitmap "mutabile" dopo aver visto qualcuno che la usa e sembra funzionare meglio che senza. E sto usando il metodo parse sulla classe Uri e non su fromFile perché nel mio codice li sto chiamando in posti diversi e quando sto creando l'intento ho un percorso di stringa invece di un file.

Ora per il mio problema. Il file viene creato. L'intento avvia una finestra di dialogo che mi chiede di selezionare un visualizzatore. Ho 3 visualizzatori installati. Il visualizzatore di immagini Astro, la galleria multimediale di default (ho un milstone su 2.1 ma sulla milestone l'aggiornamento 2.1 non includeva la galleria 3d quindi è quella vecchia) e la galleria 3d da quella nexus (ho trovato l'apk nel selvatico).

Ora, quando lancio il 3 telespettatori la seguenti accadono:

  • Astro visualizzatore di immagini: Le attività lanci, ma non vedo altro che uno schermo nero .

  • Media Gallery: ottengo un'eccezione dialogo mostrato "l'applicazione Media Gallery (processo com.motorola.gallery) ha smesso di inaspettatamente Riprovare." Con una forza opzione Chiudi.

  • Galleria 3D: Tutto funziona come dovrebbe.

Quando provo ad aprire semplicemente il file utilizzando il file Astro manager (navigare ad esso e semplicemente cliccare) ottengo la stessa finestra di opzione, ma questa volta le cose sono diverse:

  • Astro visualizzatore di immagini: Tutto funziona come dovrebbe.

  • Galleria media: Tutto funziona come dovrebbe.

  • Galleria 3D: L'attività viene avviata ma non vedo altro che uno schermo nero.

Come potete vedere tutto è un disastro completo. Non ho idea del perché questo accada ma succede così ogni volta. Non è un bug casuale.

Mi manca qualcosa quando sto creando l'intento? O quando sto creando il file immagine? Qualche idea?

MODIFICA: Come indicato nel commento qui è la parte di interesse in adb logcat. Inoltre dovrei notare che ho cambiato il modo in cui creo il file immagine. Dato che voglio creare un file che rifletta un file online, lo scarro semplicemente invece di creare un Bitmap e quindi creare il file (questo è stato fatto perché ad un certo punto avevo bisogno di Bitmap ma ora lo faccio al contrario). i problemi persistono pensati e sono esattamente gli stessi:

I/ActivityManager(18852): Starting activity: Intent { 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): Start proc com.motorola.gallery:ViewImage for activity com.motorola.gallery/.ViewImage: pid=29187 uid=10017 gids={3003, 1015}

I/dalvikvm(29187): Debugger thread not active, ignoring DDM send (t=0x41504e4d l=38)

I/dalvikvm(29187): Debugger thread not active, ignoring DDM send (t=0x41504e4d l=64)

I/ActivityManager(18852): Process com.handcent.nextsms (pid 29174) has died.

I/ViewImage(29187): In View Image onCreate!

D/AndroidRuntime(29187): Shutting down VM

W/dalvikvm(29187): threadid=3: thread exiting with uncaught exception (group=0x4001b170)

E/AndroidRuntime(29187): Uncaught handler: thread main exiting due to uncaught exception

E/AndroidRuntime(29187): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.motorola.gallery/com.motorola.gallery.ViewImage}: java.lang.NullPointerException

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

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

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

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

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

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

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

E/AndroidRuntime(29187): at java.lang.reflect.Method.invokeNative(Native Method)

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

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

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

E/AndroidRuntime(29187): at dalvik.system.NativeStart.main(Native Method)

E/AndroidRuntime(29187): Caused by: java.lang.NullPointerException

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

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

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

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

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

E/AndroidRuntime(29187): ... 11 more

+1

Qual è l'output 'adb logcat' per l'arresto' com.motorola.gallery'? Inoltre, 'image/*' non è tecnicamente un mimetype valido, potresti aver bisogno di usare quelli corretti come 'image/jpeg'. –

+0

ha pubblicato anche il log cat dump –

+0

, le app demo in bundle con sdk non forniscono un esempio che lanci l'intento come "audio/*"? Ho pensato che sarebbe stato lo stesso per le immagini ... –

risposta

33

ho usato questo trucco per la correzione di errore:

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

Il mio amico è un risparmiatore di vita :) –

+4

NB: Avevo impostato i dati e digitato in due chiamate separate che non funzionavano. Inserirli in una chiamata come fatto qui risolveva il problema per me. – Thorstenvv

+0

La chiave per me era usare 'image/*' come tipo. L'app Samsung's Gallery ha funzionato bene con 'image/jpg', ma l'app Motorola's Gallery non lo ha fatto (stavo ricevendo' ActivityNotFoundException'). – user113215

2

Ho deciso di creare la mia attività che semplicemente disegna l'immagine sullo schermo. Non è una soluzione perfetta ma soddisfa i miei standard di base ... Funziona :)

4

Ho usato questo codice per la mia app e funziona perfettamente. Ho fatto solo un piccolo cambiamento.

ho cambiato questa:

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

Per questo:

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

io uso questo codice

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); 
          } 
         }); 
Problemi correlati