2012-06-17 5 views
20

Ich habe alle ähnlichen Fragen hier überprüft, aber ich kann nicht für das Leben von mir herausfinden, was ich falsch mache.Starten einer Absicht für Datei und MIME-Typ?

Ich habe eine Anwendung geschrieben, die versucht, verschiedene Dateien zu starten, eine Art Dateibrowser. Wenn auf eine Datei geklickt wird, wird versucht, das Programm basierend auf dem zugehörigen MIME-Typ zu starten, oder es wird der Dialog "Anwendungsauswahl zum Starten" angezeigt.

Hier ist der Code, den ich starten bin mit:

File file = new File(app.mediaPath() + "/" +_mediaFiles.get(position)); 

    Intent myIntent = new Intent(android.content.Intent.ACTION_VIEW); 

    String extension = android.webkit.MimeTypeMap.getFileExtensionFromUrl(Uri.fromFile(file).toString()); 
    String mimetype = android.webkit.MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension); 
    myIntent.setDataAndType(Uri.fromFile(file),mimetype); 
    startActivity(myIntent); 

Dies schlägt fehl, und erzeugt den Fehler:

android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.VIEW dat=file:///file:/mnt/sdcard/roms/nes/Baseball_simulator.nes } 

Nun, wenn ich OI File Manager zum Beispiel installieren, es öffnet sich statt dessen Fehler wird ausgelöst, und wenn ich dann auf die gleiche Datei klicke, werden die entsprechenden Dialoge gestartet.

Ich habe festgestellt, dass der MIME-Typ für diese bestimmte Datei fehlschlägt, aber andere Mime-Typen wie .zip geben Werte zurück.

Fehle ich etwas, das, wenn der MIME-Typ null ist, einen Dialog aufzurufen, der den Benutzer auswählen lässt?

Ich habe andere Varianten des Startens der App ausprobiert, einschließlich der Einstellung des MIME-Typs und nur mit .setData ohne Erfolg.

Die Aktion, die ich ausführen möchte, ist ein Benutzer klickt auf eine Datei, wenn es mit einer Anwendung verknüpft ist, die App startet, wenn nicht, erhält der Benutzer den Dialog "Aktion abschließen mit" mit einer Liste von Anwendungen.

Danke für jeden Hinweis.

+0

was kommt in mimeype string ?? fügen Sie es hier ein –

+0

Sieht aus, als ob es etwas ist, das eine zugeordnete Datei hat, ist es der richtige MIME-Typ, aber wenn es etwas ist, das nicht an eine App gebunden wurde, kommt es durch null .. – stonedonkey

Antwort

44

Nun dank der offenen Intent Jungs, ich die Antwort beim ersten Mal durch ihren Code in ihrem Dateimanager, hier verpaßt, was ich am Ende mit:

File file = new File(filePath); 
    MimeTypeMap map = MimeTypeMap.getSingleton(); 
    String ext = MimeTypeMap.getFileExtensionFromUrl(file.getName()); 
    String type = map.getMimeTypeFromExtension(ext); 

    if (type == null) 
     type = "*/*"; 

    Intent intent = new Intent(Intent.ACTION_VIEW); 
    Uri data = Uri.fromFile(file); 

    intent.setDataAndType(data, type); 

    startActivity(intent); 

Wenn Sie einen MIME-Typen von "*/*" verwenden, wenn Sie können es nicht vom System bestimmen (es ist null) es feuert den entsprechenden Select-Anwendungsdialog.

+7

WARNUNG! - Für Jpgs ist der Mime-Typ JPEG und NICHT Jpg. Wenn Sie mit Ihrem Code die jpg-Erweiterung extrahieren, wird der MIME-Typ nicht korrekt eingestellt und Sie können das Bild daher nicht sehen. Stellen Sie sicher, jpg durch jpeg zu ersetzen, wenn Sie den Mime-Typ für JPG-Bilder einstellen. – AndroidDev

+0

danke seine Hilfe mir aber tatsächliche Datei nicht chooser nach dem Festlegen von intent.setDataAndType (Daten, Typ); Datei-Upload fehlgeschlagen. –

+1

Auch die MimeTypeMap.getFileExtensionFromUrl kann Apostroph nicht gut behandeln: Es wird eine leere Zeichenfolge für "World'sHello.docx" zurückgeben, aber docx für "WorldzHello.docx" zurückgeben. Siehe Regex Hier: https://github.com/android/platform_frameworks_base/blob/master/core/java/android/webkit/MimeTypeMap.java – Felix

1

können Sie generische Absichten verwenden, um Dateien zu öffnen, wie dieser Schnipsel Code, here vorgeschlagen:

private void openFile(File aFile){ 
    try { 
     Intent myIntent = new Intent(android.content.Intent.VIEW_ACTION, 
     new ContentURI("file://" + aFile.getAbsolutePath())); 
     startActivity(myIntent); 
    } catch (URISyntaxException e) { 
     e.printStackTrace(); 
    } 
}  

Aber ich sehe in der Regel, dass Anwendungen die Erweiterung der Datei überprüft in verschachtelten if und schließlich versuchen, Datei zu öffnen, mit " text/plain "Typ:

Intent generic = new Intent(); 
generic.setAction(android.content.Intent.ACTION_VIEW); 
generic.setDataAndType(Uri.fromFile(file), "text/plain");  
try { 
    startActivity(generic); 
    } catch(ActivityNotFoundException e) { 
    ... 
}  

Sie vollständigen Code in this question oder in diesen open source project sehen können. Ich hoffe das hilft dir.

+0

Ich versuchte beide und beide Ergebnisse in der Ergebnis, das ich suche. Das erste Beispiel generiert dieselbe Ausnahme. Die zweite versucht nur Apps zu starten, die text/plain als Mime-Typ verstehen, so dass es auch nicht funktioniert. Danke, obwohl. – stonedonkey