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

443

Comment puis-je obtenir par programme le numéro de téléphone de l'appareil qui exécute mon application Android?

jkap
la source
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 du mobile ou de la SIM, uniquement du réseau ....
tomsoft
3
@tomsoft Pensez-y ... Comment des applications comme Facebook vérifient-elles automatiquement votre numéro de téléphone comme par magie ...?
Eddie Hart
1
@tomsoft Non, la plupart du temps, il ne demande même pas votre numéro de téléphone, ou si c'est le cas, la boîte est préremplie.
Eddie Hart
1
@tomsoft Eh bien, je me suis inscrit sur Facebook l'autre jour, et il n'a pas demandé mon numéro quand il m'a envoyé un code. Essayez-le. ;)
Eddie Hart
1
@EddieHart Faites-le aussi, et on m'a demandé mon numéro de téléphone. Donc, cela confirme que d'une manière générale, cela n'est pas accessible et certains opérateurs peuvent ajouter ces informations sur la configuration, mais ce n'est pas une fonctionnalité standard GMS
tomsoft

Réponses:

484

Code:

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

Autorisation requise:

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

Mises en garde:

Selon les commentaires très positifs, il y a quelques mises en garde à prendre en compte. Cela peut renvoyer nullou ""ou même "???????", et cela 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 devez utiliser à la getDeviceId()place.

Alex Volovoy
la source
150
En fait, pas si parfait. La dernière fois que j'ai essayé cette méthode, elle a signalé le numéro de téléphone que mon téléphone avait à l'origine, avant que mon ancien numéro de portable ne lui soit transféré. Il le fait probablement toujours, car l'application Paramètres affiche toujours ce numéro défunt. Il existe également des rapports selon lesquels certaines cartes SIM provoquent le retour de cette méthode null. Cela étant dit, je ne suis pas au courant d'une meilleure réponse.
CommonsWare
4
Mark a raison. Si l'intention d'utiliser quelque chose qui identifie le téléphone de manière unique, j'utiliserais getDeviceId () qui renverra IMEA pour GSM.
Alex Volovoy
15
(Je pense que vous voulez dire IMEI ...?)
ChaimKut
23
Eh bien, je l'ai testé sur Nexus One avec Android OS 2.2 et il renvoie null
Omar Rehman
43
Les développeurs peuvent penser que c'est la réponse parfaite en considérant le décompte des voix. Une note doit être ajoutée pour avertir le développeur que cette méthode ne donnera pas toujours le numéro de téléphone.
Habeeb Perwad
151

Il n'y a 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. Cela est particulièrement vrai dans certains pays qui nécessitent une vérification d'adresse physique, l'attribution des numéros ne se produisant qu'après. L'attribution des numéros de téléphone se produit sur le réseau - et peut être modifiée sans changer la carte SIM ou l'appareil (par exemple, c'est ainsi que le portage est pris en charge).

Je sais que c'est douloureux, 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.

Johan
la source
18
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 écouteur sur "android.provider.Telephony.SMS_RECEIVED". de cette façon, vous pouvez vous assurer que le nombre est correct et fonctionne
Hossein Shahdoost
1
Solution créative, mais vous souhaiterez peut-être informer l'utilisateur que vous le faites au cas où il serait facturé pour cela.
Norman H
3
Y a-t-il un fournisseur qui facture la réception de messages texte simples?!
ThiefMaster
9
Oui absolument. Avant d'ajouter des SMS à mon forfait, j'ai dû payer 0,30 $ par SMS reçu. Rogers au Canada.
John Kroetch
44

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 ignorer cette réponse.

Il existe en fait une solution alternative que vous voudrez peut-être envisager, si vous ne pouvez pas l'obtenir via le service de téléphonie.

À 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 ne pouvez pas obtenir le numéro de téléphone viaTelephonyManager , vous pouvez 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érifier le actypecompte WhatsApp

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

Bien sûr, vous ne pourrez 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 confirmation à l'utilisateur.

Chor Wai Chun
la source
1
Je viens de voir ça aujourd'hui, quand je jouais avec les comptes. C'est assez mauvais que le nombre 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 dont dispose l'application.
jargetz
9
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?
Cohelad
@Cohelad merci de m'avoir mis à jour, je vérifierai plus tard et je bifferai cette réponse après confirmation, en attendant je ne sais pas où enregistrer le numéro
Chor Wai Chun
3
Mais Viber EXPOSE le nombre! com.viber.voip.account
xnagyg
32

Comme indiqué dans ma 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 / opérateur de téléphone portable.

Essayez également de vérifier Téléphone -> Paramètres -> À propos -> Identité du téléphone.Si vous pouvez y afficher le numéro, la probabilité d'obtenir le numéro de téléphone à partir du code ci-dessus est plus élevée. Si vous n'êtes pas en mesure d'afficher le numéro de téléphone dans les paramètres, vous ne pourrez pas obtenir via ce code!

Solution de contournement suggérée:

  1. Obtenez 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 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.

Effectuez les 4 étapes ci-dessus en tant qu'activité unique lors du premier lancement de l'application. Plus tard, chaque fois qu'un numéro de téléphone est requis, utilisez la valeur disponible dans les préférences partagées.

Nishanthi Grashia
la source
Cette réponse couvre tous les facteurs, elle devrait être celle acceptée =)
Slava Fomin II
Comment puis-je obtenir les deux numéros de téléphone mobile s'il y a une double carte SIM disponible sur le téléphone. avec le code ci-dessus. Pour une
carte
26

