【问题标题】:multiple SMS broadcastreceiver edittext多条短信广播接收编辑文本
【发布时间】:2016-03-21 07:41:44
【问题描述】:

通过 BroadcastReceiver 收到消息后,我将自动更新一个包含 6 个数字的编辑文本框,这些数字包含在 SMS 中。 我第一次可以成功,但我希望第二次重复使用代码,但找不到这样做的方法。

public class SMSReceiver extends BroadcastReceiver {
private static EditText editTextInputNumber;
@Override
public void onReceive(Context context, Intent intent) {
        if (intent.getAction().equals(
                "android.provider.Telephony.SMS_RECEIVED")) {
            StringBuilder sms = new StringBuilder();    
            Bundle bundle = intent.getExtras();        

            if (bundle != null) {
                Object[] pdusObj = (Object[])  bundle.get("pdus");
                SmsMessage[] messages = new SmsMessage[pdusObj.length];
                for (int i = 0; i < pdusObj.length; i++) {
                    messages[i] =
                            SmsMessage.createFromPdu((byte[]) pdusObj[i]);
                }

                for (SmsMessage smsMessage : messages) {
                    sms.append(smsMessage.getMessageBody());
                }

                sms.toString(); 
                String smsBody = sms.toString();
                Pattern pattern = Pattern.compile("\\d{6}");
                Matcher matcher = pattern.matcher(smsBody);
                String authNumber = null;

                if (matcher.find()) {
                    authNumber = matcher.group(0);
                }

                if (authNumber != null) {
                Activity_create.inputAuthNumber(authNumber);

我希望在打开其他活动时使用上述内容并更改另一个编辑文本 ex)Activity_findaccount.inputAuthNumber(authNumber);

            }
        }
    }
}

INSIDE Activity_Create 我正在做:

...
sendBroadcast(new Intent("android.provider.Telephony.SMS_RECEIVED"));
...
public static void inputAuthNumber(String authNumber) {
    if (authNumber != null) {
        et_dialog_access.setText(authNumber);
    }
}

INSIDE Activity_findaccount 我也想用不同的编辑文本做同样的事情:

...
sendBroadcast(new Intent("android.provider.Telephony.SMS_RECEIVED"));
...
public static void inputAuthNumber(String authNumber) {
    if (authNumber != null) {
        et_find_access.setText(authNumber);
    }
}

更新:答案:请参阅下面来自 MIKEM 的评论。和检查的答案

为什么取消注册很重要 = 防止泄露。

何时注册/取消注册请点击此链接: When to unregister BroadcastReceiver? In onPause(), onDestroy(), or onStop()?

我的最终编码使用这个。而不是getActivity。如果你在课堂活动中

public class Fragment_findaccount1 extends Fragment{

BroadcastReceiver smsReceiver;
...
@Override
public void onPause(){
    super.onPause();
    getActivity().unregisterReceiver(smsReceiver);
}
...
private void SMS_Receive() {
    IntentFilter intentFilter = new IntentFilter();
    intentFilter.addAction("android.provider.Telephony.SMS_RECEIVED");
    smsReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            StringBuilder sms = new StringBuilder();
            Bundle bundle = intent.getExtras();
            if (bundle != null) {
                Object[] pdusObj = (Object[]) bundle.get("pdus");
                SmsMessage[] messages = new SmsMessage[pdusObj.length];
                for (int i = 0; i < pdusObj.length; i++) {
                    messages[i] = SmsMessage.createFromPdu((byte[]) pdusObj[i]);
                }
                for (SmsMessage smsMessage : messages) {
                    sms.append(smsMessage.getMessageBody());
                }
                sms.toString();
                String smsBody = sms.toString();
                Pattern pattern = Pattern.compile("\\d{6}");
                Matcher matcher = pattern.matcher(smsBody);
                String authNumber = null;
                if (matcher.find()) {
                    authNumber = matcher.group(0);
                }
                if (authNumber != null) {
                    inputAuthNumber(authNumber);
                }
            }
        }
    };
    getActivity().registerReceiver(smsReceiver, intentFilter);
}

private void inputAuthNumber(String authNumber) {
    if (authNumber != null) {
        et_cert.setText(authNumber);
        progressbar.setVisibility(View.INVISIBLE);
    }
}

【问题讨论】:

    标签: android android-edittext broadcastreceiver sms


    【解决方案1】:

    如果你想在不同的活动中使用它,你需要在活动中声明你的广播接收器。 `

    private void registerOTPReceiver() {
        intentFilter = new IntentFilter();
        intentFilter.addAction("android.provider.Telephony.SMS_RECEIVED");
        mOtpReceiver = new BroadcastReceiver(){
            @Override
            public void onReceive(Context context, Intent intent) {
                // Your Code goes here
                updateOtpText(matcher.group(0));
            }
        }
    };
    this.registerReceiver(mOtpReceiver, intentFilter);
    
    private void updateOtpText(String otp){
        // Set the message text to wherever you want
        mOtpEditText.setText(otp);
    }
    
    @Override
    protected void onDestroy() {
        super.onDestroy();
        this.unregisterReceiver(mOtpReceiver);
    }
    

    `

    【讨论】:

    • 谢谢。我会看看这个。
    • 是否需要包含这部分:this.unregisterReceiver(mOtpReceiver);即使我像这样在 registerOTPReceiver() 中声明 mOtpReceiver:Broadcast mOtpReceiver = new BroadcastReceiver() {...} //第三行 registerOTPReceiver()
    • 如果是,你能告诉我为什么吗?
    • 澄清我的想法:我认为接收器将在 void 函数结束时完成,因此不需要注销。
    • 你是对的,它会随着活动的销毁而自动完成,并且没有必要取消注册。
    猜你喜欢
    • 2022-01-08
    • 2011-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-14
    • 1970-01-01
    相关资源
    最近更新 更多