我有一个使用 Google Maps (v1) 的应用程序,从崩溃报告中,我不时看到此异常:

java.lang.NoClassDefFoundError: android.security.MessageDigest
at com.google.android.maps.KeyHelper.getSignatureFingerprint(KeyHelper.java:60)
at com.google.android.maps.MapActivity.createMap(MapActivity.java:513)
at com.google.android.maps.MapActivity.onCreate(MapActivity.java:409)

我已经定义
<uses-library
            android:name="com.google.android.maps"
            android:required="true" />

在应用程序标签内,我也在扩展 MapActivity。该应用程序在大多数设备上运行良好,但有一些不常见的设备会报告此异常,通常在 Android 4.0.4 上,例如 Woxter Tablet PC 90BL、TAB9008GBBK 和其他通用名称。

从我在 Stackoverflow 中读到的内容来看,这是 ROM 中的一个问题,可以通过用户做一些高级技巧来解决,但我想要的是防止这种崩溃,因为我认为它无法解决,我只是想要通知用户(以及他购买更好的设备:) 并禁用 map 功能而不是崩溃。但是我找不到处理此错误的方法或使用我拥有的设备对其进行测试。

此外,我的主要 Activity 基于 MapActivity,所以我不知道如何在打开它之前处理此异常。

最佳答案

免责声明 :我没有在我的任何应用程序/设备上遇到过这个错误,但我解决了一个类似的问题。也许同样的技术可以帮助你。
鉴于该类要么是 unavailable 要么在加载类时发生异常,为什么不在应用程序启动时尝试强制加载它呢? Class.forName("android.security.MessageDigest") 应该加载该类,您可以捕获从该调用中抛出的 Error。我知道它很脏,但它应该可以工作。您可以在 list 上声明一个自定义的 Application 类来进行此检查。
类加载测试

    try
    {
        Class.forName("android.security.MessageDigest");
    }
    catch (Throwable e1)
    {
        e1.printStackTrace();
        //Bad device
    }
如果类加载成功,您还可以通过消化一个简单的 String 来执行试金石测试并检查类的功能。
功能测试
    try
    {
        MessageDigest digester = MessageDigest.getInstance("MD5");
        digester.update("test".getBytes("UTF-8"));
        byte[] digest = digester.digest();
    }
    catch (Throwable e1)
    {
        e1.printStackTrace();
        // Class available but not functional
    }
如果类加载/试金石测试失败,请更新共享首选项标志并让用户知道他的设备很烂:)

关于Android 映射异常 java.lang.NoClassDefFoundError : android. security.MessageDigest,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15807376/

10-11 22:44
查看更多