標籤:
用過Android系統手機的朋友們相比都知道,AndroidOS的簡訊和iOS一樣,是以會話模式展現的,這種展現方式很容易讓使用者尋找以前的聊天記錄。
關於用代碼刪除簡訊,其實刪除的也是對話,無論是最近的,還是以前的,統統都會一併刪除。
下面來看那代碼。
首先需要得到得到簡訊目錄。
view plain
- ContentResolver cr;
- cr = getContentResolver();
再有就是要遍曆下所有簡訊。
view plain
- String SMS_READ_COLUMN = "read";
- String WHERE_CONDITION = SMS_READ_COLUMN + " = 0";
- String SORT_ORDER = "date DESC";
- int count = 0;
- Cursor cursor = cr.query(Uri.parse("content://sms/inbox"),
- new String[] { "_id", "thread_id", "address", "person", "date",
- "body" }, WHERE_CONDITION, null, SORT_ORDER);
- if (cursor != null) {
- try {
- count = cursor.getCount();
- if (count > 0) {
- cursor.moveToFirst();
- threadId = cursor.getLong(1);
- }
- } finally {
- cursor.close();
- }
- }
"content://sms/inbox"就是簡訊的所在路徑,inbox,收件匣。
上述代碼可以得到最新的一條簡訊。
我們需要調用一下這個方法,我們可以把這個方法。
view plain
- long id = getThreadId();
- Uri mUri = Uri.parse("content://sms/conversations/" + id);
這樣就可以得到最新一跳簡訊的所對應的id了。
最後刪除就可以了。
view plain
- cr.delete(mUri, null, null);
別忘了在Manifest.xml中加入許可權。
view plain
- <uses-permission android:name="android.permission.WRITE_SMS" />
- <uses-permission android:name="android.permission.READ_SMS" />
另外要強調的是,如果想要得到最新的收件匣資訊,一定要重新獲得id;這裡的id永遠是0,但是如果直接把id用0代替,那麼刪除的就不是最新的了。
如果想刪除其他簡訊,只需要在遍曆的時候加上條件,讓返回的id是條件所對應的會話id就可以了,
還有一點要特彆強調,這個方法只能刪除未讀的簡訊對話,因為他的搜尋條件是inbox,當然就是收件匣了;如果讀取了簡訊了,那麼Android系統就應該認定該資訊不屬於收件匣了。
簡訊資訊即時擷取
我們知道,只需通過代碼就可以讀到收件匣中的簡訊,寄件匣中的簡訊;但是卻沒辦法在簡訊發來的瞬間擷取;如果我們在簡訊發來的一瞬間能得到相應的資訊內容,那麼我們就可以依次來展開很多應用了——也就是通過簡訊去遠程操作一部手機。
如果想即時擷取,就需要調用receiver了,寫一個監聽類,這樣我們就可以即時擷取短息資訊了。
預覽圖:
還是來看看代碼吧。
首先,我們需要建立一個監聽類SMSBroadcastReceiver,讓他去繼承BroadcastReceiver。
再來初始化一個常量ACTION,並賦簡訊相關參數值。
view plain
- android.provider.Telephony.SMS_RECEIVED
接著建立onReceive方法。
然後用getAction去監聽手機簡訊相關動態,利用StringBuffer來儲存簡訊資訊。
再然後主要代碼了。
view plain
- @Override
- public void onReceive(Context context, Intent intent) {
- if (intent.getAction().equals(ACTION)) {
- StringBuffer SMSAddress = new StringBuffer();
- StringBuffer SMSContent = new StringBuffer();
- Bundle bundle = intent.getExtras();
- if (bundle != null) {
- Object[] pdusObjects = (Object[]) bundle.get("pdus");
- SmsMessage[] messages = new SmsMessage[pdusObjects.length];
- for (int i = 0; i < pdusObjects.length; i++) {
- messages[i] = SmsMessage
- .createFromPdu((byte[]) pdusObjects[i]);
- }
- for (SmsMessage message : messages) {
- SMSAddress.append(message.getDisplayOriginatingAddress());
- SMSContent.append(message.getDisplayMessageBody());
- }
- }
- }
- }
代碼中的SMSAddress為傳送簡訊的號碼,SMSContent為簡訊內容。
要想看到是否成功擷取,最簡單的方法就是把這兩個參數列印出來。
view plain
- System.out.println("發送號碼:" + SMSAddress + "\n" + "簡訊內容:"
- + SMSContent);
不過要把他們加入for迴圈中,因為當新資訊發來時,SMSAddress和SMSContent將被替換。
因此如果要是做應用時,也是在for迴圈中判斷的。
最後要記得在Manifest.xml中註冊監聽器。
view plain
- <receiver android:name="cn.etzmico.SMSBroadcastReceiver">
- <intent-filter>
- <action android:name="android.provider.Telephony.SMS_RECEIVED"></action>
- </intent-filter>
- </receiver>
同時要加上許可權。
view plain
- <uses-permission android:name="android.permission.RECEIVE_SMS"></uses-permission>
這樣,我們運行程式後,只要有簡訊接收,SMSAddress和SMSContent就會被賦值。
這裡順便補充一個知識點,關於Eclipse程式的。
相信很多初學者不知道,Eclipse內建一個發簡訊外掛程式,可以實現給虛擬機器傳送簡訊。這樣,我們在做簡訊應用的時候,就不用同時啟動多台虛擬機器了……
如何操作呢?方法如下。
1.點擊功能表列中的 Window 視窗。
2.找到哦啊其中的 Show View 目錄。
3. 選擇 Other...。
然後我們發現會彈出一個視窗。
4,為了便於操作,我們在彈出的視窗的搜尋欄中,直接輸入 Emulator Control。
5.點擊列表中的 Emulator Control,再點OK;或者直接雙擊。
這樣就出現了一個視窗,其中有很多參數。
其他的以後有機會再做介紹,我們這次至用到其中4個。
,我們只需要輸入對應的參數,選擇需要的類型,最後點發送就可以了。
PS:有的人奇怪為什麼灰色,沒法輸入,沒法選擇,那是因為你沒有選中模擬器。這個外掛程式只能同時給一個模擬器發送訊息。關於模擬器的選擇,和調用Emulator Control的方法差不多,區別只是在輸入Emulator Control的時候輸入 Devices 就可以了。你當前選中哪個模擬器了,就會給哪個模擬器發送訊息,不需要輸入模擬器號碼。
簡訊即時刪除
首先,在Activity類中聲明 ContentResolver,且在onCreate中定義。
view plain
- static ContentResolver cr;
- cr = getContentResolver();
其次,Android的短息接收機制中,是先監聽到,然後存入收件匣以及在Notification中提示,系統監聽到簡訊後不會立刻存入收件匣和提示,因此在刪除時要特別注意。
view plain
- new Timer().schedule(new TimerTask() {
- @Override
- public void run() {
- <span style="white-space:pre"> </span>//刪除簡訊代碼
- }
- }, 5000);
我們可以做一個這樣的延時器,因為接收簡訊觸發簡訊接收類中 onReceive 方法時,收件匣裡並沒有資訊呢,即使把優先順序降到最低也無濟於事。
因此我們把刪除簡訊的方法做一個延時操作就可以了,根據本人測試,5秒為妙,因為很多機器會因為各種原因而早成系統運行慢……如果再長,機器更卡,那就再把事件增加一些就可以了……這裡的5000為5000毫秒,即5秒。
還有,我們為了避免簡訊刪除,我們可以做if判斷,給刪除簡訊方法添加條件。
view plain
- StringBuffer SMSAddress.append(message.getDisplayOriginatingAddress()); // 寄件者電話號碼
- StringBuffer SMSContent.append(message.getDisplayMessageBody()); // 簡訊內容
這樣,就不會造成簡訊的誤刪了。
最後再提示下Manifest.xml中的許可權問題,一共3個。
view plain
- <uses-permission android:name="android.permission.RECEIVE_SMS" />
- <uses-permission android:name="android.permission.WRITE_SMS" />
- <uses-permission android:name="android.permission.READ_SMS" />
-
http://blog.csdn.net/wop_niaoren19870227/article/details/7077765
簡訊(會話)刪除(轉)