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

来源:互联网 发布:陀地驱魔人 知乎 编辑:程序博客网 时间:2024/04/28 10:44
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);
           
}
           

            
@Overridepublic 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/"), truecontent);
   
}
}
原创粉丝点击