-1

After receiving a message through BroadcastReceiver I am auto-updating an edittext box with 6 numbers that are contained in the SMS. I can successfully do it for the first time but I wish to re-use the code for the second time but cannot find a way to do so.

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

I wish to use the above and change another edittext when some other activity is opened ex)Activity_findaccount.inputAuthNumber(authNumber);

            }
        }
    }
}

INSIDE Activity_Create I am doing:

...
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 I also want to do the same with a different edittext:

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

UPDATE:ANSWER: SEE COMMENTS BELOW FROM MIKEM. and the checked answer

Why unregistering is important = prevents leaking.

When to register/unregister follow this link: When to unregister BroadcastReceiver? In onPause(), onDestroy(), or onStop()?

My final coding Use this. instead of getActivity. if youre in class Activity

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);
    }
}
Community
  • 1
  • 1
Jisu Hong
  • 724
  • 1
  • 7
  • 22

1 Answers1

1

You need to declare your broadcast receiver in the Activity if you want to use it in different activities. `

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

`

Deepak Sharma
  • 417
  • 3
  • 9
  • Thank You. I will take a look at this. – Jisu Hong Mar 22 '16 at 00:59
  • Do I need to include this part: this.unregisterReceiver(mOtpReceiver); even when I declare mOtpReceiver inside registerOTPReceiver() like this: Broadcast mOtpReceiver = new BroadcastReceiver() {...} //third line of registerOTPReceiver() – Jisu Hong Mar 22 '16 at 01:12
  • If yes, could you tell me why? – Jisu Hong Mar 22 '16 at 01:12
  • To clarify what I was thinking: I was thinking that the receiver would finish as the void function ends so unregistering would be unnecessary. – Jisu Hong Mar 22 '16 at 01:36
  • You are right it would automatically finish as the activity destroys and it is not necessary to unregister it. – Deepak Sharma Mar 22 '16 at 06:35
  • http://stackoverflow.com/questions/36215432/iterating-in-a-fragment could you help me? – Jisu Hong Mar 25 '16 at 07:04