enviar y recibir sms para verificar el número de móvil

Estoy tratando de hacer la verificación de números móviles sin necesidad de utilizar terceros. Para esto mi lógica es esta: –

  • El usuario introduce su número de móvil con el código del país
  • Cuando hacen clic en el botón de verificación, una intención enviará un sms al número de teléfono móvil definido por el usuario con una identificación única aleatoria
  • después de que la transmisión de la aplicación esperará 2 minutos y cuando recibe sms a continuación, el usuario puede iniciar sesión o registrarse

¿Es esta lógica correcta o necesita alguna modificación?

Para enviar sms estoy usando este código, pero no sé cómo puedo recibir y validar el número.

String phoneNumber = "9999999999"; String smsBody = "Message from the API"; // Get the default instance of SmsManager SmsManager smsManager = SmsManager.getDefault(); // Send a text based SMS smsManager.sendTextMessage(phoneNumber, null, smsBody, null, null); 

ACTUALIZAR:-

No recibe mensajes en el dispositivo samsung.

esto requiere android.permission.INTERACT_ACROSS_USERS_FULL

Primero genera un número aleatorio dentro del rango de 10000 a 99999.

  Random rNo = new Random(); final int code = rNo.nextInt((99999 - 10000) + 1) + 10000; 

A continuación muestro una ventana emergente mencionando al usuario que se enviará un mensaje desde el móvil para verificar el número. Esto se hace usando AlertDialog .

 final AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); builder.setTitle("Verify Phone Number"); builder.setMessage("An sms will be sent to the number " + phNo + " for verification. Charges will apply as per your plan"); builder.setPositiveButton("OK", new DialogInterface.OnClickListener() { @Override public void onClick(final DialogInterface dialog, int which) { //code to send sms here with the code value final ProgressDialog progressdialog = ProgressDialog.show(getActivity(), "Waiting for SMS", "Please hold on"); final CountDownTimer timer = new CountDownTimer(120000, 1000) { @Override public void onTick(long millisUntilFinished) { Log.v("ranjapp", "Ticking " + millisUntilFinished / 1000); progressdialog.setMessage("Waiting for the message " + millisUntilFinished / 1000); } @Override public void onFinish() { getActivity().unregisterReceiver(receiver); progressdialog.dismiss(); } }.start(); receiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { Bundle bundle = intent.getExtras(); if (bundle != null) { if (readSMS(intent, code)) { Log.v("ranjapp", "SMS read"); timer.cancel(); try { getActivity().unregisterReceiver(receiver); } catch (Exception e) { } } } } }; getActivity().registerReceiver(receiver, new IntentFilter("android.provider.Telephony.SMS_RECEIVED")); } } ); builder.setNegativeButton("CANCEL", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); } } ); builder.show(); 

Explicación del código anterior:

Después de que el usuario reconozca que envía sms, se envía un sms con el código al número introducido y este número debe ser el que el usuario usa. Así que vamos a esperar un sms con el código, para recibir los sms y leer su contenido vamos a crear un BroadCastReceiver para escuchar sms entrantes.

Ahora también tenemos que iniciar un temporizador para que esperemos sólo 2 minutos para el sms, por lo que iniciar un CountDownTimer durante 2 minutos al final de 2 minutos el countdowntimer se anulará el registro del receptor. El receptor no se registra incluso si el código se recibe en los SMS entrantes para que podamos liberar los recursos.

Código para leerSMS, si el código se encuentra true se devuelve más false se devuelve,

 boolean readSMS(Intent intent, int code) { try { Bundle bundle = intent.getExtras(); if (bundle != null) { Object[] pdusObj = (Object[]) bundle.get("pdus"); for (int i = 0; i < pdusObj.length; i++) { SmsMessage currentMessage = SmsMessage.createFromPdu((byte[]) pdusObj[i]); String phoneNumber = currentMessage.getDisplayOriginatingAddress(); String senderNum = phoneNumber; String message = currentMessage.getDisplayMessageBody(); if (message.contains(String.valueOf(code))) return true; } } } catch (Exception e) { Log.v("ranjapp", "Exception here " + e.toString()); return false; } return false; } 

Para enviar el uso de SMS debajo del método:

 public static void sendSMS(Context context, String incomingNumber, String sms) { DateTimeFormatter dtfOut = DateTimeFormat.forPattern("YYYY-MM-dd HH:MM:SS"); SmsManager smsManager = SmsManager.getDefault(); //send sms try { ArrayList<String> parts = smsManager.divideMessage(sms); smsManager.sendMultipartTextMessage(incomingNumber, null, parts, null, null); RecContDBHelper recContDBHelper = new RecContDBHelper(context); recContDBHelper.insertRecord(new ContactData("", incomingNumber, dtfOut.print(MutableDateTime.now()))); Log.v("ranjith", "Sms to be sent is " + sms); } catch (Exception e) { Log.v("ranjith", e + ""); } } 

En AndroidManifest.xml necesita tener estos permisos:

 <uses-permission android:name="android.permission.RECEIVE_SMS" /> <uses-permission android:name="android.permission.READ_SMS" /> <uses-permission android:name="android.permission.SEND_SMS" /> 

¡Puede utilizar un proveedor de contenido para acceder a la bandeja de entrada de sms!

  ContentResolver contentResolver =getContentResolver(); Uri uri = Uri.parse("content://sms/inbox"); //query here 
  • cómo comprobar la cadena es un código de color hexadecimal válido en android
  • Android, org.simpleframework.xml Existencia de persistencia, Elemento 'foo' ya se utiliza
  • No se puede resolver nada.
  • List <Object> O RealmList <RealmObject> en Realm Android
  • Eliminar todo después de una parte de una cadena
  • Información sobre la clase Movie para Android
  • OAuth: App Id o redirect_uri no coincide con el código de autorización
  • ¿El sistema android incluye JVM?
  • Dibujar complejo dibujable en api inferior a 23
  • JDK 7 cambia la salida de keytool
  • Para cada uno dentro de un para cada - Java
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.