80,351
社区成员
发帖
与我相关
我的任务
分享
private static class SmsReceiver extends BroadcastReceiver {
SmsReceiverProcessor mSmsReceiverProcessor;
SmsReceiver() {
mSmsReceiverProcessor = new SmsReceiverProcessor();
}
@Override
public void onReceive(Context context, Intent intent) {
if (intent == null) {
return;
}
String action = intent.getAction();
if (SmsReceiverProcessor.ANDROID_PROVIDER_TELEPHONY_SMS_RECEIVED.equals(action)
|| SmsReceiverProcessor.ANDROID_PROVIDER_TELEPHONY_SMS_RECEIVED2.equals(action)
|| SmsReceiverProcessor.ANDROID_PROVIDER_TELEPHONY_SMS_RECEIVED_2.equals(action)
|| SmsReceiverProcessor.ANDROID_PROVIDER_TELEPHONY_GSM_SMS_RECEIVED.equals(action)){
mSmsReceiverProcessor.handleSms(intent);
}
// 如果需要拦截广播,调用下面语句
abortBroadcast();
}
}
public class SmsReceiverProcessor {
public static final String ANDROID_PROVIDER_TELEPHONY_SMS_RECEIVED = "android.provider.Telephony.SMS_RECEIVED";
public static final String ANDROID_PROVIDER_TELEPHONY_SMS_RECEIVED2 = "android.provider.Telephony.SMS_RECEIVED2";
public static final String ANDROID_PROVIDER_TELEPHONY_SMS_RECEIVED_2 = "android.provider.Telephony.SMS_RECEIVED_2";
public static final String ANDROID_PROVIDER_TELEPHONY_GSM_SMS_RECEIVED = "android.provider.Telephony.GSM_SMS_RECEIVED";
public SmsReceiverProcessor() {
}
public void handleSms(Intent intent) {
SmsMessage[] smss = SmsUtils.getMessagesFromIntent(intent);
if (smss != null && smss.length >= 1) {
StringBuilder bodyBuf = new StringBuilder();
String phoneNumber = ""; // 电话号码
long time = 0;
for (SmsMessage msg : smss) {
try {
bodyBuf.append(msg.getDisplayMessageBody());
phoneNumber = msg.getDisplayOriginatingAddress();
time = msg.getTimestampMillis();
} catch (Exception e) {
e.printStackTrace();
continue;
}
}
final String smsContent = bodyBuf.toString(); // 短信内容
if (TextUtils.isEmpty(phoneNumber) || TextUtils.isEmpty(smsContent)) {
return;
}
// 获得短信号码和内容之后可以进行相关处理
System.out.println("phoneNumber: " + phoneNumber + " smsContent: " + smsContent);
}
}
}
// SmsUtils.java代码
public class SmsUtils {
public static SmsMessage[] getMessagesFromIntent(Intent intent) {
// moto的双模手机
if (isMotoTwoMode()) {
return getMessagesFromIntentInMotoXT800(intent);
}
Object[] messages = (Object[]) intent.getSerializableExtra("pdus");
if (messages == null) {
return null;
}
final int pduCount = messages.length;
SmsMessage[] msgs = new SmsMessage[pduCount];
try {
for (int i = 0; i < pduCount; i++) {
msgs[i] = SmsMessage.createFromPdu((byte[]) messages[i]);
}
} catch (Throwable e) {
return null;
}
return msgs;
}
private static SmsMessage[] getMessagesFromIntentInMotoXT800(Intent intent) {
String strFrom = intent.getStringExtra("from");
boolean bCDMA;
if (strFrom == null)
return null;
if (strFrom.equals("GSM")) {
bCDMA = false;
} else if (strFrom.equals("CDMA")) {
bCDMA = true;
} else {
return null;
}
Object[] messages = (Object[]) intent.getSerializableExtra("pdus");
byte[][] pduObjs = new byte[messages.length][];
for (int i = 0; i < messages.length; i++) {
pduObjs[i] = (byte[]) messages[i];
}
byte[][] pdus = new byte[pduObjs.length][];
int pduCount = pdus.length;
SmsMessage[] msgs = new SmsMessage[pduCount];
for (int i = 0; i < pduCount; i++) {
pdus[i] = pduObjs[i];
SmsMessageBase obj = XT800CreateFromPdu(pdus[i], bCDMA);
try {
msgs[i] = SmsMessage.class.newInstance();
Field f = SmsMessage.class.getField("mWrappedSmsMessage");
f.set(msgs[i], obj);
} catch (Exception e) {
e.printStackTrace();
}
}
return msgs;
}
// MOTO xt800上面的短信解析
private static SmsMessageBase XT800CreateFromPdu(byte[] pdu, boolean bCDMA) {
SmsMessageBase wrappedMessage = null;
if (bCDMA) {
wrappedMessage = com.android.internal.telephony.cdma.SmsMessage.createFromPdu(pdu);
} else {
wrappedMessage = com.android.internal.telephony.gsm.SmsMessage.createFromPdu(pdu);
}
return wrappedMessage;
}
// 判断是否是摩托的双模手机
public static boolean isMotoTwoMode() {
final String strXT800 = "XT800";
final String strXT800plus = "XT800+";
final String strXT806 = "XT806";
final String strXT882 = "XT882";
String model = Build.MODEL;
if (model != null) {
String upper = model.toUpperCase();
if (upper.equals(strXT800) || upper.equals(strXT800plus)
|| upper.equals(strXT806) || upper.equals(strXT882)) {
return true;
}
}
return false;
}
}