Domanda

Come posso ottenere a livello di codice il numero di telefono del dispositivo su cui è in esecuzione la mia app Android?

È stato utile?

Soluzione

Codice:

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

Il permesso richiesto:

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

Avvertenze:

Secondo i commenti altamente upvoted, ci sono alcune avvertenze da tenere presente. Questo può tornare null o "" o anche "???????", e può restituire un numero di telefono stantio che non è più valido. Se si desidera qualcosa che identifica in modo univoco il dispositivo, è necessario utilizzare getDeviceId() posto.

Altri suggerimenti

Non c'è una soluzione garantita per questo problema perché il numero di telefono non è fisicamente memorizzati su tutti SIM-card, o trasmesso dalla rete al telefono. Questo è particolarmente vero in alcuni paesi che richiede la verifica indirizzo fisico, con assegnazione dei numeri solo succede dopo. assegnazione dei numeri di telefono avviene sulla rete - e può essere modificata senza cambiare la scheda SIM o dispositivo (ad esempio è così porting è supportato)

.

Lo so che è dolore, ma molto probabilmente la soluzione migliore è solo quello di chiedere all'utente di inserire il proprio numero / telefono una volta e memorizzarlo.

Aggiornamento:Questa risposta non è più disponibile poiché Whatsapp ha smesso di esporre il numero di telefono come nome dell'account, ignora questa risposta.

In realtà esiste una soluzione alternativa che potresti prendere in considerazione, se non riesci a ottenerla tramite il servizio di telefonia.

Da oggi puoi contare su un'altra grande applicazione, Whatsapp, utilizzando AccountManager.Milioni di dispositivi hanno questa applicazione installata e se non riesci a ottenere il numero di telefono tramite TelephonyManager, potresti provarci.

Autorizzazione:

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

Codice:

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

Controllo actype per l'account WhatsApp

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

Ovviamente potresti non ottenerlo se l'utente non ha installato WhatsApp, ma vale comunque la pena provare.E ricorda che dovresti sempre chiedere conferma all'utente.

Come scritto nel mio precedente rispondere

Usa il codice qui sotto:

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

In AndroidManifest.xml, dare l'autorizzazione seguente:

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

Ma ricordate, questo codice non sempre funziona, dal momento che il numero di telefono cellulare dipende dalla scheda SIM e il vettore telefono all'operatore di rete / cella.

Inoltre, cercare il check-in Telefono -> Impostazioni -> Informazioni -> Telefono Identità , se si è in grado di visualizzare il numero lì, la probabilità di ottenere il numero di telefono da sopra il codice è più alto. Se non si è in grado di visualizzare il numero di telefono nelle impostazioni, quindi non sarà in grado di ottenere tramite questo codice!

soluzione suggerita:

  1. Ottenere il numero di telefono dell'utente come input manuale da parte dell'utente.
  2. Invia un codice al numero di cellulare dell'utente tramite SMS.
  3. Fai all'utente di inserire il codice per confermare il numero di telefono.
  4. Salvare il numero in sharedpreference.

fare quanto sopra 4 passi come attività una sola volta durante il primo lancio del app. In seguito, ogni volta che viene richiesto il numero di telefono, utilizzare il valore a disposizione di preferenza condivisa.

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

Codice tratto da http://www.androidsnippets.com/get-my- phone-number

Ecco come si richiede un numero di telefono tramite l'API Play Services senza il permesso e hack. href="https://android-developers.googleblog.com/2017/10/effective-phone-number-verification.html" rel="noreferrer"> Source e esempio completo .

Nel vostro build.gradle (versione 10.2.xe successiva):

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

Nella vostra attività (il codice è semplificato):

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

Questo genererà una finestra come questa:

 entrare descrizione dell'immagine qui

C'è una nuova API di Android che permette all'utente di selezionare la loro phonenumber senza la necessità di un permesso. Date un'occhiata al: 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);
} 

Voglio solo aggiungere un po 'qui per spiegazioni di cui sopra nelle risposte di cui sopra. Che farà risparmiare tempo per gli altri pure.

Nel mio caso questo metodo non ha restituito alcun numero di cellulare, una stringa vuota è stato restituito. E 'stato a causa del caso che avevo portato il mio numero sulla nuova sim. Quindi, se vado in Impostazioni> Info sul telefono> Stato> Il mio numero di telefono mi mostra "Sconosciuto".

A volte, sotto codice restituisce null o stringa vuota.

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

Con il permesso di sotto

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

