¿Iniciando una intención para el tipo de archivo y MIME?

He revisado todas las preguntas similares aquí, pero no puedo por la vida de mí averiguar lo que estoy haciendo mal.

He escrito una aplicación que intenta iniciar varios archivos, una especie de navegador de archivos. Cuando se hace clic en un archivo, intenta iniciar el programa basado en su tipo MIME asociado o presenta el 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); 

Esto 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 bien, si instalo OI File Manager por ejemplo, se abre en lugar de este error que se está lanzando, y luego si hago clic en el mismo archivo desde dentro en él, se inicia el apprunote diálogos.

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

¿Estoy perdiendo algo que cuando el tipo MIME es nulo para llamar a un diálogo que permite al usuario seleccionar?

He intentado otras variaciones del lanzamiento de la aplicación, incluyendo no fijar el tipo de MIME y usar solamente .setData sin éxito.

La acción que quiero que ocurra es que un usuario haga clic en un archivo, si está asociado con una aplicación que la aplicación inicia. De lo contrario, el usuario obtiene el cuadro de diálogo "Acción completa usando" con una lista de aplicaciones.

Gracias por cualquier consejo.

Bueno, gracias a los chicos de Open Intent, perdí la respuesta la 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 mime de "* / *" cuando no puede determinarlo desde el sistema (es null ), se dispara el cuadro de diálogo apropiado de la aplicación de selección.

Puede utilizar intentos genéricos para abrir archivos, como este código de fragmento de código que se propone aquí :

 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 veo generalmente que las aplicaciones comprueban la extensión del archivo anidada si y finalmente intento para abrir el archivo con " texto / plain " mecanografían:

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

Puede ver código completo en esta pregunta o en este proyecto de código abierto . Espero que esto te ayude.

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.