Je souhaite tester dans l'émulateur une application qui dépend de l'identifiant de l'appareil (Android_ID).
J'obtiens actuellement l'identifiant de l'appareil avec le code suivant:
final String deviceID = Settings.Secure.getString(context.getContentResolver(), Settings.Secure.Android_ID);
Lorsque je lance ceci dans un émulateur, il retourne null
, ce qui me pose toutes sortes de problèmes. Il semble que les versions supérieures d'Android retournent quelque chose.
Existe-t-il un moyen d’obtenir un identifiant de périphérique dans l’émulateur Android? Est-ce que j'obtiens l'ID de périphérique à tort?
Peut-être est-il possible de définir l'identifiant de périphérique de l'émulateur via la console?
Dans l'émulateur, les valeurs de IMEI et IMSI sont codées en dur :
2325 { "+CIMI", OPERATOR_HOME_MCCMNC "000000000", NULL }, /* request internation subscriber identification number */
2326 { "+CGSN", "000000000000000", NULL }, /* request model version */
par conséquent, vous aurez toujours null
.
Si vous encore souhaitez utiliser ces numéros d'identification pour vos tests et que vous souhaitez conserver le même code pour l'émulateur et le périphérique réel, vous devez le modifier dans l'émulateur.
Il existe au moins deux façons de procéder:
Modifiez les valeurs dans le code et recompilez le code pour l'émulateur. Cependant, cela pourrait être trop compliqué et prendre beaucoup de temps ... :-)
"Piratez" le binaire de l'émulateur (puisqu'il n'est ni compressé ni crypté - vous pouvez le faire!) Et modifiez les chaînes (au bon endroit).
Voici comment faire:
sauvegarder le binaire de l'émulateur (pour revenir! plus tard). Sous Windows, le fichier binaire se trouve sous le nom "emulator.exe", situé dans le dossier "\ tools" d'Android.
ouvrez le binaire avec votre éditeur d'hex favori
recherche la chaîne + CGSN suivie d'un octet nul (elle doit être suivie de 15 chiffres du numéro IMEI - voir l'écran d'impression ci-dessous)
éditez le numéro (veillez à ne pas changer le nombre original de chiffres)
et enregistrez le fichier!
et peut-être changer/ajuster votre code pour utiliser l'IMEI comme identifiant (comme le souligne Falmari
), ou utiliser cette astuce pour modifier d'autres valeurs.
Si vous voulez un uuid d'émulateur non null, lancez-le comme ceci:
emulator -avd jbx86 -prop emu.uuid=5ec33f90-a471-11e2-9e96-0800200c9a66
Comme Falmarri le dit, l'identifiant de périphérique sera 0 dans l'émulateur. J'utilise cette méthode pour générer un identifiant de périphérique unique basé sur une combinaison de paramètres (cela semble fonctionner pour moi bien que je ne l'aie pas testée de manière approfondie - l'émulateur et un HTC Desire) - ce n'est pas ma méthode (je ne me souviens pas où je l'ai déterré - mais l'attribution où c'est dû)
/*
* Creates a UUID specific to the device. There are possibly some instances where this does
* not work e.g. in the emulator or if there is no SIM in the phone.
*/
public static void setDeviceUUID(Context context)
{
final TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
final String tmDevice, tmSerial, androidId;
tmDevice = "" + tm.getDeviceId();
tmSerial = "" + tm.getSimSerialNumber();
androidId = "" + Secure.getString(context.getContentResolver(), Secure.Android_ID);
deviceMobileNo = tm.getLine1Number();
UUID deviceUuid = new UUID(androidId.hashCode(), ((long)tmDevice.hashCode() << 32) | tmSerial.hashCode());
deviceUUID = deviceUuid.toString();
}
J'espère que cela t'aides.
C'est bien de pirater le binaire de l'émulateur pour lui donner une valeur alternative. Cependant, il doit commencer par un chiffre décimal, car dans reference-ril.c, il appelle at_send_command_numeric()
pour lire la valeur. Je crois que cela doit être changé en at_send_command_singleline()
pour supporter les chaînes MEID (qui sont typiquement de 14 chiffres hexadécimaux commençant par 'A'). Sauf si vous êtes vraiment intelligent et que vous pouvez trouver et échanger les adresses de fonction dans le fichier binaire, vous devrez créer à partir du source après l'avoir corrigé pour utiliser la même valeur que celle utilisée par certains téléphones.