Цель ACTION_VIEW для файла с неизвестным MimeType

Мое приложение имеет функцию, которая просматривает файлы на вашем телефоне и SD-карте и открывает их с помощью других приложений. Я хочу решение, где мне не нужно указывать MimeType и работать с любым типом файла.

Вот мой код:

Intent myIntent = new Intent(Intent.ACTION_VIEW); myIntent.setData(Uri.fromFile(item)); startActivity(myIntent); 

Однако, я получаю следующую ошибку:

 android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.PICK dat=file:///sdcard/dropbox/test.pdf } 

Solutions Collecting From Web of "Цель ACTION_VIEW для файла с неизвестным MimeType"

Это должно обнаружить mimetype и открыть по умолчанию:

 MimeTypeMap myMime = MimeTypeMap.getSingleton(); Intent newIntent = new Intent(Intent.ACTION_VIEW); String mimeType = myMime.getMimeTypeFromExtension(fileExt(getFile()).substring(1)); newIntent.setDataAndType(Uri.fromFile(getFile()),mimeType); newIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); try { context.startActivity(newIntent); } catch (ActivityNotFoundException e) { Toast.makeText(context, "No handler for this type of file.", Toast.LENGTH_LONG).show(); } 

Используя эту функцию:

 private String fileExt(String url) { if (url.indexOf("?") > -1) { url = url.substring(0, url.indexOf("?")); } if (url.lastIndexOf(".") == -1) { return null; } else { String ext = url.substring(url.lastIndexOf(".") + 1); if (ext.indexOf("%") > -1) { ext = ext.substring(0, ext.indexOf("%")); } if (ext.indexOf("/") > -1) { ext = ext.substring(0, ext.indexOf("/")); } return ext.toLowerCase(); } } 
 Intent myIntent = new Intent(Intent.ACTION_VIEW); String mime=URLConnection.guessContentTypeFromStream(new FileInputStream(item)); if(mime==null) mime=URLConnection.guessContentTypeFromName(item.getName()); myIntent.setDataAndType(Uri.fromFile(item), mime); startActivity(myIntent); 

Сначала я пытаюсь угадать содержимое файла, но, как я вижу, он всегда возвращает null.

Android не запускает действия на основе расширений файлов, если только приложение не указывает на него особый фильтр намерений. Вам понадобится тип mime для Intent чтобы сообщить андроиду достаточную информацию, чтобы начать правильное действие.

У вас есть возможность автоматизировать эту задачу, используя класс MimeTypeMap . Проверьте метод String getMimeTypeFromExtension(String extension) .

Кстати, у вас есть устройство для чтения PDF, установленное на вашем устройстве?

Вы также должны обработать это исключение, возможно, показывая хорошее всплывающее сообщение о том, что для этого типа файла нет приложения.

CreateChooser должен сделать трюк:

 Intent myIntent = new Intent(Intent.ACTION_VIEW); myIntent.setData(Uri.fromFile(item)); Intent j = Intent.createChooser(myIntent, "Choose an application to open with:"); startActivity(j); 

Вы можете узнать тип файла mime и создать собственное намерение открыть файл.

Используйте следующий код, чтобы открыть любой файл …

 File temp_file=new File("YOUR FILE PATH"); Intent intent = new Intent(); intent.setAction(android.content.Intent.ACTION_VIEW); intent.setDataAndType(Uri.fromFile(temp_file),getMimeType(temp_file.getAbsolutePath())); startActivity(intent); 

Где getMimeType () is …. (этот метод вернет желаемый тип mime или null, если у файла нет соответствующего типа mime) …

 private String getMimeType(String url) { String parts[]=url.split("\\."); String extension=parts[parts.length-1]; String type = null; if (extension != null) { MimeTypeMap mime = MimeTypeMap.getSingleton(); type = mime.getMimeTypeFromExtension(extension); } return type; } 

Простой файл общего доступа ("multipart /")

 Intent intent = new Intent(Intent.ACTION_SEND); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(file)); intent.setType("multipart/"); startActivity(intent); 

Попробуйте, это почти охватывает все расширения файлов

  public void openFile(File url) { Uri uri = Uri.fromFile(url); Intent intent = new Intent(Intent.ACTION_VIEW); if (url.toString().contains(".doc") || url.toString().contains(".docx")) { // Word document intent.setDataAndType(uri, "application/msword"); } else if (url.toString().contains(".pdf")) { // PDF file intent.setDataAndType(uri, "application/pdf"); } else if (url.toString().contains(".ppt") || url.toString().contains(".pptx")) { // Powerpoint file intent.setDataAndType(uri, "application/vnd.ms-powerpoint"); } else if (url.toString().contains(".xls") || url.toString().contains(".xlsx")) { // Excel file intent.setDataAndType(uri, "application/vnd.ms-excel"); } else if (url.toString().contains(".zip") || url.toString().contains(".rar")) { // WAV audio file intent.setDataAndType(uri, "application/x-wav"); } else if (url.toString().contains(".rtf")) { // RTF file intent.setDataAndType(uri, "application/rtf"); } else if (url.toString().contains(".wav") || url.toString().contains(".mp3")) { // WAV audio file intent.setDataAndType(uri, "audio/x-wav"); } else if (url.toString().contains(".gif")) { // GIF file intent.setDataAndType(uri, "image/gif"); } else if (url.toString().contains(".jpg") || url.toString().contains(".jpeg") || url.toString().contains(".png")) { // JPG file intent.setDataAndType(uri, "image/jpeg"); } else if (url.toString().contains(".txt")) { // Text file intent.setDataAndType(uri, "text/plain"); } else if (url.toString().contains(".3gp") || url.toString().contains(".mpg") || url.toString().contains(".mpeg") || url.toString().contains(".mpe") || url.toString().contains(".mp4") || url.toString().contains(".avi")) { // Video files intent.setDataAndType(uri, "video/*"); } else { //if you want you can also define the intent type for any other file //additionally use else clause below, to manage other unknown extensions //in this case, Android will show all applications installed on the device //so you can choose which application to use intent.setDataAndType(uri, "*/*"); } intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(intent); } 

Проблема с ответом NoBugs. Это прямо из окна информации функции затмения:

String android.webkit.MimeTypeMap.getMimeTypeFromExtension (расширение строки)

Public String getMimeTypeFromExtension (расширение строки)

С: API уровня 1

Верните тип MIME для данного расширения.

параметры

Extension Расширение файла без ведущего '.'

Возвращает тип MIME для данного расширения или null, если его нет.

Используйте этот метод, чтобы получить тип MIME из uri файла:

 public static String getMimeType(String url) { String type = null; String extension = url.substring(url.lastIndexOf(".") + 1); if (extension != null) { type = MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension); } return type; }