【问题标题】:Auto fetch otp kotlin implmentation for sms reading自动获取 otp kotlin 实现以进行短信阅读
【发布时间】:2018-09-05 11:22:04
【问题描述】:

朋友们, 我正在处理Kotlin 并尝试在编辑文本中获取收到的SMS。我不知道如何实现它。如果有人有正确的Kotlin 代码来获取OTP 请在下面发布但是我刚刚实现如下并堆叠在实现中所以请在Kotlin 代码下面发布如果有人有它

class SmsReceiver: BroadcastReceiver() {

    private val mListener: SmsListener? = null
    var b: Boolean? = null
    var abcd: String? = null
    var xyz:String? = null

    @Suppress("DEPRECATION")
    override fun onReceive(context: Context?, intent: Intent?) {
        //val bundle = intent!!.getExtras()
        val data = intent!!.extras
        val pdus = data.get("pdus") as Array<Any>


    }
}

下面是活动

public class OtpActivity extends Activity
{
    EditText ed;
    TextView tv;
    String otp_generated,contactNo,id1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.otp);
        ed=(EditText)findViewById(R.id.otp_et);
        tv=(TextView) findViewById(R.id.verify_otp);

        SmsReceiver.bin(new SmsListener() {
            @Override
            public void messageReceived(String messageText) {
                ed.setText(messageText);
            }
        });

    }
}

【问题讨论】:

    标签: android kotlin broadcastreceiver sms smsmanager


    【解决方案1】:

    这可以通过 RxJava 完成:

    public static Observable<String> createMessageMonitor(@NonNull final Context context) {
            IntentFilter intentFilter = new IntentFilter();
            intentFilter.addAction("android.provider.Telephony.SMS_RECEIVED");
            return fromIntentFilter(context, intentFilter)
                    .filter(intent -> intent != null && intent.getExtras() != null)
                    .map(intent -> {
                        Bundle bundle = intent.getExtras();
                        Object[] pdu_Objects = (Object[]) bundle.get("pdus");
                        if (pdu_Objects != null) {
                            for (Object aObject : pdu_Objects) {
                                final SmsMessage currentSMS = getIncomingMessage(aObject, bundle);
                                final String senderNumber = currentSMS.getDisplayOriginatingAddress();
                                final String message = currentSMS.getDisplayMessageBody().trim();
                                Matcher matcher = OTP_PATTERN.matcher(message);
                                if (matcher.matches()) {
                                    return matcher.group(1);
                                }
                            }
                        }
                        return "";
                    }).filter(message -> !message.isEmpty());
    
        }
    

    您的 OTP_PATTERN:

    private static Pattern OTP_PATTERN = Pattern.compile("^(\\d{4}) is the OTP for your App.$");
    

    然后订阅流:

    RxBroadcastReceivers2.createMessageMonitor(this)
                    .subscribeWith(this,
                            onNext = { /*Your OTP is here*/ },
                            onError = {
                                Timber.e(it, "Registration permission request failed")
                            }
                    )
    

    注意:在使用createMessageMonitor方法之前,您需要先获取Manifest.permission.READ_SMS

    【讨论】:

      【解决方案2】:

      如果不想写receiver,可以使用简单的轻量级库https://github.com/VitaliBov/SmsInterceptor

      该库与 Kotlin 100% 兼容

      你只需要重写接口方法,创建一个Interceptor类并与生命周期绑定即可。它看起来像这样:

      public class AuthActivity extends AppCompatActivity implements OnMessageListener {
          private SmsInterceptor smsInterceptor;
          private EditText etAuthPassword;
      
          @Override
          protected void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
              setContentView(R.layout.activity_auth);
              initViews();
              initSmsInterceptor();
          }
      
          @Override
          protected void onResume() {
              super.onResume();
              smsInterceptor.register();
          }
      
          @Override
          protected void onPause() {
              super.onPause();
              smsInterceptor.unregister();
          }
      
          @Override
          public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
              super.onRequestPermissionsResult(requestCode, permissions, grantResults);
              smsInterceptor.onRequestPermissionsResult(requestCode, permissions, grantResults);
          }
      
          @Override
          public void messageReceived(String message) {
              // You can perform your validation here
              etAuthPassword.setText(message);
          }
      
          private void initViews() {
              etAuthPassword = findViewById(R.id.etAuthPassword);
              etAuthPassword.addTextChangedListener(new SmsTextWatcher() {
                  @Override
                  public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
                      if (charSequence.length() == 4) {
                          btnAuthPassword.setEnabled(true);
                          checkCode();
                      } else {
                          btnAuthPassword.setEnabled(false);
                      }
                  }
              });
          }
      
          private void initSmsInterceptor() {
              smsInterceptor = new SmsInterceptor(this, this);
              // Not necessary
              smsInterceptor.setRegex(SMS_CODE_REGEX);
              smsInterceptor.setPhoneNumber(PHONE_NUMBER);
          }
      
          private void checkCode() {
              // Validation
              if (isValid) {
                  navigateToMainScreen();
              }
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-28
        • 2016-06-19
        • 1970-01-01
        • 2013-04-17
        • 2018-11-20
        • 1970-01-01
        相关资源
        最近更新 更多