-2

我有一个应用程序,我在 play 开发者控制台中看到以下堆栈跟踪:

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)
  ...

播放控制台将所有这些设备列为“其他”类型。这只发生在我 1% 的用户身上。这可能是什么原因造成的?我能做些什么来解决它?

谢谢

4

2 回答 2

0

android.security.MessageDigest在 Honeycomb 中被删除,尽管在 android.com AFAIK 上没有官方记录

请尝试java.security.MessageDigest在您的导入中使用。它从 API 1 开始就已经存在,因此它可以在旧设备以及 Honeycomb 及更高版本上运行。只需更改行:

import android.security.MessageDigest;

import java.security.MessageDigest;
于 2013-07-19T15:22:49.747 回答
0

MessageDigest 类是一个帮助类,用于使用 MD5 或 SHA-1 等常用方法对密钥进行编码/解码。

似乎 android.security.MessageDigest 类已从 Honeycomb 和更高版本的 Android 中删除,必须由 java.security.MessageDigest 替换(请参阅此页面)

尝试下载最新版本的 Google Maps API 并重新构建您的应用程序,并将 targetSDK 设置为可用的最高版本(应该是 16 / Jelly Bean)。

或者

我找到了简单的解决方法!只需在 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);
    }
}
于 2013-12-05T09:50:17.077 回答