如何在android中阅读新短信的内容?

时间:2017-03-15 08:19:11

标签: android

我是Android开发的新手。我需要从SMS读取OTP代码。我搜索了很多,许多人建议使用广播接收器。但没有人提供准确的工作代码。

3 个答案:

答案 0 :(得分:2)

经过多次尝试,我找到了一个简单的解决方案。在活动本身内部使用BroadcastReceiver。希望这也有助于其他人。

首先在OnCreate / onResume方法中注册广播接收器。

public class SignUpActivity extends Activity {
EditText txtOTP;

private BroadcastReceiver receiver;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_signup);

    txtOTP = (EditText) this.findViewById(R.id.txtOTP);

    IntentFilter intentFilter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED");
    receiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            Bundle bundle = intent.getExtras();
            Object[] pdusObj = (Object[]) bundle.get("pdus");

            String otp = "";
            for (int i = 0; i < pdusObj.length; i++) {

                SmsMessage currentMessage = SmsMessage.createFromPdu((byte[]) pdusObj[i]);
                //After getting SMS content user your own logic to retrieve OTP.
                String message = currentMessage.getDisplayMessageBody();
                if (!message.equals("") && message.contains("is your one time password")) {
                    otp = message.substring(0, 5);
                }
            }
            txtOTP.setText(otp);
        }

    };
    registerReceiver(receiver,intentFilter);

}

@Override
protected void onDestroy() {
    super.onDestroy();
    unregisterReceiver(receiver);
}

}

这里要从SMS检索OTP,您可以使用自己的逻辑。在我的情况下,前5个字符是我的otp。所以我使用了substring

也不要忘记在onDestroy()方法中取消注册。

答案 1 :(得分:0)

首先,您需要使用BroadcastReceiver来收听新的短信。

<receiver android:name=".receiver.SMSBroadcastReceiver">
    <intent-filter android:priority="1000">
         <action android:name="android.provider.Telephony.SMS_RECEIVED"/>
    </intent-filter>
</receiver>

然后,在您的BroadcastReceiver中,您可以从意图中获取所有信息。

public class SMSBroadcastReceiver extends BroadcastReceiver {
    @Override 
    public void onReceive(Context context, Intent intent) {

        Object[] pdus = (Object[]) intent.getExtras().get("pdus");

        for (Object p : pdus){
            byte[] sms = (byte[]) p;

            SmsMessage message = SmsMessage.createFromPdu(sms);

            String content = message.getMessageBody();//message content
            String number = message.getOriginatingAddress();
        }
    }
}

答案 2 :(得分:-1)

首先,您创建一个接收器类并在manifest.xml中注册它,然后每当收到新的sms时,onReceive都会被调用。根据您的要求检查短信格式,并用otp分割。然后将拆分值传递给您的活动方法。如果您有任何疑问,请随时提出。

package com.test.Helper;

    import android.content.BroadcastReceiver;
    import android.content.Context;
    import android.content.Intent;
    import android.os.Build;
    import android.provider.Telephony;
    import android.support.v4.content.LocalBroadcastManager;
    import android.telephony.SmsMessage;
    import android.util.Log;


    /**
     * Created by user on 29/2/16.
     */
    public class SmsListener extends BroadcastReceiver {

        private LoginActivity login;

        @Override
        public void  onReceive(Context context, Intent intent) {

            if (Telephony.Sms.Intents.SMS_RECEIVED_ACTION.equals(intent.getAction())) {
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
                    for (SmsMessage smsMessage : Telephony.Sms.Intents.getMessagesFromIntent(intent)) {
                        String  messageBody = smsMessage.getMessageBody();
                          try{
                        if(messageBody.contains("OTP")){
                            String[] tokens = messageBody.split("[:]+");
                            String code =tokens[0].trim();
                            login.instance.automatic_confirmotp(code); //your actvity method
                        }else {
                            Log.d(Constants.TAG, String.valueOf(messageBody));}
                        }catch (Exception e){

                         }
                    }
                }
            }
        }

    }

并在 manifest.xml

中注册 SmsListene r
<receiver android:name=".Activity.Helper.SmsListener">
            <intent-filter android:priority="2147483647">
                <action android:name="android.provider.Telephony.SMS_RECEIVED" />
            </intent-filter>
        </receiver>