C'è un altro modo si sarà in grado di ottenere il vostro numero di telefono, non ho ancora testato questo su più dispositivi, ma soprattutto il codice non funziona ogni volta.

Prova sottostante Codice:

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

È necessario aggiungere questi due permessi.

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

Spero che questo aiuti, Grazie!

Questa è una risposta più semplificata:

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

Prima di tutto ottenere che gli utenti numero di cellulare è contro la politica etica, in precedenza è stato possibile, ma ora come per la mia ricerca non c'è soluzione solida per questo, usando un po 'di codice è possibile ottenere il numero di cellulare, ma nessuna garanzia può essere funzionerà solo in poche dispositivo. Dopo molte ricerche ho scoperto solo tre soluzione, ma non stanno lavorando in tutti i dispositivi.

Non v'è il seguente motivo per cui non stiamo ottenendo.

dispositivo 1.Android e la nuova Sim Card non memorizzare il numero di cellulare, se il numero di cellulare non è disponibile in un dispositivo e in sim allora come sia possibile ottenere il numero, se qualsiasi vecchio sim card con numero di cellulare quindi utilizzando Telephony Manager che possiamo ottenere il numero di altri saggi verrà restituito il “null” o “” o “??????”

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

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

Nota: - Ho testato questa soluzione nel seguente dispositivo Moto x, Samsung Tab 4, Samsung S4, Nexus 5 e redmi 2 privilegiata, ma non funziona ogni   tempo di ritorno stringa vuota, quindi conclusione è inutile

  1. Questo metodo funziona solo in redmi 2 privilegiata, ma per questo c'è bisogno di aggiungere permesso di lettura contatto nel manifesto.
  

Nota: - Anche questo non è garantito e la soluzione efficiente, ho provato questa soluzione in molti dispositivi, ma ha funzionato solo in redmi 2 Prime   che è dispositivo dual sim mi dà due numero di cellulare prima è   corretto, ma il secondo non è appartenere alla mia seconda sim esso appartiene   la mia qualche vecchia carta SIM che io non sto usando.

 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. Nella mia ricerca ho trovato in precedenza è stato possibile ottenere il numero di cellulare utilizzando l'account WhatsApp, ma ora la nuova versione WhatsApp non memorizzare il numero di cellulare dell'utente.
  

Conclusione : - Android non ha alcuna soluzione garantita per ottenere   numero di cellulare dell'utente a livello di codice.

     

Suggerimento : - 1. Se si desidera verificare il numero di cellulare dell'utente poi chiedere a   dell'utente a fornire il suo numero, utilizzando otp è possibile in grado di verificare che.

     
      
  1. Se si desidera identificare il dispositivo dell'utente, per questo si può facilmente ottenere il numero IMEI del dispositivo.
  2.   

TelephonyManager non è la soluzione giusta, perché in alcuni casi il numero non viene memorizzato nella SIM. Suggerisco che si dovrebbe usare la preferenza condivisa per memorizzare il numero di telefono dell'utente per la prima volta che l'applicazione è aperta e il numero sarà utilizzato ogni volta che è necessario.

Un piccolo contributo. Nel mio caso, il codice ha lanciato un'eccezione errore. Ho avuto bisogno messo un'annotazione che per il codice da eseguire e risolvere questo problema. Qui ho lasciato questo codice.

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

Anche se è possibile avere più account di posta vocale, quando si chiama il proprio numero, vettori di instradare alla casella vocale. Così, TelephonyManager.getVoiceMailNumber() o TelephonyManager.getCompleteVoiceMailNumber(), a seconda del gusto è necessario.

Spero che questo aiuti.

mentre si lavora su un'applicazione di sicurezza che aveva bisogno per ottenere il numero di telefono di chi così mai il mio telefono potrebbe ottenere nelle loro mani, ho dovuto fare questo; 1. ricevere Boot completato e quindi provare a ottenere Line1_Number da telephonyManager che restituisce un risultato stringa. 2. Confrontare il risultato String con il mio numero di telefono e se non corrispondono o ritorna stringa vuota, allora, 3. inviare segretamente uno SMS contenente il risultato stringa oltre a un segno speciale per il mio numero di ufficio. 4. se l'invio del messaggio fallisce, avviare un servizio e continuare a provare dopo ogni ora fino SMS inviato in attesa di intenti ritorna con successo. Con questa procedura ho potuto ottenere il numero della persona che utilizza il telefono smarrito. non importa se la persona è a carico.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top