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