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