8

刚刚完成了一个具有一些基本地图功能的应用程序。正在跨多个 sdk 进行测试,以确保正确执行和支持。

发现它不会在我在 Android 4.0.3 ICS 上运行的平板电脑上执行。(注意:标准地图和导航应用程序工作正常)。

对模拟器执行相同操作不会引发任何异常并且运行良好。尝试谷歌,发现异常:java.lang.NoClassDefFoundError: android.security.MessageDigest是由于某些固件兼容性/与Google MAPS API/SDK不匹配引起的。

某些其他人建议使用 java.security.MessageDigest,但在这种情况下,我/我们将无法自行编辑 com.google.maps.jar。您能否建议一种解决方法或一些技巧以确保它适用于 Android 4.0.3 ICS 设备

4

2 回答 2

0

找到了解决方法。一件事是确定运行 Android 4.0.3 ICS 的设备与 Google Maps API 存在问题。所以试图谷歌搜索任何特定于 Android 4.0.3 ICS 的库。找到这个 gapps-ics-20120429-signed.zip [mediafire.com/?owj7hj310var5rq]。通过设备下载并连接到我的电脑。用于安装库 1. adb remount 2. adb push system/etc/permissions/com.google.android.maps.xml /system/etc/permissions 3. adb push system/framework/com.google.android.maps .jar /system/framework 4. adb reboot ,一切正常。希望这可以帮助

于 2013-03-06T10:19:31.030 回答
0

我已经支持这个很久了。并设法解决了这个问题。我想在这里解释问题和最简单的解决方法。

错误在这里...

该错误是设备制造商或 ROM 创建者使用旧版地图库和新版 Android 造成的。通常,这与晦涩的平板电脑隔离,但理论上它可能会出现在其他情况下。(在这里解释

android.security.MessageDigest在 Honeycomb 及以后被删除。这是导致问题的原因。

从您的代码中轻松修复:

只需在包 android\security 下的 src 目录中创建 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-04-08T14:45:24.917 回答