Dernière mise à jour : 6/2/15
Après avoir lu tous les articles de Stack Overflow sur la création d'un identifiant unique, le blog des développeurs de Google et la documentation Android, j'ai l'impression que le "Pseudo ID" est la meilleure option possible.
Question principale : Matériel et logiciel
Matériel informatique
- Les utilisateurs peuvent changer de matériel, de tablette Android ou de téléphone. Les identifiants uniques basés sur le matériel ne sont donc pas une bonne idée pour SUIVRE LES UTILISATEURS
- Pour MATÉRIEL DE SUIVI C'est une bonne idée.
Logiciel
- Les utilisateurs peuvent effacer/changer leur ROM s'ils sont enracinés.
- Vous pouvez suivre les utilisateurs sur toutes les plateformes (iOS, Android, Windows et Web).
- Les meilleurs veulent SUIVRE UN UTILISATEUR INDIVIDUEL avec leur consentement est de leur demander simplement de se connecter (en utilisant OAuth).
Ventilation générale avec Android
- Garantie d'unicité (y compris les appareils rootés) pour API >= 9/10 (99,5 % des appareils Android). ###- Pas de permissions supplémentaires
Un pseudo-code :
if API >= 9/10: (99.5% of devices)
return unique ID containing serial id (rooted devices may be different)
else
return the unique ID of build information (may overlap data - API < 9)
Merci à @stansult pour la publication toutes nos options (dans cette question de Stack Overflow).
Liste des options - raisons de les utiliser ou de ne pas les utiliser :
-
Courriel de l'utilisateur - Logiciel
-
L'utilisateur pourrait changer d'email - HAUTEMENT improbable
-
API 5+ <uses-permission android:name="android.permission.GET_ACCOUNTS" />
ou
-
API 14+ <uses-permission android:name="android.permission.READ_PROFILE" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
( Comment obtenir l'adresse e-mail principale de l'appareil Android ? )
-
Numéro de téléphone de l'utilisateur - Logiciel
-
Les utilisateurs pourraient changer de numéro de téléphone - HAUTEMENT improbable
-
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
-
IMEI - Matériel (uniquement les téléphones, les besoins android.permission.READ_PHONE_STATE
)
-
La plupart des utilisateurs détestent le fait que l'autorisation indique "Appels téléphoniques". Certains utilisateurs donnent de mauvaises notes parce qu'ils pensent que vous ne faites que voler leurs informations personnelles alors que tout ce que vous voulez faire, c'est suivre l'installation des appareils. Il est évident que vous collectez des données.
-
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
-
Android ID - Matériel (peut être nul, peut changer après une réinitialisation d'usine, peut être modifié sur un appareil enraciné)
-
Comme il peut être "null", nous pouvons vérifier s'il est "null" et changer sa valeur, mais cela signifie qu'il ne sera plus unique.
-
Si vous avez un utilisateur dont l'appareil a été réinitialisé en usine, la valeur peut avoir été modifiée ou altérée sur l'appareil enraciné, de sorte qu'il peut y avoir des entrées en double si vous suivez les installations des utilisateurs.
-
Adresse MAC WLAN - Matériel (besoins android.permission.ACCESS_WIFI_STATE
)
-
C'est peut-être la deuxième meilleure option, mais vous continuez à collecter et à stocker un identifiant unique qui provient directement d'un utilisateur. Il est évident que vous collectez des données.
-
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE "/>
-
Adresse MAC Bluetooth - Matériel (appareils avec Bluetooth, besoins android.permission.BLUETOOTH
)
-
La plupart des applications sur le marché n'utilisent pas Bluetooth, et donc si votre application n'utilise pas Bluetooth et que vous incluez ceci, l'utilisateur pourrait se méfier.
-
<uses-permission android:name="android.permission.BLUETOOTH "/>
-
Pseudo-Unique ID - Logiciel (pour tous les appareils Android)
-
Très possible, peut contenir des collisions - Voir ma méthode postée ci-dessous !
-
Cela vous permet d'avoir un identifiant "presque unique" de l'utilisateur sans prendre quoi que ce soit de privé. Vous pouvez créer votre propre identifiant anonyme à partir des informations du dispositif.
Je sais qu'il n'existe pas de moyen "parfait" d'obtenir un identifiant unique sans utiliser de permissions ; cependant, il arrive que nous ayons seulement besoin de suivre l'installation du dispositif. Lorsqu'il s'agit de créer un identifiant unique, nous pouvons créer un "pseudo-identifiant unique" basé uniquement sur les informations que l'API Android nous fournit sans utiliser de permissions supplémentaires. De cette façon, nous pouvons montrer du respect à l'utilisateur et essayer de lui offrir une bonne expérience.
Avec un pseudo-identifiant unique, vous ne risquez vraiment que d'être confronté à des doublons en raison de la présence d'appareils similaires. Vous pouvez modifier la méthode combinée pour la rendre plus unique ; cependant, certains développeurs ont besoin de suivre les installations de dispositifs et cela fera l'affaire ou les performances basées sur des dispositifs similaires.
API >= 9 :
Si leur appareil Android est doté de l'API 9 ou d'une version plus récente, il est garanti qu'il sera unique grâce au champ "Build.SERIAL".
SOUVENIR vous ne manquez techniquement qu'environ 0,5% des utilisateurs. qui ont un API < 9 . Vous pouvez donc vous concentrer sur le reste : C'est 99,5% des utilisateurs !
API < 9 :
Si l'appareil Android de l'utilisateur est inférieur à l'API 9, on peut espérer qu'il n'a pas effectué de réinitialisation d'usine et que son 'Secure.ANDROID_ID' sera préservé ou ne sera pas 'null' (cf. http://developer.Android.com/about/dashboards/index.html )
Si tout le reste échoue :
En cas d'échec, si l'utilisateur dispose d'une version inférieure à l'API 9 (inférieure à Gingerbread), s'il a réinitialisé son appareil ou si Secure.ANDROID_ID renvoie "null", l'identifiant renvoyé sera uniquement basé sur les informations relatives à son appareil Android. C'est là que les collisions peuvent se produire.
Changements :
- Suppression de 'Android.SECURE_ID' parce que les réinitialisations d'usine pouvaient entraîner un changement de valeur.
- J'ai modifié le code pour changer l'API
- Modifié le Pseudo
Veuillez consulter la méthode ci-dessous :
/**
* Return pseudo unique ID
* @return ID
*/
public static String getUniquePsuedoID() {
// If all else fails, if the user does have lower than API 9 (lower
// than Gingerbread), has reset their device or 'Secure.ANDROID_ID'
// returns 'null', then simply the ID returned will be solely based
// off their Android device information. This is where the collisions
// can happen.
// Thanks http://www.pocketmagic.net/?p=1662!
// Try not to use DISPLAY, HOST or ID - these items could change.
// If there are collisions, there will be overlapping data
String m_szDevIDShort = "35" + (Build.BOARD.length() % 10) + (Build.BRAND.length() % 10) + (Build.CPU_ABI.length() % 10) + (Build.DEVICE.length() % 10) + (Build.MANUFACTURER.length() % 10) + (Build.MODEL.length() % 10) + (Build.PRODUCT.length() % 10);
// Thanks to @Roman SL!
// https://stackoverflow.com/a/4789483/950427
// Only devices with API >= 9 have android.os.Build.SERIAL
// http://developer.android.com/reference/android/os/Build.html#SERIAL
// If a user upgrades software or roots their device, there will be a duplicate entry
String serial = null;
try {
serial = android.os.Build.class.getField("SERIAL").get(null).toString();
// Go ahead and return the serial for api => 9
return new UUID(m_szDevIDShort.hashCode(), serial.hashCode()).toString();
} catch (Exception exception) {
// String needs to be initialized
serial = "serial"; // some value
}
// Thanks @Joe!
// https://stackoverflow.com/a/2853253/950427
// Finally, combine the values we have found by using the UUID class to create a unique identifier
return new UUID(m_szDevIDShort.hashCode(), serial.hashCode()).toString();
}
Nouveau (pour les applications avec publicités ET services Google Play) :
Depuis la console des développeurs de Google Play :
À compter du 1er août 2014, les règles du programme de développement Google Play exigent que toutes les nouvelles applications téléchargées et mises à jour utilisent l'identifiant publicitaire à la place de tout autre identifiant persistant à des fins publicitaires. à la place de tout autre identifiant persistant à des fins publicitaires. En savoir plus
Mise en œuvre :
Permission :
<uses-permission android:name="android.permission.INTERNET" />
Code :
import com.google.android.gms.ads.identifier.AdvertisingIdClient;
import com.google.android.gms.ads.identifier.AdvertisingIdClient.Info;
import com.google.android.gms.common.GooglePlayServicesAvailabilityException;
import com.google.android.gms.common.GooglePlayServicesNotAvailableException;
import java.io.IOException;
...
// Do not call this function from the main thread. Otherwise,
// an IllegalStateException will be thrown.
public void getIdThread() {
Info adInfo = null;
try {
adInfo = AdvertisingIdClient.getAdvertisingIdInfo(mContext);
} catch (IOException exception) {
// Unrecoverable error connecting to Google Play services (e.g.,
// the old version of the service doesn't support getting AdvertisingId).
} catch (GooglePlayServicesAvailabilityException exception) {
// Encountered a recoverable error connecting to Google Play services.
} catch (GooglePlayServicesNotAvailableException exception) {
// Google Play services is not available entirely.
}
final String id = adInfo.getId();
final boolean isLAT = adInfo.isLimitAdTrackingEnabled();
}
Source/Docs :
http://developer.Android.com/google/play-services/id.html http://developer.Android.com/reference/com/google/Android/gms/ads/identifier/AdvertisingIdClient.html
Important :
Il est prévu que l'identifiant publicitaire remplace complètement l'utilisation actuelle l'utilisation d'autres identifiants à des fins publicitaires (comme l'utilisation de ANDROID_ID dans Settings.Secure) lorsque les services Google Play seront disponibles. Les cas Les cas où Google Play Services n'est pas disponible sont signalés par une icône GooglePlayServicesNotAvailableException qui est lancée par getAdvertisingIdInfo().
Avertissement, les utilisateurs peuvent réinitialiser :
http://en.kioskea.net/faq/34732-Android-reset-your-advertising-id
J'ai essayé de référencer chaque lien dont j'ai tiré des informations. Si vous êtes absent et que vous devez être inclus, veuillez commenter !
ID de l'instance des services aux joueurs de Google
https://developers.google.com/instance-id/
42 votes
Si vous utilisez
ANDROID_ID
assurez-vous de lire cette réponse et ce bug .0 votes
Votre solution est ici : stackoverflow.com/a/63481350/7135685