我有一个使用 Google map (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/