10

我正在开发一个 android 应用程序,我将使用 LVL 库来检查 google play 许可证。

阅读 LVL 文档后,我读到我必须获取 android.Settings.Secure.ANDROID_ID 才能混淆 google play 响应。

但我也读到从 TelephonyManager 获得的 ANDROID_ID 对于不同的设备有时是相同的。

首先,它在 2.2 之前的 Android 版本(“Froyo”)上不是 100% 可靠的。此外,在主要制造商的流行手机中至少存在一个广泛观察到的错误,其中每个实例都具有相同的 ANDROID_ID

真的吗?

谢谢

4

3 回答 3

14

考虑我的情况:

多个 android 设备上的相同序列号。亚行没用。如何更改序列号?

所以我没有解决 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 是一个十六进制字符。

我买了很多低成本的中国平板电脑,所有这些都有相同的 DEVICE_ID相同的序列号!所以我的解决方案。目前运行良好。

于 2013-06-11T14:32:35.327 回答
3

考虑到您引用的段落来自谷歌本身,是的,这是真的。

于 2013-06-11T14:22:40.957 回答
0
//Fields
String myID;
int myversion = 0;


myversion = Integer.valueOf(android.os.Build.VERSION.SDK);
if (myversion < 23) {
        TelephonyManager mngr = (TelephonyManager) 
getSystemService(Context.TELEPHONY_SERVICE);
        myID= mngr.getDeviceId();
    }
    else
    {
        myID = 
Settings.Secure.getString(getApplicationContext().getContentResolver(), 
Settings.Secure.ANDROID_ID);
    }

Secure.ANDROID_ID 对于每个设备都是唯一的。

于 2018-09-05T12:48:55.133 回答