web-dev-qa-db-fra.com

Obtenir par programme le numéro de téléphone du téléphone Android

Comment obtenir par programme le numéro de téléphone du périphérique qui exécute mon application Android?

420
jkap

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:

Selon les commentaires très élevés, il y a quelques mises en garde à prendre en compte. Cela peut renvoyer null ou "" ou même "???????", et peut renvoyer un numéro de téléphone périmé qui n'est plus valide. Si vous voulez quelque chose qui identifie de manière unique le périphérique, vous devriez utiliser plutôt getDeviceId().

471
Alex Volovoy

Il n’ya pas de solution garantie à ce problème car le numéro de téléphone n’est pas stocké physiquement sur toutes les cartes SIM, ni diffusé du réseau vers le téléphone. Cela est particulièrement vrai dans certains pays qui exigent une vérification de l'adresse physique, l'attribution des numéros ne se faisant que plus tard. L'attribution de numéros de téléphone a lieu sur le réseau - et peut être modifiée sans changer de carte SIM ou d'appareil (par exemple, la manière dont le portage est pris en charge).

Je sais que cela fait mal, mais la meilleure solution est probablement de demander à l'utilisateur d'entrer son numéro de téléphone une fois et de le mémoriser.

146
Johan

Mise à jour: Cette réponse n'est plus disponible car Whatsapp avait cessé d'exposer le numéro de téléphone en tant que nom de compte, veuillez ignorer cette réponse.

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

À compter d’aujourd’hui, vous pouvez vous fier à une autre grande application Whatsapp, qui utilise AccountManager. Des millions de périphériques ont cette application installée et si vous ne pouvez pas obtenir le numéro de téléphone via TelephonyManager, vous pouvez l’essayer.

Autorisation:

<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 le compte WhatsApp

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

Bien sûr, vous ne pouvez pas l’obtenir si l’utilisateur n’a pas installé WhatsApp, mais cela vaut la peine de l’essayer. Et rappelez-vous que vous devriez toujours demander à l'utilisateur une confirmation.

39
Chor Wai Chun

Tel que posté 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, accordez l’autorisation suivante:

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

Mais rappelez-vous, ce code ne fonctionne pas toujours, car le numéro de téléphone portable dépend de la carte SIM et de l'opérateur réseau/de l'opérateur de téléphone portable.

Essayez également d’enregistrer Téléphone -> Paramètres -> À 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 à partir du code ci-dessus est plus grande. Si vous ne pouvez pas afficher le numéro de téléphone dans les paramètres, vous ne pourrez pas vous connecter via ce code!

Solution de contournement suggérée:

  1. Obtenez le numéro de téléphone de l'utilisateur en tant que saisie 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 d'entrer le code pour confirmer le numéro de téléphone.
  4. Enregistrez le numéro dans la préférence partagée.

Faites les 4 étapes ci-dessus comme une activité ponctuelle lors du premier lancement de l'application. Par la suite, chaque fois que vous aurez besoin d’un numéro de téléphone, utilisez la valeur disponible par préférence partagée.

30
Nishanthi Grashia
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 extrait de http://www.androidsnippets.com/get-my-phone-number

13
Emil Hajric

C’est ainsi que vous demandez un numéro de téléphone par l’intermédiaire de l’API Play Services, sans autorisation ni piratage. Source et Exemple complet .

Dans votre build.gradle (version 10.2.x et ultérieure requise):

compile "com.google.Android.gms:play-services-auth:$gms_version"

Dans votre activité (le code est simplifié):

@Override
protected void onCreate(Bundle savedInstanceState) {
    // ...
    googleApiClient = new GoogleApiClient.Builder(this)
            .addApi(Auth.CREDENTIALS_API)
            .build();
    requestPhoneNumber(result -> {
        phoneET.setText(result);
    });
}

