ACTION_VIEW意图使用未知MimeType的文件

dan*_*roa 59 android

我的应用程序具有浏览手机和SD卡上的文件并使用其他应用程序打开它们的功能.我想要一个解决方案,我不必指定MimeType,可以使用任何类型的文件.

这是我的代码:

Intent myIntent = new Intent(Intent.ACTION_VIEW);
myIntent.setData(Uri.fromFile(item));
startActivity(myIntent);
Run Code Online (Sandbox Code Playgroud)

但是,我收到以下错误:

android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.PICK dat=file:///sdcard/dropbox/test.pdf }
Run Code Online (Sandbox Code Playgroud)

NoB*_*ugs 117

这应该检测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();
}
Run Code Online (Sandbox Code Playgroud)

使用此功能:

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

    }
}
Run Code Online (Sandbox Code Playgroud)

  • [URLConnection.guessContentTypeFromName(url)](http://developer.android.com/reference/java/net/URLConnection.html#guessContentTypeFromName(java.lang.String))怎么样? (9认同)
  • 这段代码有问题:在第三行代码中你不应该使用substring(1).使用这一行:`String mimeType = myMime.getMimeTypeFromExtension(fileExt(getFile()));`.(fileExt只返回没有点的扩展名.) (5认同)
  • 用户FileProvider而不是目标> = 24 orroids上的URI.fromFile() (2认同)

Bad*_*llz 14

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);
Run Code Online (Sandbox Code Playgroud)


ser*_*xjo 7

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);
Run Code Online (Sandbox Code Playgroud)

起初我尝试用文件内容猜测,但是我看到它总是返回null.


Ame*_*een 6

尝试这个几乎覆盖所有文件扩展名

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

}
Run Code Online (Sandbox Code Playgroud)

  • 我使用了 url.toString().contains(".zip") || url.toString().contains(".rar") 和 application/x-wav 但我收到错误 android.content.ActivityNotFoundException: No Activity found to handle Intent 任何解决方案 (2认同)

Ale*_*dam 5

Android不会基于文件扩展名启动活动,除非有一个应用程序为其指定特定的意图过滤器.您将需要mime类型来Intent告诉android足够的信息以启动右侧Activity.

您可以选择使用MimeTypeMap类自动执行此任务.检查方法String getMimeTypeFromExtension(String extension).

顺便说一句,您的设备中是否安装了PDF阅读器?

您还应该处理此异常,可能是通过显示一个漂亮的弹出窗口,说明该特定类型的文件没有应用程序.


Tam*_*mui 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); 
Run Code Online (Sandbox Code Playgroud)

getMimeType()在哪里。...(此方法将返回所需的mime类型;如果文件没有任何适当的mime类型,则此方法将返回null)...

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;
    }
Run Code Online (Sandbox Code Playgroud)