Frage

Wie kann ich programmgesteuert die Telefonnummer des Geräts erhalten, in dem meine Android -App ausgeführt wird?

War es hilfreich?

Lösung

Code:

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

Erforderliche Erlaubnis:

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

Vorbehalte:

Nach den hochrangigen Kommentaren gibt es einige Vorbehalte, die sich bewusst sind. Dies kann zurückkehren null oder "" oder auch "???????", und es kann eine abgestandene Telefonnummer zurückgeben, die nicht mehr gültig ist. Wenn Sie etwas wünschen, das das Gerät eindeutig identifiziert, sollten Sie verwenden getDeviceId() stattdessen.

Andere Tipps

Es gibt keine garantierte Lösung für dieses Problem, da die Telefonnummer nicht auf allen SIM-Cards physisch gespeichert oder vom Netzwerk zum Telefon ausgestrahlt wird. Dies gilt insbesondere in einigen Ländern, was eine physische Adressüberprüfung erfordert, wobei die Zahlenzuweisung erst später stattfindet. Die Telefonnummernzuweisung erfolgt im Netzwerk - und kann geändert werden, ohne die SIM -Karte oder das Gerät zu ändern (z. B. wird die Portierung unterstützt).

Ich weiß, dass es Schmerz ist, aber höchstwahrscheinlich ist es die beste Lösung, den Benutzer zu bitten, seine/ihre Telefonnummer einmal einzugeben und sie zu speichern.

UPDATE: Diese Antwort ist nicht mehr verfügbar, da WhatsApp die Telefonnummer als Kontonamen aufgehört hat und diese Antwort freundlicherweise ignoriert.

Es gibt tatsächlich eine alternative Lösung, die Sie möglicherweise berücksichtigen möchten, wenn Sie sie nicht über den Telefonie -Service erhalten können.

Ab heute können Sie sich auf eine andere große Anwendung verlassen, die WhatsApp verwendet AccountManager. Millionen von Geräten haben diese Anwendung installiert und wenn Sie die Telefonnummer nicht über erhalten können TelephonyManager, Sie können dies versuchen.

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);
}

Prüfen actype Für WhatsApp -Konto

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

Natürlich bekommen Sie es möglicherweise nicht, wenn der Benutzer WhatsApp nicht installiert hat, aber es lohnt sich trotzdem, es zu versuchen. Und denken Sie daran, Sie sollten den Benutzer immer um Bestätigung bitten.

Wie veröffentlicht in meinem frühere Antwort

Verwenden Sie den folgenden Code:

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

In AndroidManifest.xml geben Sie die folgende Erlaubnis:

 <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 Netzwerkbetreiber / Handy -Träger abhängt.

Versuchen Sie auch, einchecken Telefon-> Einstellungen-> Über-> Telefonidentität, Wenn Sie die Nummer dort anzeigen können, ist die Wahrscheinlichkeit, die Telefonnummer aus dem obigen Code zu erhalten, höher. Wenn Sie die Telefonnummer in den Einstellungen nicht anzeigen können, können Sie nicht über diesen Code erhalten!

Vorgeschlagene Problemumgehung:

  1. Holen Sie sich die Telefonnummer des Benutzers als manuelle Eingabe vom Benutzer.
  2. Senden Sie einen Code über SMS an die Handynummer des Benutzers.
  3. Bitten Sie den Benutzer, den Code einzugeben, um die Telefonnummer zu bestätigen.
  4. Speichern Sie die Nummer in SharedPreference.

Führen Sie die oben genannten 4 Schritte als einmalige Aktivität während des ersten Starts der App aus. Verwenden Sie später, wenn die Telefonnummer erforderlich ist, den Wert in gemeinsam genutzter Präferenz.

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 von http://www.androidsnippets.com/get-my-phone-number

So 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;
    }
}

Dies erzeugt einen solchen Dialog:

enter image description here

Es gibt eine neue Android -API, mit der der Benutzer seine PhoneNumber auswählen kann, ohne dass eine Berechtigung erforderlich ist. Schauen Sie sich 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 oben in den oben genannten Antworten nur ein bisschen zu den oben genannten Erklärungen hinzufügen. Das spart auch Zeit für andere.

In meinem Fall gab diese Methode keine Handynummer zurück, sondern eine leere Zeichenfolge. Es lag an dem Fall, dass ich meine Nummer auf der neuen SIM portiert hatte. Wenn ich also in die Einstellungen> über Telefon> Status> meine Telefonnummer gehe, zeigt ich "unbekannt".

Manchmal kehrt unter dem Code zurück null oder leere Zeichenfolge.

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

Mit untener Erlaubnis

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

Es gibt eine andere Möglichkeit, Ihre Telefonnummer zu erhalten. Ich habe dies nicht auf mehreren Geräten getestet, aber über den 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!