public void requestPhoneNumber(SimpleCallback<String> callback) {
    phoneNumberCallback = callback;
    HintRequest hintRequest = new HintRequest.Builder()
            .setPhoneNumberIdentifierSupported(true)
            .build();

    PendingIntent intent = Auth.CredentialsApi.getHintPickerIntent(googleApiClient, hintRequest);
    try {
        startIntentSenderForResult(intent.getIntentSender(), PHONE_NUMBER_RC, null, 0, 0, 0);
    } catch (IntentSender.SendIntentException e) {
        Logs.e(TAG, "Could not start hint picker Intent", e);
    }
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == PHONE_NUMBER_RC) {
        if (resultCode == RESULT_OK) {
            Credential cred = data.getParcelableExtra(Credential.EXTRA_KEY);
            if (phoneNumberCallback != null){
                phoneNumberCallback.onSuccess(cred.getId());
            }
        }
        phoneNumberCallback = null;
    }
}

Cela va générer un dialogue comme celui-ci:

enter image description here

11
Dmide

Il existe une nouvelle Android api qui permet à l'utilisateur de sélectionner son numéro de téléphone sans autorisation. Jetez un coup d'oeil à: https://Android-developers.googleblog.com/2017/10/effective-phone-number-verification.html

// Construct a request for phone numbers and show the picker
private void requestHint() {
    HintRequest hintRequest = new HintRequest.Builder()
       .setPhoneNumberIdentifierSupported(true)
       .build();

    PendingIntent intent = Auth.CredentialsApi.getHintPickerIntent(
        apiClient, hintRequest);
    startIntentSenderForResult(intent.getIntentSender(),
        RESOLVE_HINT, null, 0, 0, 0);
} 
10
Wirling

Je veux juste ajouter un peu ici aux explications ci-dessus dans les réponses ci-dessus. Ce qui permettra de gagner du temps pour les autres aussi.

Dans mon cas, cette méthode n'a renvoyé aucun numéro de mobile, une chaîne vide a été renvoyée. C'était à cause du cas que j'avais porté mon numéro sur la nouvelle sim. Donc, si je vais dans Paramètres> À propos du téléphone> État> Mon numéro de téléphone, cela me dit "Inconnu".

8
user_CC

Parfois, le code ci-dessous renvoie null ou une chaîne vide.

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

Avec la permission ci-dessous

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

Il existe un autre moyen d'obtenir votre numéro de téléphone. Je ne l'ai pas testé sur plusieurs appareils, mais le code ci-dessus ne fonctionne pas à chaque fois.

Essayez ci-dessous le code:

String main_data[] = {"data1", "is_primary", "data3", "data2", "data1", "is_primary", "photo_uri", "mimetype"};
Object object = getContentResolver().query(Uri.withAppendedPath(Android.provider.ContactsContract.Profile.CONTENT_URI, "data"),
        main_data, "mimetype=?",
        new String[]{"vnd.Android.cursor.item/phone_v2"},
        "is_primary DESC");
if (object != null) {
    do {
        if (!((Cursor) (object)).moveToNext())
            break;
        // This is the phoneNumber
        String s1 = ((Cursor) (object)).getString(4);
    } while (true);
    ((Cursor) (object)).close();
}

Vous devrez ajouter ces deux autorisations.

<uses-permission Android:name="Android.permission.READ_CONTACTS" />
<uses-permission Android:name="Android.permission.READ_PROFILE" />

J'espère que cela aide, merci!

8
activesince93

C'est une réponse plus simplifiée:

public String getMyPhoneNumber()
{
    return ((TelephonyManager) getSystemService(TELEPHONY_SERVICE))
            .getLine1Number();
}
4
E P Lewis

TelephonyManager n'est pas la bonne solution, car dans certains cas, le numéro n'est pas stocké dans la carte SIM. Je suggère que vous utilisiez la préférence partagée pour stocker le numéro de téléphone de l'utilisateur pour la première fois que l'application est ouverte et que le numéro sera utilisé chaque fois que vous en aurez besoin.

3
Naveed Ahmad

