android - 检查查看器以在 Android Lollipop 中打开文件

标签 android android-5.0-lollipop android-package-managers

在 android/Hybrid 应用程序中,我使用以下代码来检查“设备上是否安装了打开文件的查看器”

private boolean detectFileViewer(String fileExt) throws InterruptedException,
JSONException {
    try {
        PackageManager packageManager = cordova.getActivity().getPackageManager();
        Intent testIntent = new Intent(Intent.ACTION_VIEW);
        testIntent.setType( MimeTypeMap.getSingleton().getMimeTypeFromExtension(fileExt));
        if (packageManager.queryIntentActivities(testIntent, PackageManager.MATCH_DEFAULT_ONLY).size() > 0) {
            return true;
        } else {
            return false;
        }
    } catch (Exception e) {
        return false;
    }
}

在 Android Lollipop 上,如果只有默认的 PDF 查看器,即“Drive PDF Viewer”存在,上面的代码将返回 false as

PackageManager.MATCH_DEFAULT_ONLY

返回空数组。 此外,上面的代码在以前版本的 Android 上运行良好。

在装有 Android Lollipop 的 nexus 4 和 nexus 5 上测试。

最佳答案

   public static void openFile(final Context context, File url, final Activity activity) throws IOException {
    // Create URI
    File file = url;
    Uri uri = Uri.fromFile(file);

    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 {
        intent.setDataAndType(uri, "*/*");
    }
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    try {
            context.startActivity(intent);
    } catch (ActivityNotFoundException e) {
        Toast.makeText(context, "There isn't any program open this file!!", Toast.LENGTH_SHORT).show();
    }

}

你想要这样吗?还是只是检查一下?

关于android - 检查查看器以在 Android Lollipop 中打开文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27249165/

相关文章:

android - 带有 AppCompat-v7 的工具栏和上下文操作栏

Android 向项目添加自定义 lint 规则 (git)

Android Facebook 使用新的 3.0 Facebook SDK checkin

java - 自定义字体不适用于 Android 5.0,但适用于其他地方

android - 共享元素转换没有预期的行为

android - 使用 Polaris office 5 从外部打开 PDF 返回 "This document cannot be opened"

android - 如何获取android :configChanges values from ActivityInfo class

android - 我应该如何在 linux 容器 (lxc) 中运行 android?

java - 字符串数组[0]不通过if

android - PackageManager.getInstalledApplications(flag)中标准应用程序的哪个标志?