467 votes

Obtenir de manière programmée le numéro de téléphone du téléphone Android

Comment puis-je obtenir de manière programmatique le numéro de téléphone de l'appareil qui exécute mon application Android ?

0 votes

Ce n'est pas possible, sauf si vous y entrez par vous-même. Le numéro de téléphone n'est pas connu par le mobile ou la carte SIM, seulement par le réseau.....

3 votes

@tomsoft Pensez-y... Comment des applications comme Facebook vérifient-elles automatiquement votre numéro de téléphone... ?

0 votes

@EddieHart parce qu'en général, vous leur donnez votre numéro de téléphone et ils vous renvoient un SMS.....

497voto

Alex Volovoy Points 34562

Code :

TelephonyManager tMgr = (TelephonyManager)mAppContext.getSystemService(Context.TELEPHONY_SERVICE);
String mPhoneNumber = tMgr.getLine1Number();

Permission requise :

<uses-permission android:name="android.permission.READ_PHONE_STATE"/> 

Mises en garde :

D'après les commentaires très positifs, il faut faire attention à certains points. Cela peut renvoyer null ou "" ou même "???????" et il peut renvoyer un numéro de téléphone périmé qui n'est plus valide. Si vous voulez quelque chose qui identifie le périphérique de manière unique, vous devez utiliser la fonction getDeviceId() à la place.

152 votes

En fait, pas si parfait. La dernière fois que j'ai essayé cette méthode, elle a indiqué le numéro de téléphone que mon téléphone avait à l'origine, avant que mon ancien numéro de téléphone portable ne soit transféré sur celui-ci. C'est probablement toujours le cas, puisque l'application Paramètres affiche toujours ce numéro défectueux. De plus, certains rapports indiquent que certaines cartes SIM renvoient cette méthode. null . Cela dit, je n'ai pas connaissance d'une meilleure réponse.

5 votes

Mark a raison. Si l'intention est d'utiliser quelque chose qui identifie uniquement le téléphone, j'utiliserais getDeviceId() qui renverra IMEA pour le GSM.

17 votes

(Je pense que vous voulez dire IMEI... ?)

153voto

Johan Points 731

Il n'existe pas de solution garantie à ce problème, car le numéro de téléphone n'est pas physiquement stocké sur toutes les cartes SIM, ni diffusé du réseau vers le téléphone. C'est particulièrement vrai dans certains pays qui exigent une vérification physique de l'adresse, l'attribution du numéro n'intervenant qu'après. L'attribution du numéro de téléphone se fait sur le réseau - et peut être modifiée sans changer la carte SIM ou l'appareil (c'est ainsi que la portabilité est prise en charge).

Je sais que c'est pénible, mais la meilleure solution est probablement de demander à l'utilisateur d'entrer son numéro de téléphone une fois et de le stocker.

18 votes

Afin de vérifier le numéro pris, vous pouvez envoyer un sms (contenant un code) au numéro et contrôler la réponse en mettant un listener sur "Android.provider.Telephony.SMS_RECEIVED". De cette façon, vous pouvez vous assurer que le numéro est correct et fonctionne.

1 votes

Solution créative, mais il faudrait peut-être que l'utilisateur sache que vous le faites, au cas où il serait facturé pour cela.

3 votes

Est-ce qu'il y a tout fournisseur qui fait payer la réception de simples messages texte ? !

43voto

Chor WaiChun Points 1528

Mise à jour : Cette réponse n'est plus disponible car Whatsapp a cessé d'exposer le numéro de téléphone comme nom de compte, veuillez ne pas tenir compte de cette réponse.

Il existe en fait une solution alternative que vous pouvez envisager, si vous ne pouvez pas l'obtenir par le biais du service de téléphonie.

A partir d'aujourd'hui, vous pouvez compter sur une autre grande application Whatsapp, en utilisant AccountManager . Des millions d'appareils ont cette application installée et si vous n'arrivez pas à obtenir le numéro de téléphone via TelephonyManager vous pouvez tenter votre chance.

Permission :

<uses-permission android:name="android.permission.GET_ACCOUNTS" />

Code :

