8 Stimmen

Starten der Absicht Intent.ACTION_VIEW funktioniert nicht bei gespeicherter Bilddatei

Zunächst möchte ich darauf hinweisen, dass diese Fragen etwas mit folgenden Themen zu tun haben weitere Frage von mir. Eigentlich ist es deswegen entstanden.

Ich habe den folgenden Code, um eine aus dem Netz heruntergeladene Bitmap in eine Datei auf der SD-Karte zu schreiben:

// 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);

Ein paar Anmerkungen. Ich erstelle die "veränderbare" Bitmap, nachdem ich gesehen habe, dass jemand sie verwendet und es scheint besser zu funktionieren als ohne sie. Und ich bin mit der Parse-Methode auf die Uri-Klasse und nicht die fromFile, weil in meinem Code ich diese an verschiedenen Stellen aufrufen und wenn ich die Absicht, ich habe einen String-Pfad anstelle einer Datei erstellen.

Nun zu meinem Problem. Die Datei wird erstellt. Der Intent startet ein Dialogfeld, in dem ich aufgefordert werde, einen Viewer auszuwählen. Ich habe 3 Betrachter installiert. Der Astro Bildbetrachter, die Standard-Mediengalerie (ich habe einen Milstone auf 2.1, aber auf dem Milestone hat das 2.1-Update nicht die 3D-Galerie enthalten, so dass es die alte ist) und die 3D-Galerie aus dem Nexus ein (ich fand die apk in der Wildnis).

Wenn ich jetzt die 3 Viewer starte, passiert folgendes:

  • Astro-Bildbetrachter: Die Aktivität wird gestartet, aber ich sehe nichts außer einem schwarzen Bildschirm.

  • Mediengalerie: Ich erhalte eine Ausnahme Dialog angezeigt "Die Anwendung Media Gallery (Prozess com.motorola.gallery) wurde angehalten unerwartet gestoppt. Bitte versuchen Sie es erneut" mit einer Option zum erzwungenen Schließen.

  • 3D-Galerie: Alles funktioniert wie es soll sollte.

Wenn ich versuche, die Datei einfach mit dem Astro-Dateimanager zu öffnen (durchsuchen und einfach anklicken), erhalte ich denselben Optionsdialog, aber dieses Mal ist es anders:

  • Astro-Bildbetrachter: Alles funktioniert wie es sollte.

  • Mediengalerie: Alles funktioniert wie es soll sollte.

  • 3D-Galerie: Die Aktivität wird gestartet, aber ich sehe nichts als einen schwarzen Bildschirm.

Wie Sie sehen können, ist alles ein völliges Durcheinander. Ich habe keine Ahnung, warum das passiert, aber es passiert jedes Mal auf diese Weise. Es ist kein zufälliger Fehler.

Übersehe ich etwas, wenn ich die Absichtserklärung erstelle? Oder wenn ich die Bilddatei erstelle? Irgendwelche Ideen?

EDITAR: Wie in dem Kommentar erwähnt, ist hier der Teil von Interesse in adb logcat. Außerdem sollte ich erwähnen, dass ich die Art und Weise, wie ich die Image-Datei erstelle, geändert habe. Da ich eine Datei erstellen möchte, die eine Online-Datei widerspiegelt, lade ich sie einfach herunter, anstatt eine Bitmap zu erstellen und dann die Datei zu erstellen (dies wurde getan, weil ich irgendwann die Bitmap brauchte, aber jetzt mache ich es andersherum). die Probleme bleiben bestehen und sind genau die gleichen:

I/ActivityManager(18852): Start von Aktivität: Intent { act=Android.intent.action.VIEW dat=/sdcard/Android/data/com.myapp/files/image.jpg typ=Bild/* flg=0x3800000 cmp=com.motorola.gallery/.ViewImage }

I/ActivityManager(18852): Start proc com.motorola.gallery:ViewImage für Aktivität com.motorola.gallery/.ViewImage: pid=29187 uid=10017 gids={3003, 1015}

I/dalvikvm(29187): Debugger-Thread nicht aktiv, ignoriert DDM-Sendung (t=0x41504e4d l=38)

I/dalvikvm(29187): Debugger-Thread nicht aktiv, ignoriert DDM-Sendung (t=0x41504e4d l=64)

I/ActivityManager(18852): Prozess com.handcent.nextsms (pid 29174) ist gestorben.

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

D/AndroidRuntime(29187): Herunterfahren VM

W/dalvikvm(29187): threadid=3: thread Beendet mit nicht gefangener Ausnahme (group=0x4001b170)

E/AndroidRuntime(29187): Uncaught handler: Thread main beendet sich aufgrund einer nicht gefangenen Ausnahme

E/AndroidRuntime(29187): java.lang.RuntimeException: Unable to Aktivität starten 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): bei Android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2512)

E/AndroidRuntime(29187): bei Android.app.ActivityThread.access$2200(ActivityThread.java:119)

E/AndroidRuntime(29187): bei Android.app.ActivityThread$H.handleMessage(ActivityThread.java:1863)

E/AndroidRuntime(29187): bei Android.os.Handler.dispatchMessage(Handler.java:99)

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

E/AndroidRuntime(29187): bei Android.app.ActivityThread.main(ActivityThread.java:4363)

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

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): bei com.Android.internal.os.ZygoteInit.main(ZygoteInit.java:618)

E/AndroidRuntime(29187): bei dalvik.system.NativeStart.main(Native Methode)

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

E/AndroidRuntime(29187): bei 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): bei Android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)

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

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

35voto

Vlad Punkte 1502

Ich habe diesen Hack benutzt, um den Fehler zu beheben:

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

4voto

Estiven Restrepo Punkte 166

Ich habe diesen Code für meine App verwendet und er funktioniert gut. Ich habe nur eine kleine Änderung vorgenommen.

Ich habe dies geändert:

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

Hierfür:

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

2voto

Savvas Dalkitsis Punkte 11241

Ich beschloss, eine eigene Aktivität zu erstellen, die einfach das Bild auf dem Bildschirm zeichnet. Es ist keine perfekte Lösung, aber sie erfüllt meine grundlegenden Anforderungen... Es funktioniert :)

0voto

kamran hatami Punkte 122

Ich benutze diesen Code

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X