Автоматическое чтение OTP/SMS в Android

Я работаю над приложением для Android, в котором сервер отправляет OTP, и пользователю необходимо ввести этот OTP в приложении, чтобы зарегистрироваться для моего приложения. Я хочу, чтобы мое приложение могло автоматически читать OTP, отправленный сервером. Как я могу этого добиться? Любая помощь или руководство в этом отношении будут высоко оценены.

Спасибо..! Заблаговременно


person Dinesh    schedule 04.08.2017    source источник
comment
Как я могу этого добиться? -- поговорите с сопровождающими сервера и спросите их. Они единственные, кто знает, как их сервер отправляет OTP, подходит ли вам автоматическое чтение OTP, отправленного сервером, и т. д.   -  person CommonsWare    schedule 04.08.2017


Ответы (3)


Использование библиотеки SmsVerifyCatcher

  • В manifest добавьте эти разрешения

    <uses-permission android:name="android.permission.RECEIVE_SMS" />
    <uses-permission android:name="android.permission.READ_SMS" />
    
  • В build.gradle (градация приложения)

    implementation 'com.github.stfalcon:smsverifycatcher:0.3.2'
    
  • Инициализировать SmsVerifyCatcher в действии onCreate

    smsVerifyCatcher = new SmsVerifyCatcher(getActivity(), new OnSmsCatchListener<String>() {
        @Override
        public void onSmsCatch(String message) {
            String code = parseCode(message);//Parse verification code
            Log.d("Agilanbu OTP", code);
            Toast.makeText(getActivity(), "Agilanbu OTP: " + code, Toast.LENGTH_LONG).show();
            et_otp.setText(code);//set code in edit text
        }
    });
    
  • В жизненном цикле деятельности

    @Override
    protected void onStart() {
        super.onStart();
        smsVerifyCatcher.onStart();
    }
    
    @Override
    protected void onStop() {
        super.onStop();
        smsVerifyCatcher.onStop();
    }
    
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        smsVerifyCatcher.onRequestPermissionsResult(requestCode, permissions, grantResults);
    }
    
  • Разобрать сообщение

    private String parseCode(String message) {
     Pattern p = Pattern.compile("\\b\\d{6}\\b");
     Matcher m = p.matcher(message);
     String code = "";
      while (m.find()) {
          code = m.group(0);
      }
     return code;
    }
    

    введите здесь описание изображения

person Agilanbu    schedule 29.11.2018

Google Play больше не разрешает RECIEVE_SMS permission до тех пор, пока ваше приложение не станет обработчиком SMS по умолчанию.

Таким образом, одним из возможных решений на данный момент является использование SMS_RETRIEVE_API.

вам понадобится BroadcastReceiver и задача, которая делает SmsRetriever.getClient(context).startSmsRetriever();

В вашем ресивере:

if(SmsRetriever.SMS_RETRIEVED_ACTION.equals(intent.getAction())) {
   Bundle extras = intent.getExtras();
   Status status = (Status) extras.get(SmsRetriever.EXTRA_STATUS);
   final String message = (String) extras.get(SmsRetriever.EXTRA_SMS_MESSAGE);
}
person Gaudam Thiyagarajan    schedule 31.01.2019

У вас есть 3 варианта автоматического чтения OTP SMS:

<сильный>1. Прочитайте все входящие SMS, используя разрешение SMS:

https://androidwave.com/automatic-sms-verification-android/ http://androidbymaitri.blogspot.in/2016/08/read-sms-automatically-to-verify-otp.html

Больше не рекомендуется, так как для этого требуется, чтобы пользователь явно предоставил разрешение на SMS.

<сильный>2. Использование SMS Retriever API в сервисах Google Play:

https://developers.google.com/identity/sms-retriever/overview

https://www.youtube.com/watch?v=jzWYv8y2v1c

Советовал. Но для этого требуются некоторые изменения на уровне сервера в формате OTP SMS. И это работает только на устройствах с установленными сервисами Play.

<сильный>3. Использование createAppSpecificSmsToken в классе SmsManager (только для Android O):

https://developer.android.com/reference/android/telephony/SmsManager.html#createAppSpecificSmsToken(android.app.PendingIntent

https://code.tutsplus.com/tutorials/android-o-phone-number-verification-with-sms-token--cms-29141

Не рекомендуется, потому что на данный момент это работает только в Android O.

person Bob    schedule 04.08.2017