AccountManager am = AccountManager.get(this);
Account[] accounts = am.getAccounts();

for (Account ac : accounts) {
    String acname = ac.name;
    String actype = ac.type;
    // Take your time to look at all available accounts
    System.out.println("Accounts : " + acname + ", " + actype);
}

Vérifiez actype pour un compte WhatsApp

if(actype.equals("com.whatsapp")){
    String phoneNumber = ac.name;
}

Bien sûr, vous risquez de ne pas l'obtenir si l'utilisateur n'a pas installé WhatsApp, mais cela vaut la peine d'essayer quand même. Et n'oubliez pas que vous devez toujours demander la confirmation de l'utilisateur.

1 votes

J'ai vu ça aujourd'hui, alors que je m'amusais avec des comptes. C'est plutôt mauvais que le numéro soit exposé comme ça. Bien sûr, vous avez besoin de l'autorisation GET_ACCOUNTS et à ce stade, l'utilisateur ne se soucie probablement pas des autorisations de l'application.

9 votes

Cette solution est obsolète, Whatsapp n'enregistre plus le numéro de téléphone sur le nom du compte, savez-vous où whatsapp enregistre le numéro de téléphone après la nouvelle mise à jour ?

0 votes

@Cohelad merci de me mettre au courant, je vais vérifier plus tard et barrer cette réponse après confirmation, en attendant je n'ai aucune idée d'où ils enregistrent le numéro.

34voto

Nishanthi Grashia Points 4260

Comme indiqué dans mon réponse précédente

Utilisez le code ci-dessous :

TelephonyManager tMgr = (TelephonyManager)mAppContext.getSystemService(Context.TELEPHONY_SERVICE);
String mPhoneNumber = tMgr.getLine1Number();

Dans AndroidManifest.xml, donnez l'autorisation suivante :

 <uses-permission android:name="android.permission.READ_PHONE_STATE"/> 

Mais n'oubliez pas que ce code ne fonctionne pas toujours, car le numéro de téléphone cellulaire dépend de la carte SIM et de l'opérateur de réseau/opérateur de téléphonie cellulaire.

Aussi, essayez de vérifier Téléphone--> Paramètres --> A propos de --> Identité du téléphone Si vous êtes en mesure d'afficher le numéro à cet endroit, la probabilité d'obtenir le numéro de téléphone de l'indicatif ci-dessus est plus élevée. Si vous n'êtes pas en mesure de voir le numéro de téléphone dans les paramètres, alors vous ne serez pas en mesure d'obtenir via ce code !

Solution suggérée :

  1. Obtenir le numéro de téléphone de l'utilisateur comme entrée manuelle de l'utilisateur.
  2. Envoyez un code au numéro de téléphone mobile de l'utilisateur par SMS.
  3. Demandez à l'utilisateur de saisir le code pour confirmer le numéro de téléphone.
  4. Sauvegarder le numéro dans la préférence partagée.

Effectuez les 4 étapes ci-dessus en une seule fois lors du premier lancement de l'application. Par la suite, chaque fois que le numéro de téléphone est requis, utilisez la valeur disponible dans les préférences partagées.

0 votes

Cette réponse couvre tous les facteurs, elle devrait être la réponse acceptée = )

0 votes

Comment puis-je obtenir les deux numéros de téléphone mobile s'il y a un double sim disponible sur le téléphone. avec le code ci-dessus. Pour une sim simple, cela fonctionne bien.

13voto

Emil Hajric Points 417
private String getMyPhoneNumber(){
    TelephonyManager mTelephonyMgr;
    mTelephonyMgr = (TelephonyManager)
        getSystemService(Context.TELEPHONY_SERVICE); 
    return mTelephonyMgr.getLine1Number();
}

private String getMy10DigitPhoneNumber(){
    String s = getMyPhoneNumber();
    return s != null && s.length() > 2 ? s.substring(2) : null;
}

Code tiré de http://www.androidsnippets.com/get-my-phone-number

0 votes

@JaredBurrows à cause de "s.substring(2)".

1 votes

Ça ne marche pas pour moi. J'obtiens une valeur NULL (carte SIM sunrise, Suisse).

1 votes

Votre lien est cassé.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X