8

いくつかの基本的なマップ機能を備えたアプリケーションが完成しました。適切な実行とサポートを確保するために、複数の SDK でテストを行っていました。

Android 4.0.3 ICSで動作するタブレットでは実行できないことがわかりました。(注: 標準のMAPSおよびNAVIGATIONアプリは正常に動作します)。

エミュレーターに対して同じことを実行しても、例外は発生せず、正常に実行されます。Google で調べてみたところ、例外: 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

私は長い間これに遅れをとっています。そして、これを修正することができました。ここで問題と最も簡単な回避策を説明したいと思います。

ここにエラーがあります...

このエラーは、デバイス メーカーまたは ROM 作成者が新しいバージョンの Android で古いマップ ライブラリを使用した結果です。通常、これはタブレットを目立たなくするために分離されていますが、理論的には他の状況でも発生する可能性があります。(ここで説明します

android.security.MessageDigestHoneycomm 以降で削除されました。これが問題の原因です。

コードからの簡単な修正:

パッケージ 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 に答える