2013-01-17 17 views
6

Ho bisogno di un modo per verificare che il numero di cellulare impostato nella mia applicazione Android sia corretto come in "proprietà" - non la convalida dei dati del numero di cellulare.Verifica numero telefonico Android

E.g. il modo in cui WhatsApp lo sta facendo ...

So come farlo tramite la verifica tramite SMS utilizzando codici e materiale. Il fatto è che si tratta di un'applicazione Android gratuita e non sono interessato a pagare per ogni SMS inviato quando l'app è gratuita. Cattivo modello di business ...

C'è un modo per farlo in modo sicuro e gratuito?

Utilizzando il codice API sembrano essere non troppo sicuro in modo che non è un'opzione Ho paura:

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

Cosa vuoi dire che è "non è sicuro"? – Tushar

+0

Non so come funziona WhatsApp, e forse anche altri qui non lo sanno. Forse potresti indicarci? –

+1

In realtà, nella mia esperienza WhatsApp * * invia una verifica SMS per la creazione dell'account. – kabuko

risposta

19

WhatsApp non ha inviato alcun SMS a te, invia uno SMS con il proprio telefono cellulare per il tuo numero Se si riceve l'SMS tutto è OK, se non si riceve un sms non si possiede quel numero. È l'unico modo economico e semplice per verificare se un utente si è registrato con il proprio numero reale.

+0

Ciò significa che l'utente deve pagare per un singolo SMS? Eventuali inconvenienti noti con questa soluzione? – andreas78

+0

Sì, questo è corretto. Non conosco alcun svantaggio per questa soluzione – ObAt

+0

Ho letto un po 'su questo e non è molto sicuro. Sembra che WhatsApp abbia faticato con il suo processo di registrazione non essendo sicuro. Diversi esempi di possibilità di fingere di essere il proprietario di un numero di telefono. : -/ – andreas78

1

Google Play Services ha due nuove API che consentono di ottenere il numero di telefono di un utente e verificare via SMS senza permessi dei dispositivi: il selettore telefono e SMS Retriever.

mediante il selettore del telefono per ottenere il numero

Il primo passo è quello di avere l'utente avviare la verifica SMS dal all'interno della vostra app. La vostra applicazione potrebbe richiedere all'utente di inserire un telefono il numero, ed è possibile utilizzare il selettore di telefono per rendere questo più facile, usando codice come questo:

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

Il costruttore HintRequest racconta servizi svolgono che un numero di telefono identificatore è necessario. Questo viene quindi utilizzato per creare e avviare un intent, che mostrerà all'utente una finestra di dialogo Play Service permettendogli di selezionare il proprio numero di telefono da condividere con l'app. Questa API non richiede richieste e visualizza il numero (i) disponibile sul telefono o sull'account Google che l'utente deve selezionare.

Quando l'utente seleziona un numero di telefono, verrà restituito all'applicazione in onActivityResult in formato E164 su dispositivi che eseguono l' versione di Play Services. Nota che in alcuni casi, a seconda del telefono , potresti non ottenere un numero di telefono, quindi assicurati di controllare se la credenziale non è nulla. Se non si dispone di un numero, è necessario specificare per consentire all'utente di digitarlo manualmente.

// Obtain the phone number from the result 
@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    if (requestCode == RESOLVE_HINT) { 
     if (resultCode == RESULT_OK) { 
      Credential credential = data.getParcelableExtra(Credential.EXTRA_KEY); 
      // credential.getId(); <-- E.164 format phone number on 10.2.+ devices 
     } 
    } 
} 

A questo punto avrete una stringa del numero di telefono per l'utente. Mentre è utile , probabilmente vorrai verificare che l'utente possegga questo numero specifico , ad esempio per consentire loro di inviare o recuperare il messaggio con altri utenti o identificarsi con questo numero.

Utilizzando l'API SMS di verifica per verificare il numero

Un modo semplice per verificare il numero di proprietà è inviando uno SMS al il numero, contenente un codice di verifica una sola volta, e di farle entrare che nella tua app. L'API di verifica SMS ti dà l'abilità per l'app di ascoltare un SMS in arrivo dal quale può analizzare automaticamente il codice.

Per iniziare, la vostra applicazione sarà SmsRetrieverClient con codice come questo:

SmsRetrieverClient client = SmsRetriever.getClient(this /* context */); 

Task<Void> task = client.startSmsRetriever(); 

task.addOnSuccessListener(new OnSuccessListener<Void>() { 
    @Override 
    public void onSuccess(Void aVoid) { 
    // successfully started an SMS Retriever for one SMS message 
    } 
}); 

task.addOnFailureListener(new OnFailureListener() { 
    @Override 
    public void onFailure(@NonNull Exception e) { 
    }); 
); 

E 'abbastanza semplice - si ottiene un client SMS Retriever e quindi avviare un compito per esso. L'attività ha un ascoltatore di successo e uno su Errore in caso di sovrascrittura. Dopo aver avviato SMS Retriever, invii il numero di telefono dell'utente al numero e avvia il flusso di lavoro per generando il messaggio e inviandolo a quel numero.

Il messaggio deve essere costruito in un modo specifico. Il messaggio deve essere inserito in un messaggio SMS, quindi non può essere più lungo di 140 byte. È necessario che inizi con un prefisso specifico: "< #>" o due caratteri di spazio pari a consecutivi (U + 200B). Vedi lo documentation per maggiori informazioni. Deve terminare con un hash di 11 caratteri che identifica la tua app, descritta di seguito.

Esempio:

< #> Utilizzare 123456 come il codice di verifica nell'esempio App!

FA + 9qCX9VSu codice di verifica

L'one-time può essere qualsiasi stringa: si può semplicemente generare un numero casuale. Il messaggio deve terminare con un hash che è determinato in base alle procedure qui. I servizi di Google Play sostituiranno con questo hash per determinare a quale app è destinato il messaggio di verifica. È necessario generare questo hash una sola volta per il pacchetto dell'app e il certificato di firma : non cambierà e non dovrebbe essere fornito dall'app client .

Il server può quindi inviare il messaggio al telefono utilizzando l'infrastruttura o il servizio SMS esistente . Quando questo messaggio viene ricevuto, i servizi di riproduzione di Google trasmettono un intent che contiene il testo del messaggio . Ecco il codice:

public class MySMSBroadcastReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
    if (SmsRetriever.SMS_RETRIEVED_ACTION.equals(intent.getAction())) { 
     Bundle extras = intent.getExtras(); 
     Status status = (Status) extras.get(SmsRetriever.EXTRA_STATUS); 

     switch(status.getStatusCode()) { 
     case CommonStatusCodes.SUCCESS: 
      String message = (String) extras.get(SmsRetriever.EXTRA_SMS_MESSAGE); 
      break; 
     case CommonStatusCodes.TIMEOUT: 
      break; 
     } 
    } 
    } 
} 

Nel OnReceive del ricevitore trasmissione si ottiene gli extra, e tirare lo stato da lì. Se lo stato indica che il messaggio è stato ricevuto correttamente, è possibile estrarre il messaggio dagli extra. Da qui è possibile analizzare il codice di verifica e inviarlo a il server per confermare la proprietà del numero di telefono.

Riferimento: Effective phone number verification