2012-09-25 8 views
16

Wie kann ich eine Datei öffnen, die zuvor im "privaten" Dateisystem gespeichert wurde? Die Datei wird von einem Webservice heruntergeladen und sollte auf lokalen fs gespeichert werden. Ich habe einen "seltsamen" Fehler beim Versuch, die Datei über eine Absicht (Action_View) zu öffnen. Obwohl die Datei im Dateisystem vorhanden ist (die Datei im Datei-Explorer im Emulator/Eclipse), wird sie in der aufrufenden Galerieaktivität, die gestartet wird, nicht angezeigt. Anstelle des Bildes zeigt die Galerie einen schwarzen Bildschirm mit nicht Inhalt (außer der Aktionsleiste). Das gleiche passiert, wenn Sie versuchen, eine PDF/Film/MP3-Datei über diese Methode zu öffnen (pdf sagt zum Beispiel, dass die Datei beschädigt ist).So öffnen Sie eine Datei in Android über eine Absicht

BTW: Die Daten, die auf dem lokalen fs gespeichert wurden, gültig ist (nicht korrupt), die ich heruntergeladen hat die Dateien aus Debugger (über Pull-Methode) und die Dateien können auf meiner Workstation geöffnet werden ...

public void onAttachment(Context context, Attachment attachment) { 
    try { 
     //Attachment is a structured data object that contains of a byte[], filename and mimetype (like image/jpeg) 
     FileOutputStream fos = FileOutputStream fos = context.openFileOutput(attachment.getAttachmentFileName(), Context.MODE_PRIVATE); 
     fos.write(attachment.getBinary()); 
     fos.flush(); 
     fos.close(); 
     File f = context.getFileStreamPath(attachment.getAttachmentFileName()); 
     Uri uri = Uri.fromFile(f);   
     Intent intent = new Intent(Intent.ACTION_VIEW); 
     intent.setDataAndType(uri,attachment.getAttachmentMimetype()); 
     context.startActivity(intent);     
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
}   
+0

vielleicht Einstellung es http://stackoverflow.com/questions/11068648/launching-an-intent-for-file -und-Mime-Typ/11088980 # 11088980 kann helfen. – ademar111190

Antwort

2

Wenn die Position auf "openFileOutput("fileName", Activity.MODE_WORLD_READABLE)" eingestellt wird, funktioniert es. Andere Anwendungen können die Daten nicht lesen (auch für Leser) gespeichert, wenn auf „Context.MODE_PRIVATE

siehe other post on stackoverflow

12

Welcher Typ ist Anhang in Ihrem Code? Vielleicht gibt es einen falschen Mime-Typ zurück?

Dieser Code funktioniert für mich:

File file = new File("EXAMPLE.JPG"); 

// Just example, you should parse file name for extension 
String mime = MimeTypeMap.getSingleton().getMimeTypeFromExtension(".JPG"); 

Intent intent = new Intent(); 
intent.setAction(android.content.Intent.ACTION_VIEW); 
intent.setDataAndType(Uri.fromFile(file), mime); 
startActivityForResult(intent, 10); 
+0

Nein, das funktioniert nicht ... Das Problem ist, dass die Aktivität erfolgreich gestartet wird (Galerie, Film-/Audioplayer, PDF-Reader), aber der Inhalt (Datei) scheint ungültig zu sein ... –

+0

Der Anhang gibt das zurück richtiger Mimetyp, sonst wird die richtige Aktivität (Galery/Mediaplayer/PDF-Reader) überhaupt nicht gestartet. –

+0

Falsch. Der Parameter von getMimeTypeFromExtension MUSS eine Dateierweiterung ohne das führende '.' Sein. – armandooj

2

Sie können Dateien nicht öffnen, die nicht auf der SD-Karte so sind. Sie müssen die Datei auf die SD-Karte kopieren und dann öffnen.

+0

Können Sie mir einen Link geben, wo dies von Google (in SDK-Dokumentation) bestätigt wird. Ich habe nichts darüber in der offiziellen Dokumentation gefunden ... BTW: Wenn ich die Datei in einer eigenen Aktivität öffnen, die Bilder verarbeiten kann, funktioniert es ... –

+0

Leider rede ich aus Erfahrung, also tue ich nicht habe einen Link. Aber es ist das gleiche Problem wie beim Hochladen oder E-Mailen einer Datei, die nicht in der SDCARD ist ... Das gleiche gilt für das Öffnen von Webview-Seiten & etc .. Hoffe es hilft ... Sorry wenn nicht .. – Givi

+0

Also ich muss eigenen Viewer schreiben - "Aktivitäten", die mit den Dateien umgehen können, die in diesem privaten Ordner gespeichert sind? –