C'est ainsi que vous demandez un numéro de téléphone via l'API Play Services sans l'autorisation et les hacks. Source et exemple complet .

Dans votre build.gradle (version 10.2.x et supé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 une boîte de dialogue comme celle-ci:

entrez la description de l'image ici

Dmide
la source
2
La demande de conseil montre le numéro de téléphone du compte de messagerie connecté au téléphone, il affichera la liste déroulante même s'il n'y a pas de carte SIM dans l'appareil.
Ari
comment la boîte de dialogue affiche-t-elle plusieurs numéros alors qu'il n'y a qu'une seule carte SIM? Pour moi, il montre 5 chiffres. : / :)
cgr
comment sélectionner automatiquement le premier numéro de téléphone dans Android?
Noorul
13
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

Emil Hajric
la source
@JaredBurrows en raison de "s.substring (2)".
Cookie Monster
1
Ça ne fonctionne pas pour moi. J'obtiens une valeur NULL (carte SIM sunrise, Suisse)
e-nature
votre lien est rompu.
Ümañg ßürmån
11

Il existe une nouvelle API Android qui permet à l'utilisateur de sélectionner son numéro de téléphone sans avoir besoin d'une autorisation. Jetez un œil à: 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);
} 
Tourbillonnant
la source
Cela nécessite Firebase
Vlad
@ Vlad Non, non. Cela ne nécessite que les services Google Play fournis avec la plupart des appareils. Citation du blog: "Avant de commencer, vous devrez créer et tester ceci est un appareil avec un numéro de téléphone qui peut recevoir des SMS et exécute les services Google Play 10.2.x et plus."
Wirling
9

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

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

user_CC
la source
La mienne aussi, quelle est cette condition? Roaming? Ou peut-être que la carte SIM ne contient tout simplement pas le numéro.
Alexandre Marcondes
8

Parfois, sous le code retourne nullou une chaîne vide.

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

Avec l'autorisation 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 n'ai pas testé cela sur plusieurs appareils, mais le code ci-dessus ne fonctionne pas à chaque fois.

Essayez le code ci-dessous:

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 vous aide, merci!

activesince93
la source
Puis-je demander: dans le deuxième extrait, quel est le numéro de la cellule?
iOSAndroidWindowsMobileAppsDev
1
La valeur de String s1sera le numéro de téléphone.
activesince93
Ce code ne fonctionne pas pour moi. (Votre dernier extrait de code). Renvoie une chaîne vide.
Kristy Welsh
Veuillez expliquer votre réponse. Où est stocké le numéro et comment contient-il le numéro? Dépendant de quoi?
not2qubit
3
@ not2qubit Je pense qu'il accède à l' auto- contact dans l'application Contacts
Samplasion
4

Ceci est une réponse plus simplifiée:

public String getMyPhoneNumber()
{
    return ((TelephonyManager) getSystemService(TELEPHONY_SERVICE))
            .getLine1Number();
}
EP Lewis
la source
3

Tout d'abord, obtenir le numéro de mobile des utilisateurs est contraire à la politique éthique, auparavant c'était possible, mais maintenant, selon mes recherches, aucune solution solide n'est disponible pour cela.En utilisant un code, il est possible d'obtenir un numéro de mobile, mais aucune garantie ne peut fonctionner. seulement dans quelques appareils. Après beaucoup de recherches, je n'ai trouvé que trois solutions, mais elles ne fonctionnent pas sur tous les appareils.

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

