Цель 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 }
Ответы
Ответ 1
Это должно обнаружить тип 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();
}
}
Ответ 2
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.
Ответ 3
Android не запускает действия на основе расширений файлов, если там не указано приложение, которое указывает для него особый фильтр намерений. Вам понадобится тип mime для Intent
, чтобы сообщить андроиду достаточную информацию, чтобы начать правый Activity
.
У вас есть возможность автоматизировать эту задачу, используя класс MimeTypeMap. Проверьте метод String getMimeTypeFromExtension(String extension)
.
Кстати, у вас есть устройство для чтения PDF, установленное на вашем устройстве?
Вы также должны обработать это исключение, возможно, показывая приятное всплывающее сообщение о том, что для этого типа файла нет приложения.
Ответ 4
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);
Ответ 5
Вы можете узнать тип файла 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;
}
Ответ 6
Простой файл общего доступа ( "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);
Ответ 7
Существует проблема с ответом NoBugs. Это непосредственно из окна информации функции затмения:
String android.webkit.MimeTypeMap.getMimeTypeFromExtension(String расширение)
public String getMimeTypeFromExtension (расширение строки)
Поскольку: Уровень API 1
Верните тип MIME для данного расширения.
Параметры
extension Расширение файла без ведущего '.'
Возвращает тип MIME для данного расширения или null, если его нет.
Ответ 8
Используйте этот метод, чтобы получить тип 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;
}
Ответ 9
попробуйте это, почти все расширения файлов
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);
}