2012-06-17 10 views
20

Ho esaminato tutte le domande simili qui, ma non posso per la vita di me capire cosa sto facendo male.Avvio di un intento per il file e il tipo MIME?

Ho scritto un'applicazione che tenta di avviare vari file, una specie di browser di file. Quando si fa clic su un file, tenta di avviare il programma in base al tipo MIME associato o presenta la finestra di dialogo "Scegli applicazione da avviare".

Ecco il codice che sto usando per lanciare:

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

questo non riesce e genera l'errore:

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

Ora, se installo OI File Manager per esempio, si apre al posto di questo viene generato un errore, quindi se faccio clic sullo stesso file dall'interno in esso, vengono avviate le finestre di dialogo appropriate.

Ho notato che il tipo MIME per quel particolare file fallisce, ma altri tipi di mime come .zip restituiscono valori.

Mi manca qualcosa che quando il tipo MIME è nullo per chiamare una finestra di dialogo che consente all'utente di selezionare?

Ho provato altre varianti di avvio dell'app, incluso non impostare il tipo MIME e utilizzare solo .setData senza successo.

L'azione che desidero è che un utente fa clic su un file, se è associato a un'applicazione avviata dall'app, in caso contrario, l'utente ottiene la finestra di dialogo "Azione completa utilizzando" con un elenco di app.

Grazie per qualsiasi consiglio.

+0

cosa sta arrivando in mimo stringa ?? incollalo qui –

+0

Sembra che sia qualcosa che ha un file associato è il tipo MIME corretto, ma se è qualcosa che non è stato legato ad un'app, passa attraverso null .. – stonedonkey

risposta

44

Bene grazie ai ragazzi Intent Open, ho perso la risposta la prima volta attraverso il loro codice nel proprio file manager, ecco cosa ho finito con:

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

Se si utilizza un tipo MIME di "*/*" quando non è possibile determinarlo dal sistema (è null) attiva l'appropriata finestra di dialogo di selezione dell'applicazione.

+7

ATTENZIONE! - Per i jpg, il tipo mime è jpeg e NON jpg. Usando il tuo codice, se estrai l'estensione jpg, non imposterà correttamente il tipo mime e, di conseguenza, non sarai in grado di visualizzare l'immagine. Assicurati di sostituire jpg con jpeg quando imposti il ​​tipo mime per le immagini jpg. – AndroidDev

+0

grazie al suo aiuto, ma il file effettivo non viene scelto dopo aver impostato intent.setDataAndType (data, type); caricamento file fallito. –

+1

Inoltre, MimeTypeMap.getFileExtensionFromUrl non può gestire bene gli apostrofi: restituirà una stringa vuota per "World'sHello.docx", ma restituirà docx per "WorldzHello.docx". Vedere Regex qui: https://github.com/android/platform_frameworks_base/blob/master/core/java/android/webkit/MimeTypeMap.java – Felix

1

È possibile utilizzare intenti generiche per aprire i file, come questo frammento di codice che viene proposto here:

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

Ma io di solito vedere che le applicazioni controlla l'estensione del file in nidificato se e, infine, cercare di aprire il file con " text/plain "tipo:

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

Si può vedere il codice completo in this question o in questo open source project. Spero che questo ti sia d'aiuto.

+0

Ho provato entrambi e nessuno dei due risultati nel risultato che sto cercando. Il primo esempio genera la stessa eccezione. Il secondo tenta di avviare solo le app che comprendono testo/plain come un tipo mime, quindi non funzionerà neanche. Grazie però. – stonedonkey

Problemi correlati