Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/201.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 自动获取otp kotlin以实现sms读取_Android_Kotlin_Broadcastreceiver_Sms_Smsmanager - Fatal编程技术网

Android 自动获取otp kotlin以实现sms读取

Android 自动获取otp kotlin以实现sms读取,android,kotlin,broadcastreceiver,sms,smsmanager,Android,Kotlin,Broadcastreceiver,Sms,Smsmanager,朋友们, 我正在处理Kotlin并试图在编辑文本中获取收到的SMS。我不知道如何实现它。如果任何人有正确的Kotlin代码来获取OTP请在下面发布,但是我刚刚按照下面的方式实现并在实现中堆叠,因此如果任何人有Kotlin代码,请在下面发布 class SmsReceiver: BroadcastReceiver() { private val mListener: SmsListener? = null var b: Boolean? = null var abcd:

朋友们, 我正在处理
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>


    }
}

这可以通过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());

    }
然后订阅流:

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

注意:在使用
createMessageMonitor
方法之前,您需要获得
清单.权限。阅读\u SMS

如果您不想编写接收器,可以使用简单的轻量级库

该库与Kotlin具有100%的兼容性

您只需要重写接口方法,创建一个拦截器类并将其与生命周期绑定。看起来是这样的:

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();
        }
    }
}
RxBroadcastReceivers2.createMessageMonitor(this)
                .subscribeWith(this,
                        onNext = { /*Your OTP is here*/ },
                        onError = {
                            Timber.e(it, "Registration permission request failed")
                        }
                )
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();
        }
    }
}