什么是';android.security.MessageDigest'';?
数千名客户中有一位报告我的一个应用程序出现错误。错误是:什么是';android.security.MessageDigest'';?,android,Android,数千名客户中有一位报告我的一个应用程序出现错误。错误是: java.lang.NoClassDefFoundError - android.security.MessageDigest 我在应用程序中不使用该类/方法。谷歌地图键必须是正常的,因为有成千上万的人在用相同的版本运行相同的应用程序。这是stacktrace: java.lang.NoClassDefFoundError: android.security.MessageDigest at com.google.android.map
java.lang.NoClassDefFoundError - android.security.MessageDigest
我在应用程序中不使用该类/方法。谷歌地图键必须是正常的,因为有成千上万的人在用相同的版本运行相同的应用程序。这是stacktrace:
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:552)
at com.google.android.maps.MapActivity.onCreate(MapActivity.java:422)
at xx.yyy.zzzz.MyMapActivity.onCreate(MyMapActivity.java:41)
at xx.yyy.zzzz.TheMap.onCreate(TheMap.java:89)
at android.app.Activity.performCreate(Activity.java:4465)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981)
at android.app.ActivityThread.access$600(ActivityThread.java:123)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4424)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
at dalvik.system.NativeStart.main(Native Method)
这是什么
提前感谢。MessageDigest类是一个帮助类,用于使用MD5或SHA-1等常用方法对密钥进行编码/解码 看起来android.security.MessageDigest类已从Honeycom和更高版本的android中删除,必须由java.security.MessageDigest()替换
尝试下载最新版本的Google Maps API,并将targetSDK设置为可用的最高版本(从今天起应为16/Jelly Bean)重新构建应用程序 我花了一些时间研究这个问题,我正在记录我在这里的发现,希望它能为其他人省去一些麻烦 该错误是由于设备制造商或ROM创建者使用旧的地图库和新版本的Android造成的。通常情况下,这是孤立的模糊平板电脑,但理论上它可以出现在其他情况下。可以使用以下步骤在模拟器中重新创建此问题:
adb pull/system/framework/com.google.android.maps.jar
完成此操作后,可以关闭模拟器adb-Remount
adb push/com.google.android.maps.jar/system/framework
system\u process
,您可以在那里杀死它。或者,您可以运行以下命令:adb shell ps | grep system | u server | awk'{print$2}'| xargs adb shell kill
可以通过反射获取映射库中的
KeyHelper.getSignatureFingerprint()
方法并调用它来检测此问题-将PackageManager
和包名作为参数传递。或者,您可以在onCreate()
中捕获错误,并加载新活动。我找到了简单的解决方法!只需在src目录包android\security中创建,并将MessageDigest.java放入其中
package android.security;
import java.security.NoSuchAlgorithmException;
public class MessageDigest
{
private java.security.MessageDigest instance;
public MessageDigest() {}
private MessageDigest(java.security.MessageDigest instance)
{
this.instance = instance;
}
public static MessageDigest getInstance(String algorithm) throws NoSuchAlgorithmException
{
if (algorithm == null) return null;
try
{
if (algorithm.equals("SHA-1"))
return (MessageDigest) Class.forName("android.security.Sha1MessageDigest").newInstance();
else if (algorithm.equals("MD5"))
return (MessageDigest) Class.forName("android.security.Md5MessageDigest").newInstance();
}
catch (Exception e) {}
return new MessageDigest(java.security.MessageDigest.getInstance(algorithm));
}
public void update(byte[] input)
{
instance.update(input);
}
public byte[] digest()
{
return instance.digest();
}
public byte[] digest(byte[] input)
{
return instance.digest(input);
}
}
这是可行的,但可能会累积其他异常,因为地图库不匹配android版本 谢谢。在4.x设备上,同样的应用程序工作得非常完美,在2.x设备上也是如此。谷歌是否删除了3.x中的API调用,并将其重新添加到4.x中?哇!那会很奇怪。我最好的猜测是直接联系谷歌,获得官方信息。我确实拥有一台2.3.7和一台4.0.3的设备,这两款设备都可以使用。我可以肯定这一点。错误来自开发人员控制台中的未知客户跟踪。我通常都会检查它们——即使是源代码之外的代码。我将您的答案标记为ok,因为您将我指向了正确的位置。如果针对API 16,问题是否已解决?我只是从一些使用“奇怪设备”(至少不是普通设备)的用户那里得到了这个错误。ATROPLUS、Scroll engage、Fly touch……我将目标api设置为17,但在一些设备上仍然收到这个异常!我同意这个解释。我只有“不太标准”的问题设备。这个解决方法实际上是有效的,而且是最非侵入性的。我还没有看到它的任何副作用。如果我遇到任何问题,我会告诉你。谢谢你的建议!!!!!