10
votes

android.settings.secure.android_id

Je développe une application Android et je vais utiliser la bibliothèque LVL pour vérifier la licence Google Play.

Après avoir lu la documentation LVL, j'ai lu que je dois obtenir l'Android.Settings.secure.android_id pour obfusez les réponses Google Play.

Mais j'ai aussi lu que l'android_id obtenu de la téléphonieManager est parfois identique pour différents appareils.

Premièrement, il n'est pas 100% fiable sur les versions d'Android avant 2.2 ("Froyo"). En outre, il y a eu au moins un bogue largement observé dans un combiné populaire d'un important fabricant, où chaque instance a le même android_id

est-ce vrai?

merci


0 commentaires

3 Réponses :



14
votes

considère mon cas:

même numéro de série sur plusieurs périphériques Android. Adb est inutile. Comment puis-je modifier le numéro de série? p>

donc je n'ai donc pas résolu le problème avec l'adb, mais pour identifier un appareil Android J'utilise ce code (Utilisez getDeviceID (contexte) ): P>

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;
}


2 commentaires

Vous dites que vous suivez des installations d'applications uniques. Ne serait-il pas plus facile d'enregistrer une chaîne de génératrice à des préférences partagées, si l'on ne l'est pas déjà enregistré et l'utiliser? Je veux dire comme utiliser un booléen idmentéisé, lorsque la première génération de la première fois, mettez-la en vrais, et s'il est vrai, obtenez l'ID de SharedPreferences, de cette façon, vous auriez une carte d'installation unique pour chaque installation.


@LXKNVLK J'ai besoin du même identifiant si je désinstalle l'application et la réinstallez-la.



0
votes
//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 is unique for each device.

0 commentaires