1.L'appareil Android et la nouvelle carte SIM ne stockent pas le numéro de téléphone mobile si le numéro de téléphone mobile n'est pas disponible dans l'appareil et dans la carte SIM alors comment il est possible d'obtenir le numéro, si une ancienne carte SIM ayant un numéro de téléphone portable utilise alors le gestionnaire de téléphonie, nous pouvons obtenir le numéro autre sage, il retournera le "null" 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 sur les appareils suivants Moto x, Samsung Tab 4, Samsung S4, Nexus 5 et Redmi 2 Prime, mais cela ne fonctionne pas à chaque fois qu'il renvoie une chaîne vide, la conclusion est donc inutile

  1. Cette méthode ne fonctionne que dans Redmi 2 prime, mais pour cela, vous devez ajouter l'autorisation de lecture des contacts 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 cela ne fonctionnait que dans Redmi 2 Prime qui est un appareil à double carte SIM, il me donne deux numéros de téléphone portable, le premier est correct mais le second n'est pas appartenir à ma deuxième carte SIM, il appartient à ma vieille carte SIM 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 plus tôt qu'il était possible d'obtenir un numéro de mobile en utilisant un compte WhatsApp, mais maintenant, la nouvelle version de Whatsapp ne stocke pas le numéro de mobile de l'utilisateur.

Conclusion : - Android n'a pas de solution garantie pour obtenir le numéro de mobile de l'utilisateur par programmation.

Suggestion : - 1. Si vous souhaitez vérifier le numéro de mobile de l'utilisateur, demandez à l'utilisateur de fournir son numéro, en utilisant otp, vous pouvez le vérifier.

  1. Si vous souhaitez identifier l'appareil de l'utilisateur, vous pouvez facilement obtenir le numéro IMEI de l'appareil.
ramkrishna kushwaha
la source
2

TelephonyManagern'est pas la bonne solution, car dans certains cas, le numéro n'est pas stocké dans la carte SIM. Je vous suggère d'utiliser 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 le numéro sera utilisé chaque fois que vous en aurez besoin.

Naveed Ahmad
la source
1
Mais cette méthode est sujette aux erreurs. L'utilisateur peut entrer un mauvais numéro.
Zohra Khan
3
oui, à cette fin, j'ai utilisé un message texte, lorsque l'utilisateur saisit un numéro, donc à partir de SmsManager le message de l'application lui-même, et grâce à cela, nous pouvons utiliser smsReciever pour obtenir le numéro d'origine
Naveed Ahmad
1
J'ai une autre question .. avec cette méthode il y aura des frais de SMS donnés par l'utilisateur (si ce n'est pas un numéro gratuit) .. Y a-t-il une autre méthode que je peux obtenir le numéro de téléphone de l'utilisateur?
Zohra Khan
Oui, bien sûr, il y aura des frais sur ce SMS si le numéro n'est pas un numéro gratuit.
Naveed Ahmad
Non, je pense qu'il n'y a pas de telle méthode sans TelephonyManager jusqu'à présent. et je signale le problème de TelephoneManager dans ma réponse.
Naveed Ahmad
2

Voici une combinaison des solutions que j'ai trouvées (exemple de projet ici , si vous souhaitez également vérifier le remplissage automatique):

manifeste

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

build.gradle

    implementation "com.google.android.gms:play-services-auth:17.0.0"

MainActivity.kt

class MainActivity : AppCompatActivity() {
    private lateinit var googleApiClient: GoogleApiClient

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        tryGetCurrentUserPhoneNumber(this)
        googleApiClient = GoogleApiClient.Builder(this).addApi(Auth.CREDENTIALS_API).build()
        if (phoneNumber.isEmpty()) {
            val hintRequest = HintRequest.Builder().setPhoneNumberIdentifierSupported(true).build()
            val intent = Auth.CredentialsApi.getHintPickerIntent(googleApiClient, hintRequest)
            try {
                startIntentSenderForResult(intent.intentSender, REQUEST_PHONE_NUMBER, null, 0, 0, 0);
            } catch (e: IntentSender.SendIntentException) {
                Toast.makeText(this, "failed to show phone picker", Toast.LENGTH_SHORT).show()
            }
        } else
            onGotPhoneNumberToSendTo()

    }

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        if (requestCode == REQUEST_PHONE_NUMBER) {
            if (resultCode == Activity.RESULT_OK) {
                val cred: Credential? = data?.getParcelableExtra(Credential.EXTRA_KEY)
                phoneNumber = cred?.id ?: ""
                if (phoneNumber.isEmpty())
                    Toast.makeText(this, "failed to get phone number", Toast.LENGTH_SHORT).show()
                else
                    onGotPhoneNumberToSendTo()
            }
        }
    }

    private fun onGotPhoneNumberToSendTo() {
        Toast.makeText(this, "got number:$phoneNumber", Toast.LENGTH_SHORT).show()
    }


    companion object {
        private const val REQUEST_PHONE_NUMBER = 1
        private var phoneNumber = ""

        @SuppressLint("MissingPermission", "HardwareIds")
        private fun tryGetCurrentUserPhoneNumber(context: Context): String {
            if (phoneNumber.isNotEmpty())
                return phoneNumber
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                val subscriptionManager = context.getSystemService(Context.TELEPHONY_SUBSCRIPTION_SERVICE) as SubscriptionManager
                try {
                    subscriptionManager.activeSubscriptionInfoList?.forEach {
                        val number: String? = it.number
                        if (!number.isNullOrBlank()) {
                            phoneNumber = number
                            return number
                        }
                    }
                } catch (ignored: Exception) {
                }
            }
            try {
                val telephonyManager = context.getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager
                val number = telephonyManager.line1Number ?: ""
                if (!number.isBlank()) {
                    phoneNumber = number
                    return number
                }
            } catch (e: Exception) {
            }
            return ""
        }
    }
}
développeur android
la source
pl voir les commentaires sur cette réponse stackoverflow.com/a/48210130/5457916 , avant de mettre en œuvre cette méthode
humble_wolf
Le lien que vous avez fourni n'est qu'une partie de ce que j'ai fait ici. Ici, j'ai d'abord essayé de le remplir moi-même. Et ayez recours à cela.
développeur Android
Je sais monsieur, votre réponse est excellente et n'est pas incorrecte dans tous les sens, je voulais juste que les lecteurs soient conscients des conditions qui accompagnent cette façon, par exemple cela peut remplir le numéro associé à votre compte Google, etc. mentionné dans les commentaires.
humble_wolf
Je préfère toujours ce que j'ai écrit. Désolé
développeur Android
1

