【问题标题】:Android: Is it possible to check the file is an apk file if no extension suppliedAndroid:如果没有提供扩展名,是否可以检查文件是 apk 文件
【发布时间】:2017-01-22 22:46:14
【问题描述】:

我正在编写一个将文件上传到另一台设备的应用程序。我必须限制如何将文件类型共享到另一台设备。我可以检查文件扩展名,但有没有更安全的方法来检查文件是否为 apk。

【问题讨论】:

标签: android file apk file-extension


【解决方案1】:

是的,你可以。 android apk 文件是zip archive

因此您可以检查文件是否为 zip 文件,并确认 classes.dexAndroidManifest.xml 文件存在。

【讨论】:

  • 你知道如何进入文件以编程方式检查它吗?
  • 我通过使用 JarFile 类并查找清单文件的条目找到了解决方案
【解决方案2】:

考虑到Passer by的思想,这里有一个检查文件是否为有效APK的方法

       public static boolean isAPK(File file) {
            FileInputStream fis = null;
            ZipInputStream zipIs = null;
            ZipEntry zEntry = null;
            String dexFile = "classes.dex";
            String manifestFile = "AndroidManifest.xml";
            boolean hasDex = false;
            boolean hasManifest = false;

            try {
                fis = new FileInputStream(file);
                zipIs = new ZipInputStream(new BufferedInputStream(fis));
                while ((zEntry = zipIs.getNextEntry()) != null) {
                    if (zEntry.getName().equalsIgnoreCase(dexFile)) {
                        hasDex = true;
                    } else if (zEntry.getName().equalsIgnoreCase(manifestFile)) {
                        hasManifest = true;
                    }
                    if (hasDex && hasManifest) {
                        zipIs.close();
                        fis.close();
                        return true;
                    }
                }
                zipIs.close();
                fis.close();
            } catch (FileNotFoundException e) {
                return false;
            } catch (IOException e) {
                return false;
            }
            return false;
        }

【讨论】:

    【解决方案3】:

    可以做这个类:

    new MimeTypeMap()
    

    根据 Android 文档应该给出正确的结果:

    Two-way map that maps MIME-types to file extensions and vice versa.

    【讨论】:

    • 这依赖于原始问题试图避免的文件扩展名 - docs.oracle.com/javase/7/docs/api/javax/activation/…
    • :/ ...你确定...这应该检查 MIME 类型...而不是 ext
    • 是的,如果文档是正确的,它会通过一个文件扩展名映射来进行比较,除了 MimetypesFileTypeMap 在 Android SDK 中不可用。
    • 抱歉 .... 我更正了使用 MimeTypeMap 的答案,这是一个 android.webkit,根据文档应该可以完成这项工作
    • MimeTypeMap 双向映射,将 MIME 类型映射到文件扩展名,反之亦然。
    猜你喜欢
    • 1970-01-01
    • 2014-04-04
    • 2018-10-19
    • 2016-06-28
    • 1970-01-01
    • 2015-09-05
    • 1970-01-01
    • 2011-01-14
    • 1970-01-01
    相关资源
    最近更新 更多