Android上的文本/数据短信(发送/接受/拦截)

1) 发送文本短信:极简单:
<uses-permissionandroid:name="android.permission.SEND_SMS" /

SmsManager smsMgr = SmsManager.getDefault();
Intent sentIntent = newIntent("com.myself.action.SMS_SEND_RESULT");
PendingIntent dummySentEvent =PendingIntent.getBroadcast(MyActivity.this, 0, sentIntent,0);
Intent deliveryIntent = newIntent("com.myself.action.SMS_DELIVERY_RESULT");
PendingIntent dummyDeliveryEvent =PendingIntent.getBroadcast(MyActivity.this, 0, deliveryIntent,0);
try {
 
  smsMgr.sendTextMessage(telNumStr, null, SmsTextStr,dummySentEvent,dummyDeliveryEvent);
} catch (Exception e) {
  Log.e("SmsSending", "SendException", e);
}

2) 发送数据短信:
<uses-permissionandroid:name="android.permission.SEND_SMS" /

SmsManager smsMgr = SmsManager.getDefault();
Intent sentIntent = newIntent("com.myself.action.SMS_SEND_RESULT");
PendingIntent dummySentEvent =PendingIntent.getBroadcast(MyActivity.this, 0, sentIntent,0);
Intent deliveryIntent = newIntent("com.myself.action.SMS_DELIVERY_RESULT");
PendingIntent dummyDeliveryEvent =PendingIntent.getBroadcast(MyActivity.this, 0, deliveryIntent,0);
int port=51234;
byte[]  sms_data = myString.getBytes();
try {
    smsMgr.sendDataMessage (telNumStr, null, port,sms_data,dummySentEvent, dummyDeliveryEvent);
} catch (Exception e) {
  Log.e("SmsSending", "SendException", e);
}

3) 接收文本短信:需要通过BroadcastReceiver接收:
<uses-permissionandroid:name="android.permission.RECEIVE_SMS"/>
< receiver android:name="MessageDemo">
    < intent-filter>
        < action android:name="android.provider.Telephony.SMS_RECEIVED"/>
    </ intent-filter>
</ receiver>

public classMessageDemo extendsBroadcastReceiver {
    private static final String strACT= "android.provider.Telephony.SMS_RECEIVED";
   @Override
   public void onReceive(Contextcontext, Intent intent) {
     if(intent.getAction().equals(strACT)) {
        StringBuilder sb = newStringBuilder();
        Bundle bundle = intent.getExtras();
        if (bundle !=null) {
           Object[] pdus = (Object[]) bundle.get("pdus");
           SmsMessage[] msg = newSmsMessage[pdus.length];
           for (int i = 0; i <pdus.length; i++) {
                 msg[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);
           }
           for (SmsMessage currMsg: msg) {
                  sb.append("From:");
                  sb.append(currMsg.getDisplayOriginatingAddress());
                  sb.append("\nMessage:");
                  sb.append(currMsg.getDisplayMessageBody());
           }
       } // end of !bundle
    } // end of action match
   Toast.makeText(context, sb.toString(),Toast.LENGTH_LONG).show();
   //
最后必须将控制权交还给上一个Activity,不然程序会出错:
    Intent intent = new Intent(context,MyLastActivity.class);
   
intent .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
   context.startActivity(i);

}

4) 接收数据短信:需要通过BroadcastReceiver接收:
<uses-permissionandroid:name="android.permission.RECEIVE_SMS"/>
< receiver android:name="MessageDemo">
    < intent-filter>
     <action android:name="android.intent.action.DATA_SMS_RECEIVED"/>
     <data android:scheme="sms" />
     <data android:host="localhost"/>
     <data android:port="51234"/>

  </ intent-filter>
</ receiver>

Receiver与文本短信类似,只是把 getDisplayMessageBody()改成 getUserData().


5)短信拦截:根据Android的特点,无法做到在短信放入短信数据库前拦截掉,目前只能监视短信数据库发生变化时进行过滤,此时可能已经给用户发出提醒了。
  public class ScreenTest extends Activity 
       class SmsContent extends ContentObserver{
            private Cursor cursor null;
            public SmsContent(Handler handler) {
                      super(handler);
            }
           
             @Override public void onChange(boolean selfChange) {
                      super.onChange(selfChange);
                      //读取收件箱中指定号码的短信
                      cursor managedQuery(Uri.parse("content://sms/inbox"),
                                              new String[]{"_id", "address", "read"},
                                              address=? and read=?",
                                              new String[]{"12345678901", "0"},
                                              "date desc");
                      if (cursor != null){
                            ContentValues values new ContentValues();
                            values.put("read", "1");        //修改短信为已读模式
                           cursor.moveToFirst();
                           while (cursor.isLast()) {
                                 //更新当前未读短信状态为已读
                               getContentResolver().update(
                                           Uri.parse("content://sms/inbox"),
                                           values,
                                            _id=?", new String[]{""+cursor.getInt(0)}
                                );
                                 cursor.moveToNext();
                           }
                  }
             }
      }

       
    @Override
   public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        SmsContent content new SmsContent(new Handler());
        //注册短信变化监听
        this.getContentResolver().registerContentObserver(Uri.parse("content://sms/"), true, content);
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值