Une petite contribution. Dans mon cas, le code a lancé une exception d'erreur. J'ai dû 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;
}
Ariel Alejandro Wagner
la source
0

Bien qu'il soit possible d'avoir plusieurs comptes de messagerie vocale, lorsque vous appelez à partir de votre propre numéro, les opérateurs vous dirigent vers la messagerie vocale. Alors, TelephonyManager.getVoiceMailNumber()ouTelephonyManager.getCompleteVoiceMailNumber() , selon la saveur dont vous avez besoin.

J'espère que cela t'aides.

Jim
la source
5
il n'y a pas de fonction "getCompleteVoiceMailNumber", plus la fonction getVoiceMailNumber () renvoie un nombre différent du nombre réel du téléphone.
développeur Android
C'est une astuce qui ne fonctionne qu'avec quelques opérateurs mobiles dans le monde. Mais techniquement, cela pourrait être une solution.
technik
0

Ajoutez cette dépendance: implementation 'com.google.android.gms:play-services-auth:18.0.0'

Pour récupérer la liste des numéros de téléphone, utilisez ceci:

val hintRequest = HintRequest.Builder()
    .setPhoneNumberIdentifierSupported(true)
    .build()

val intent = Credentials.getClient(context).getHintPickerIntent(hintRequest)

startIntentSenderForResult(
    intent.intentSender,
    PHONE_NUMBER_FETCH_REQUEST_CODE,
    null,
    0,
    0,
    0,
    null
)

Après avoir tapé sur la boîte de dialogue des services de lecture:

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent? { 
    super.onActivityResult(requestCode, resultCode, data)

    if (requestCode == PHONE_NUMBER_FETCH_REQUEST_CODE) {
        data?.getParcelableExtra<Credential>(Credential.EXTRA_KEY)?.id?.let { 
            useFetchedPhoneNumber(it)
        }
    }
}
Reyaz Ahmad
la source
-6

tout en travaillant sur une application de sécurité qui devait obtenir le numéro de téléphone de la personne que mon téléphone pourrait mettre entre leurs mains, je devais le faire; 1. recevez le démarrage terminé, puis essayez d'obtenir Line1_Number de telephonyManager qui renvoie un résultat de chaîne. 2. comparer le résultat de la chaîne avec mon propre numéro de téléphone et s'ils ne correspondent pas ou si la chaîne renvoie null, 3. envoyer secrètement un SMS contenant le résultat de la chaîne plus un signe spécial à mon numéro de bureau. 4. Si l'envoi de message échoue, démarrez un service et continuez d'essayer après chaque heure jusqu'à ce que l'intention d'envoi du SMS envoyé soit réussie. Avec ces étapes, j'ai pu obtenir le numéro de la personne utilisant mon téléphone perdu. peu importe que la personne soit inculpée.

Rayon
la source
pourquoi downvotes?
humble_wolf