2012-06-17 31 views
20

He revisado todas las preguntas similares aquí, pero no puedo por la vida de averiguar qué estoy haciendo mal.Lanzando un intento para el tipo de archivo y MIME?

He escrito una aplicación que intenta ejecutar varios archivos, como un buscador de archivos. Cuando se hace clic en un archivo, intenta iniciar el programa en función de su tipo MIME asociado o presenta el cuadro de diálogo "Elegir aplicación para iniciar".

Aquí está el código que estoy usando para lanzar:

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

Esta falla y genera el error:

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

Ahora si instalo OI File Manager, por ejemplo, se abre en vez de esto Se está produciendo un error y, a continuación, si hago clic en el mismo archivo desde dentro, se inician los cuadros de diálogo correspondientes.

He notado que el tipo MIME para ese archivo en particular falla, pero otros tipos de mime como .zip devuelven valores.

¿Me falta algo que cuando el tipo MIME es nulo para llamar a un cuadro de diálogo que permite al usuario seleccionar?

He intentado otras variaciones de lanzamiento de la aplicación, incluso no estableciendo el tipo MIME y solo usando .setData sin éxito.

La acción que deseo que suceda es que un usuario haga clic en un archivo, si está asociado a una aplicación que se inicia, si no, el usuario obtiene el cuadro de diálogo "Utilizar acción completa" con una lista de aplicaciones.

Gracias por cualquier consejo.

+0

¿Qué viene en una cadena de tipo mimet? pégalo aquí –

+0

Parece que si se trata de algo que tiene un archivo asociado es el tipo MIME correcto, pero si es algo que no se ha vinculado a una aplicación, viene a través de un nulo ... – stonedonkey

Respuesta

44

Bueno, gracias a los chicos Intención Abiertas, que se perdió la respuesta primera vez a través de su código en su gestor de archivos, esto es lo que terminó 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); 

Si utiliza un tipo de MIME de "*/*" cuando no puede determinarlo desde el sistema (es null) activa el diálogo de selección de aplicaciones apropiado.

+7

¡ADVERTENCIA! - Para jpgs, el tipo de mime es jpeg y NO jpg. Usando su código, si extrae la extensión jpg, no establecerá correctamente el tipo mime y, como resultado, no podrá ver la imagen. Asegúrese de reemplazar jpg con jpeg al configurar el tipo mime para imágenes jpg. – AndroidDev

+0

gracias me ayuda pero el archivo real no elige después de establecer intent.setDataAndType (datos, tipo); carga de archivo fallida –

+1

Además, MimeTypeMap.getFileExtensionFromUrl no puede manejar bien los apóstrofes: devolverá una cadena vacía para "World'sHello.docx", pero devolverá docx para "WorldzHello.docx". Ver Regex aquí: https://github.com/android/platform_frameworks_base/blob/master/core/java/android/webkit/MimeTypeMap.java – Felix

1

Puede utilizar las intenciones genéricas para abrir archivos, como este fragmento de código que se propone 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(); 
    } 
}  

Pero por lo general veo que las aplicaciones comprueba la extensión del archivo en anidada si y, finalmente, tratar de abrir el archivo 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) { 
    ... 
}  

se puede ver en el código completo this question o en este open source project. Espero que esto te ayude.

+0

Intenté ambos y ninguno da como resultado resultado que estoy buscando. El primer ejemplo genera la misma excepción. El segundo intenta ejecutar solo aplicaciones que entienden texto/plano como un tipo de mimo, por lo que tampoco funcionará. Gracias sin embargo. – stonedonkey

Cuestiones relacionadas