Dies ist eine vereinfachte Antwort:

public String getMyPhoneNumber()
{
    return ((TelephonyManager) getSystemService(TELEPHONY_SERVICE))
            .getLine1Number();
}

Zunächst einmal ist die Handynummer von Benutzern gegen die ethische Richtlinie zu sehen. Zuvor war es möglich, aber jetzt nach meiner Forschung gibt es keine solide Lösung dafür. Durch die Verwendung eines Codes ist es möglich, eine Handynummer zu erhalten, aber es kann möglicherweise keine Garantie für funktionieren. Nur in wenigen Geräten. Nach vielen Nachforschungen habe ich nur drei Lösung gefunden, aber sie arbeiten nicht im gesamten Gerät.

Es gibt den folgenden Grund, warum wir nicht bekommen.

1.Android -Geräte und neue SIM -Karte Speichern Sie die Handynummer nicht, wenn die Mobiltelefonnummer im Gerät nicht verfügbar ist, und in SIM, wie es möglich ist, die Nummer zu erhalten. Wenn eine alte SIM -Karte mit Handynummer mit Handy -Manager mit dem Telefonnummer erhalten wird, können wir die Nummer andere erhalten Was den „Null“ oder „“ oder „???????“ zurückgeben wird

<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 im folgenden Geräte-Moto X, Samsung Tab 4, Samsung S4, Nexus 5 und Redmi 2 Prime getestet, aber es funktioniert nicht jedes Mal, wenn sie die leere Zeichenfolge zurückgibt.

  1. Diese Methode funktioniert nur in Redmi 2 Prime, aber für diese Notwendigkeit, in Manifest gelesene Kontaktgenehmigung hinzuzufügen.

Hinweis:- Dies ist auch nicht die garantierte und effiziente Lösung, ich habe diese Lösung in vielen Geräten getestet, aber es hat nur in Redmi 2 Prime funktioniert. Dies ist ein Dual-SIM-Gerät. Es gibt mir zwei Handynummer zuerst, aber der zweite ist nicht gehört 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();
    }
  1. In meinen Forschungen habe ich zuvor festgestellt, dass es möglich war, eine Handynummer mit WhatsApp -Konto zu erhalten, aber jetzt speichert neue WhatsApp -Version keine Handynummer des Benutzers.

Fazit:- Android hat keine garantierte Lösung, um die Handlungsnummer des Benutzers programmgesteuert zu erhalten.

Anregung:- 1. Wenn Sie die Handynummer des Benutzers überprüfen möchten, fragen Sie an den Benutzer, seine Nummer anzugeben. Mit OTP können Sie dies überprüfen.

  1. Wenn Sie das Gerät des Benutzers identifizieren möchten, können Sie dies problemlos Geräte -IMEI -Nummer erhalten.

TelephonyManager ist nicht die richtige Lösung, da in einigen Fällen die Zahl in der SIM nicht gespeichert wird. Ich schlage vor, dass Sie die freigegebene Präferenz verwenden sollten, um die Telefonnummer des Benutzers zum ersten Mal zu speichern, und die Nummer wird verwendet, wann immer Sie benötigen.

Ein kleiner Beitrag. In meinem Fall hat der Code eine Fehlerausnahme gestartet. Ich habe eine Annotation eingestellt, mit der für den Code ausgeführt wird und dieses Problem behoben wird. 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, übertragen Sie bei der Anrufe von Ihrer eigenen Nummer Sie zu Voicemail. So, TelephonyManager.getVoiceMailNumber() oder TelephonyManager.getCompleteVoiceMailNumber(), abhängig von dem Geschmack, den Sie benötigen.

Hoffe das hilft.

Während ich an einer Sicherheits -App arbeitete, die die Telefonnummer dessen musste, die mein Telefon in ihre Hände geraten könnte, musste ich dies tun. 1. Erhalten Sie den Start ab, und dann versuchen Sie, Zeile1_Number von TelephonyManager zu erhalten, der ein String -Ergebnis zurückgibt. 2. Vergleichen Sie das Zeichenfolgenergebnis mit meiner eigenen Telefonnummer und wenn sie nicht übereinstimmen oder die Zeichenfolge nicht übereinstimmt, senden Sie NULL. 3. Senden Sie heimlich ein SMS, das das String -Ergebnis sowie ein spezielles Zeichen an meine Büronummer enthält. 4. Wenn das Senden von Nachrichten fehlschlägt, starten Sie einen Dienst und versuchen Sie es nach jeder Stunde, bis die SMS -SMS bis zur erfolgreichen Rückgabe erfolgreich gesendet wird. Mit diesen Schritten konnte ich die Anzahl der Person mit meinem verlorenen Telefon erhalten. Es spielt keine Rolle, ob die Person belastet ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top