10

Android アプリケーションを開発しており、LVL ライブラリを使用して Google Play ライセンスを確認します。

LVL のドキュメントを読んだ後、Google Play の応答を難読化するには android.Settings.Secure.ANDROID_ID を取得する必要があることを読みました。

しかし、TelephonyManager から取得した ANDROID_ID は、異なるデバイスで同じ場合があることも読みました。

まず、Android 2.2 より前のリリース (「Froyo」) では 100% 信頼できるわけではありません。また、大手メーカーの人気のある携帯電話に少なくとも 1 つの広く観察されたバグがあり、すべてのインスタンスが同じ ANDROID_ID を持っています。

本当?

ありがとう

4

3 に答える 3

14

私の場合を考えてみましょう:

複数の Android デバイスで同じシリアル番号。Adbは役に立たない。シリアル番号を変更するにはどうすればよいですか?

だから私はADBの問題を解決しませんでしたが、Androidデバイスを識別するためにこのコードを使用します(使用getDeviceId(context)):

public static String getDeviceId(Context context) {
    String id = getUniqueID(context);
    if (id == null)
        id = Settings.Secure.getString(context.getContentResolver(), Settings.Secure.ANDROID_ID);
    return id;
}

private static String getUniqueID(Context context) {

    String telephonyDeviceId = "NoTelephonyId";
    String androidDeviceId = "NoAndroidId";

    // get telephony id
    try {
        final TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
        telephonyDeviceId = tm.getDeviceId();
        if (telephonyDeviceId == null) {
            telephonyDeviceId = "NoTelephonyId";
        }
    } catch (Exception e) {
    }

    // get internal android device id
    try {
        androidDeviceId = android.provider.Settings.Secure.getString(context.getContentResolver(),
                android.provider.Settings.Secure.ANDROID_ID);
        if (androidDeviceId == null) {
            androidDeviceId = "NoAndroidId";
        }
    } catch (Exception e) {

    }

    // build up the uuid
    try {
        String id = getStringIntegerHexBlocks(androidDeviceId.hashCode())
                + "-"
                + getStringIntegerHexBlocks(telephonyDeviceId.hashCode());

        return id;
    } catch (Exception e) {
        return "0000-0000-1111-1111";
    }
}

public static String getStringIntegerHexBlocks(int value) {
    String result = "";
    String string = Integer.toHexString(value);

    int remain = 8 - string.length();
    char[] chars = new char[remain];
    Arrays.fill(chars, '0');
    string = new String(chars) + string;

    int count = 0;
    for (int i = string.length() - 1; i >= 0; i--) {
        count++;
        result = string.substring(i, i + 1) + result;
        if (count == 4) {
            result = "-" + result;
            count = 0;
        }
    }

    if (result.startsWith("-")) {
        result = result.substring(1, result.length());
    }

    return result;
}

Web サービスを呼び出すときに特定のアプリのインストールを識別するために使用します。ご覧のとおり、TelephonyManager と ANDROID_ID にも基づいて、さまざまなアプローチを試しています。

私が得るのはxxxx-xxxx-xxxx-xxxx のような文字列で、x は 16 進文字です。

低価格の中国製タブレットをたくさん購入しましたが、これらはすべて同じ DEVICE_ID同じシリアル番号を持っています!! だから私の解決策。今のところうまくいっています。

于 2013-06-11T14:32:35.327 に答える
3

引用された文章が Google 自体からのものであることを考えると、そうです。

于 2013-06-11T14:22:40.957 に答える