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.
Cosa vuoi dire che è "non è sicuro"? – Tushar
Non so come funziona WhatsApp, e forse anche altri qui non lo sanno. Forse potresti indicarci? –
In realtà, nella mia esperienza WhatsApp * * invia una verifica SMS per la creazione dell'account. – kabuko