Comment puis-je obtenir par programme le numéro de téléphone de l'appareil qui exécute mon application Android?
Comment puis-je obtenir par programme le numéro de téléphone de l'appareil qui exécute mon application Android?
Réponses:
Code:
TelephonyManager tMgr = (TelephonyManager)mAppContext.getSystemService(Context.TELEPHONY_SERVICE);
String mPhoneNumber = tMgr.getLine1Number();
Autorisation requise:
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
Selon les commentaires très positifs, il y a quelques mises en garde à prendre en compte. Cela peut renvoyer null
ou ""
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.
null
. Cela étant dit, je ne suis pas au courant d'une meilleure réponse.
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.
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 actype
compte 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.
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:
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.
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:
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
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);
}
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".
Parfois, sous le code retourne null
ou 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!
String s1
sera le numéro de téléphone.
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
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();
}
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.
- Si vous souhaitez identifier l'appareil de l'utilisateur, vous pouvez facilement obtenir le numéro IMEI de l'appareil.
TelephonyManager
n'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.
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 ""
}
}
}
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;
}
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.
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)
}
}
}
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.