Tout d’abord, obtenir le numéro de téléphone portable des utilisateurs est contraire à la politique éthique; c’était auparavant possible, mais selon mes recherches, aucune solution solide n’est disponible pour cela. En utilisant du code, il est possible d’obtenir un numéro de téléphone portable, mais rien ne garantit que cela fonctionnera. seulement dans quelques appareils. Après de nombreuses recherches, je n'ai trouvé que trois solutions, mais elles ne fonctionnent pas dans tous les appareils.

Il y a la raison suivante pour laquelle nous n'obtenons pas.

1.Android Device et la nouvelle carte SIM ne mémorisant pas le numéro de mobile si le numéro de mobile n’est pas disponible sur le périphérique et dans le sim alors comment il est possible d’obtenir un numéro. sage, il retournera le "nul" ou "" ou "??????"

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

 TelephonyManager tel= (TelephonyManager)this.getSystemService(Context.
            TELEPHONY_SERVICE);
    String PhoneNumber =  tel.getLine1Number();

Remarque: - J'ai testé cette solution dans les appareils suivants: Moto x, Samsung Tab 4, Samsung S4, Nexus 5 et Redmi 2 Prime, mais cela ne fonctionne pas à chaque retour de chaîne vide. La conclusion est donc inutile =

  1. Cette méthode ne fonctionne que dans Redmi 2 prime, mais il est nécessaire d'ajouter une autorisation de lecture dans le manifeste.

Remarque: - Ce n’est pas non plus la solution garantie et efficace, j’ai testé cette solution dans de nombreux appareils, mais elle ne fonctionnait que dans Redmi 2 prime, qui est un appareil à double carte sim, il me donne deux numéro de portable. la seconde n’appartient pas à ma deuxième sim, elle appartient à une carte ancienne que je n’utilise pas.

 String main_data[] = {"data1", "is_primary", "data3", "data2", "data1",
            "is_primary", "photo_uri", "mimetype"};
    Object object = getContentResolver().
            query(Uri.withAppendedPath(Android.provider.ContactsContract.Profile.CONTENT_URI, "data"),
            main_data, "mimetype=?",
            new String[]{"vnd.Android.cursor.item/phone_v2"},
            "is_primary DESC");
    String s1="";
    if (object != null) {
        do {
            if (!((Cursor) (object)).moveToNext())
                break;
            // This is the phoneNumber
             s1 =s1+"---"+ ((Cursor) (object)).getString(4);
        } while (true);
        ((Cursor) (object)).close();
    }
  1. Dans mes recherches, j'ai découvert précédemment qu'il était possible d'obtenir un numéro de téléphone mobile à l'aide d'un compte WhatsApp, mais la nouvelle version de Whatsapp n'enregistre désormais pas le numéro de téléphone mobile de l'utilisateur.

Conclusion: - Android ne dispose pas de solution garantie pour obtenir le numéro de téléphone mobile de l'utilisateur par programme.

Suggestion: - 1. Si vous souhaitez vérifier le numéro de portable de l’utilisateur, demandez-lui de fournir son numéro. Vous pouvez vérifier avec otp.

  1. Si vous souhaitez identifier le périphérique de l'utilisateur, vous pouvez facilement obtenir le numéro IMEI du périphérique.
3
ramkrishna kushwaha

Une petite contribution Dans mon cas, le code a lancé une exception d'erreur. J'ai eu besoin de mettre une annotation pour que le code soit exécuté et résoudre ce problème. Ici je laisse ce code.

public static String getLineNumberPhone(Context scenario) {
    TelephonyManager tMgr = (TelephonyManager) scenario.getSystemService(Context.TELEPHONY_SERVICE);
    @SuppressLint("MissingPermission") String mPhoneNumber = tMgr.getLine1Number();
    return mPhoneNumber;
}
1

Bien qu'il soit possible d'avoir plusieurs comptes de messagerie vocale, les opérateurs vous dirigent vers la messagerie vocale lorsque vous appelez depuis votre propre numéro. Donc, TelephonyManager.getVoiceMailNumber() ou TelephonyManager.getCompleteVoiceMailNumber(), en fonction de la saveur dont vous avez besoin.

J'espère que cela t'aides.

0
Jim