在android中自动读取OTP / SMS

时间:2017-08-04 17:11:09

标签: android manifest android-broadcastreceiver

我正在开发一个Android应用程序,其中服务器发送OTP并且用户需要在应用程序中输入此OTP,以登录我的应用程序。我想要的是,我的应用程序应该能够自动读取服务器发送的OTP。我怎样才能做到这一点?在这方面的任何帮助或指导将受到高度赞赏。

谢谢..!提前

3 个答案:

答案 0 :(得分:1)

您有3个选项可以自动阅读OTP短信:

<强> 1。使用短信权限读取所有传入的短信:

http://androidbymaitri.blogspot.in/2016/08/read-sms-automatically-to-verify-otp.html

不再建议,因为这需要用户明确授予SMS权限。

<强> 2。在Google Play服务中使用SMS Retriever API:

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

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

通知。但这需要在OTP SMS格式中进行一些服务器级别的更改。这仅适用于安装了Play服务的设备。

第3。在SmsManager类中使用createAppSpecificSmsToken(仅限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,截至目前。

答案 1 :(得分:0)

使用SmsVerifyCatcher

  • manifest中,添加这些权限

    <uses-permission android:name="android.permission.RECEIVE_SMS" />
    <uses-permission android:name="android.permission.READ_SMS" />
    
  • build.gradle中(应用程序gradle)

    implementation 'com.github.stfalcon:smsverifycatcher:0.3.2'
    
  • 在onCreate活动中初始化SmsVerifyCatcher

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

    enter image description here

答案 2 :(得分:0)

Google Play 不再允许RECIEVE_SMS permission,除非您的应用是默认短信处理程序,除非。

因此,到目前为止,一种可行的解决方案是使用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);
}