Welcome

首页 / 移动开发 / Android / Android中监听短信的两种方法

1、监听广播
缺点,因为优先级的原因可能接收不到。
代码:
public static final String TAG = "ImiChatSMSReceiver";public static final String SMS_RECEIVED_ACTION = "android.provider.Telephony.SMS_RECEIVED";public void onReceive(Context context, Intent intent){if (intent.getAction().equals(SMS_RECEIVED_ACTION)){SmsMessage[] messages = getMessagesFromIntent(intent);for (SmsMessage message : messages){String text = message.getOriginatingAddress() + " : " +message.getDisplayOriginatingAddress() + " : " +message.getDisplayMessageBody() + " : " +message.getTimestampMillis();String num = message.getOriginatingAddress();Log.i(TAG, "-------------" + text);Toast.makeText(context, text, Toast.LENGTH_LONG).show();sendMessage(num, "来自" + num + "的短信已经收到", context);context.getContentResolver().registerContentObserver(Uri.parse("content://sms/"), true, new SmsObserver(new Handler(), context));}}}public void sendMessage(String num, String text, Context context){SmsManager smsManager = SmsManager.getDefault();PendingIntent sentIntent = PendingIntent.getBroadcast(context, 0, new Intent(), 0);String strContent = text;smsManager.sendTextMessage(num, null, strContent, sentIntent, null);TelephonyManager tl = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);int itype = tl.getPhoneType();Log.i(TAG, "-------------" + "当前卡类型为:" + itype);if (itype == TelephonyManager.PHONE_TYPE_GSM){Toast.makeText(context, "当前卡类型为:GSM", Toast.LENGTH_LONG).show();}else if (itype == TelephonyManager.PHONE_TYPE_CDMA){Toast.makeText(context, "当前卡类型为 : CDMA", Toast.LENGTH_LONG).show();}else if (itype == TelephonyManager.PHONE_TYPE_NONE){Toast.makeText(context, "当前卡类型为:NONE", Toast.LENGTH_LONG).show();}}public final SmsMessage[] getMessagesFromIntent(Intent intent){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];msgs[i] = SmsMessage.createFromPdu(pdus[i]);}return msgs;}



2、采用观察方法,监听短信数据库
public class SmsObserver extends ContentObserver{private Context mContext;public SmsObserver(Handler handler , Context context){super(handler);mContext = context;}public void onChange(boolean selfChange) { super.onChange(selfChange); Cursor cursor =null; try{//读取收件箱中的短信 cursor = mContext.getContentResolver().query(Uri.parse("content://sms/inbox"), null, null, null, "date desc"); String body;boolean hasDone =false;if (cursor !=null){ while (cursor.moveToNext()){body = cursor.getString(cursor.getColumnIndex("body"));if(body !=null)//&& body.equals("【startMyActivity】"{hasDone =true;break;}if (hasDone){break;}} } }catch(Exception e){e.printStackTrace();}finally{if(cursor!=null)cursor.close();}}}


用到的权限:
<uses-permission android:name="android.permission.SEND_SMS" /><uses-permission android:name="android.permission.RECEIVE_SMS" /><uses-permission android:name="android.permission.READ_SMS" />