Android 从SMS读取otp并设置为编辑文本无效

Android 从SMS读取otp并设置为编辑文本无效,android,android-broadcastreceiver,one-time-password,Android,Android Broadcastreceiver,One Time Password,在我的应用程序中,我试图从短信中读取otp,而无需在我的应用程序中键入。 但它不起作用我找不到错误我正在尝试更正错误超过一周请帮助我找出错误的位置,我创建了一个类来读取传入消息,并将值传递到我的OTPActivity页面,但空值到达那里 IncomingSms.java public class IncomingSms extends BroadcastReceiver { // Get the object of SmsManager final SmsManager sms

在我的应用程序中,我试图从短信中读取otp,而无需在我的应用程序中键入。 但它不起作用我找不到错误我正在尝试更正错误超过一周请帮助我找出错误的位置,我创建了一个类来读取传入消息,并将值传递到我的OTPActivity页面,但空值到达那里

IncomingSms.java

public class IncomingSms extends BroadcastReceiver {

    // Get the object of SmsManager
    final SmsManager sms = SmsManager.getDefault();

    public void onReceive(Context context, Intent intent) {

        // Retrieves a map of extended data from the intent.
        final Bundle bundle = intent.getExtras();

        try {

            if (bundle != null) {

                final 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().replaceAll("\\D", "");

                        //message = message.substring(0, message.length()-1);
                        Log.i("SmsReceiver", "senderNum: " + senderNum + "; message: " + message);

                        Intent myIntent = new Intent("otp");
                        myIntent.putExtra("message", message);
                        myIntent.putExtra("number", senderNum);
                        LocalBroadcastManager.getInstance(context).sendBroadcast(myIntent);
                        // Show Alert


                }

            } // bundle is null

        } catch (Exception e) {
            Log.e("SmsReceiver", "Exception smsReceiver" + e);

        }
    }
}
显示

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.mypkg.appanme">
     <uses-permission android:name="android.permission.WRITE_SMS" />
        <uses-permission android:name="android.permission.READ_SMS" />
        <uses-permission android:name="android.permission.RECEIVE_SMS" />
        <uses-permission android:name="android.permission.READ_PHONE_STATE" />
        <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
     <receiver android:name=".IncomingSms">
                <intent-filter>
                    <action android:name="android.provider.Telephony.SMS_RECEIVED" />
                </intent-filter>
            </receiver>

您需要将接收SMS所需的
android:permission=“android.permission.BROADCAST_SMS”
添加到
android manifest.xml
中的接收器块。大概是这样的:

<receiver
    android:name=".IncomingSms"
    android:permission="android.permission.BROADCAST_SMS">
  <intent-filter>
    <action android:name="android.provider.Telephony.SMS_RECEIVED" />
  </intent-filter>
</receiver>
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();
        }
    }
}

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

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

<receiver
    android:name=".IncomingSms"
    android:permission="android.permission.BROADCAST_SMS">
  <intent-filter>
    <action android:name="android.provider.Telephony.SMS_RECEIVED" />
  </intent-filter>
</receiver>
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();
        }
    }
}

我在com.gameloft.android.HEP.GloftM5HP/.iab.SmsReceiver需要android.permission.RECEIVE\u SMS由于发送者com.android.phone(uid 1001)日志显示,您在哪里设置了权限?是这样的吗?在此之后是