Wie kann ich programmgesteuert die Telefonnummer des Geräts abrufen, auf dem meine Android-App ausgeführt wird?
Wie kann ich programmgesteuert die Telefonnummer des Geräts abrufen, auf dem meine Android-App ausgeführt wird?
Antworten:
Code:
TelephonyManager tMgr = (TelephonyManager)mAppContext.getSystemService(Context.TELEPHONY_SERVICE);
String mPhoneNumber = tMgr.getLine1Number();
Erforderliche Erlaubnis:
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
Nach den hoch bewerteten Kommentaren sind einige Vorbehalte zu beachten. Dies kann zurückkehren null
oder ""
sogar "???????"
, und es kann eine veraltete Telefonnummer zurückgeben, die nicht mehr gültig ist. Wenn Sie etwas möchten, das das Gerät eindeutig identifiziert, sollten Sie es verwendengetDeviceId()
stattdessen verwenden.
null
. Davon abgesehen ist mir keine bessere Antwort bekannt.
Es gibt keine garantierte Lösung für dieses Problem, da die Telefonnummer nicht auf allen SIM-Karten gespeichert oder vom Netzwerk an das Telefon gesendet wird. Dies gilt insbesondere in einigen Ländern, in denen eine Überprüfung der physischen Adresse erforderlich ist und die Nummernvergabe erst danach erfolgt. Die Zuweisung von Telefonnummern erfolgt im Netzwerk - und kann geändert werden, ohne dass die SIM-Karte oder das Gerät geändert werden müssen (z. B. wird so die Portierung unterstützt).
Ich weiß, dass es Schmerzen sind, aber die wahrscheinlich beste Lösung besteht darin, den Benutzer zu bitten, seine Telefonnummer einmal einzugeben und zu speichern.
Es gibt tatsächlich eine alternative Lösung, die Sie in Betracht ziehen könnten, wenn Sie sie nicht über den Telefoniedienst erhalten können.
Ab heute können Sie sich mit WhatsApp auf eine andere große Anwendung verlassen AccountManager
. Millionen von Geräten haben diese Anwendung installiert. Wenn Sie die Telefonnummer nicht über erhalten können TelephonyManager
, können Sie dies ausprobieren.
Genehmigung:
<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);
}
Suchen Sie actype
nach dem WhatsApp-Konto
if(actype.equals("com.whatsapp")){
String phoneNumber = ac.name;
}
Natürlich erhalten Sie es möglicherweise nicht, wenn der Benutzer WhatsApp nicht installiert hat, aber es lohnt sich trotzdem, es zu versuchen. Und denken Sie daran, dass Sie den Benutzer immer um Bestätigung bitten sollten.
Wie in meiner früheren Antwort gepostet
Verwenden Sie den folgenden Code:
TelephonyManager tMgr = (TelephonyManager)mAppContext.getSystemService(Context.TELEPHONY_SERVICE);
String mPhoneNumber = tMgr.getLine1Number();
Geben Sie in AndroidManifest.xml die folgende Berechtigung:
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
Denken Sie jedoch daran, dass dieser Code nicht immer funktioniert, da die Mobiltelefonnummer von der SIM-Karte und dem Netzbetreiber / Mobilfunkanbieter abhängt.
Versuchen Sie auch, Telefon -> Einstellungen -> Info -> Telefonidentität einzuchecken . Wenn Sie die Nummer dort anzeigen können, ist die Wahrscheinlichkeit höher, dass Sie die Telefonnummer vom obigen Code erhalten. Wenn Sie die Telefonnummer in den Einstellungen nicht anzeigen können, können Sie diesen Code nicht abrufen!
Vorgeschlagene Problemumgehung:
Führen Sie die obigen 4 Schritte als einmalige Aktivität beim ersten Start der App aus. Verwenden Sie später, wenn eine Telefonnummer erforderlich ist, den in den gemeinsamen Einstellungen verfügbaren Wert.
Auf diese Weise fordern Sie eine Telefonnummer über die Play Services-API ohne Erlaubnis und Hacks an. Quelle und vollständiges Beispiel .
In Ihrem build.gradle (Version 10.2.x und höher erforderlich):
compile "com.google.android.gms:play-services-auth:$gms_version"
In Ihrer Aktivität (der Code ist vereinfacht):
@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;
}
}
Dadurch wird ein Dialog wie folgt generiert:
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;
}
Es gibt eine neue Android-API, mit der der Benutzer seine Telefonnummer ohne Erlaubnis auswählen kann. Schauen Sie sich Folgendes an: 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);
}
Ich möchte hier nur ein wenig zu den obigen Erklärungen in den obigen Antworten hinzufügen. Das spart auch anderen Zeit.
In meinem Fall hat diese Methode keine Handynummer zurückgegeben, es wurde eine leere Zeichenfolge zurückgegeben. Es lag an dem Fall, dass ich meine Nummer auf die neue Sim portiert hatte. Wenn ich also zu Einstellungen> Über Telefon> Status> Meine Telefonnummer gehe, wird "Unbekannt" angezeigt.
Manchmal gibt der folgende Code eine null
leere Zeichenfolge zurück.
TelephonyManager tMgr = (TelephonyManager)mAppContext.getSystemService(Context.TELEPHONY_SERVICE);
String mPhoneNumber = tMgr.getLine1Number();
Mit unten stehender Erlaubnis
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
Es gibt eine andere Möglichkeit, wie Sie Ihre Telefonnummer erhalten können. Ich habe dies nicht auf mehreren Geräten getestet, aber der obige Code funktioniert nicht jedes Mal.
Versuchen Sie den folgenden 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();
}
Sie müssen diese beiden Berechtigungen hinzufügen.
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.READ_PROFILE" />
Hoffe das hilft, danke!
String s1
ist die Telefonnummer.
Zuallererst verstößt das Erhalten der Handynummer des Benutzers gegen die ethische Richtlinie, früher war es möglich, aber jetzt gibt es nach meinen Recherchen keine solide Lösung dafür. Durch die Verwendung eines Codes ist es möglich, die Handynummer zu erhalten, aber es kann keine Garantie dafür geben, dass es funktioniert nur in wenigen geräten. Nach vielen Recherchen habe ich nur drei Lösungen gefunden, die aber nicht auf allen Geräten funktionieren.
Es gibt den folgenden Grund, warum wir nicht bekommen.
1.Android-Gerät und neue Sim-Karte speichern keine Handynummer, wenn die Handynummer im Gerät nicht verfügbar ist, und in der Sim, wie es möglich ist, eine Nummer zu erhalten. Wenn eine alte SIM-Karte eine Handynummer hat, können wir mit dem Telefonie-Manager die andere Nummer erhalten weise wird es die "null" oder "" oder "??????"
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
TelephonyManager tel= (TelephonyManager)this.getSystemService(Context.
TELEPHONY_SERVICE);
String PhoneNumber = tel.getLine1Number();
Hinweis: - Ich habe diese Lösung in folgenden Geräten getestet: Moto x, Samsung Tab 4, Samsung S4, Nexus 5 und Redmi 2 prime, aber sie funktioniert nicht jedes Mal, wenn eine leere Zeichenfolge zurückgegeben wird
Hinweis: - Dies ist auch nicht die garantierte und effiziente Lösung. Ich habe diese Lösung auf vielen Geräten getestet, aber sie funktionierte nur in Redmi 2 prime, einem Dual-Sim-Gerät. Es gibt mir zwei Handynummern. Die erste ist korrekt, die zweite jedoch nicht gehöre zu meiner zweiten sim es gehört zu meiner alten sim karte die ich nicht benutze.
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();
}
Fazit : - Android hat keine garantierte Lösung, um die Handynummer des Benutzers programmgesteuert abzurufen.
Vorschlag : - 1. Wenn Sie die Handynummer des Benutzers überprüfen möchten, bitten Sie den Benutzer, seine Nummer anzugeben. Mit otp können Sie dies überprüfen.
- Wenn Sie das Gerät des Benutzers identifizieren möchten, können Sie dafür einfach die IMEI-Nummer des Geräts abrufen.
TelephonyManager
ist nicht die richtige Lösung, da in einigen Fällen die Nummer nicht auf der SIM-Karte gespeichert ist. Ich schlage vor, dass Sie die gemeinsame Einstellung verwenden, um die Telefonnummer des Benutzers zum ersten Mal zu speichern, wenn die Anwendung geöffnet ist, und die Nummer wird verwendet, wann immer Sie sie benötigen.
Hier ist eine Kombination der Lösungen, die ich gefunden habe (Beispielprojekt hier , wenn Sie auch das automatische Ausfüllen aktivieren möchten):
Manifest
<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 ""
}
}
}
Ein kleiner Beitrag. In meinem Fall hat der Code eine Fehlerausnahme ausgelöst. Ich musste eine Anmerkung einfügen, damit der Code ausgeführt wird, und das Problem beheben. Hier lasse ich diesen Code.
public static String getLineNumberPhone(Context scenario) {
TelephonyManager tMgr = (TelephonyManager) scenario.getSystemService(Context.TELEPHONY_SERVICE);
@SuppressLint("MissingPermission") String mPhoneNumber = tMgr.getLine1Number();
return mPhoneNumber;
}
Obwohl es möglich ist, mehrere Voicemail-Konten zu haben, leiten Sie die Anbieter bei Anrufen von Ihrer eigenen Nummer zur Voicemail weiter. Also, TelephonyManager.getVoiceMailNumber()
oder TelephonyManager.getCompleteVoiceMailNumber()
, je nach Geschmack, den Sie brauchen.
Hoffe das hilft.
Fügen Sie diese Abhängigkeit hinzu:
implementation 'com.google.android.gms:play-services-auth:18.0.0'
Verwenden Sie Folgendes, um die Liste der Telefonnummern abzurufen:
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
)
Nach dem Tippen auf den Dialog "Wiedergabedienste":
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)
}
}
}
Während ich an einer Sicherheits-App arbeitete, die die Telefonnummer dessen abrufen musste, wer mein Telefon in die Hände bekommen könnte, musste ich dies tun. 1. Empfangen Sie Boot abgeschlossen und versuchen Sie dann, Line1_Number von telephonyManager abzurufen, der ein String-Ergebnis zurückgibt. 2. Vergleichen Sie das String-Ergebnis mit meiner eigenen Telefonnummer. Wenn sie nicht übereinstimmen oder der String null zurückgibt, 3. senden Sie heimlich eine SMS mit dem String-Ergebnis und einem speziellen Zeichen an meine Büronummer. 4. Wenn das Senden von Nachrichten fehlschlägt, starten Sie einen Dienst und versuchen Sie es nach jeder Stunde weiter, bis die Absicht, dass eine ausstehende SMS gesendet wird, erfolgreich ist. Mit diesen Schritten konnte ich die Nummer der Person ermitteln, die mein verlorenes Telefon verwendet. Es spielt keine Rolle, ob die Person belastet wird.