2025-05-23

寫一個短信監聽程序,大傢很容易想到的就是註冊一個廣播接收器,來接收系統收到短信時候的廣播。可是這個廣播是有序廣播,就是當別的程序先獲取到瞭這個廣播再傳遞給你,當然它也可以幹掉這個廣播,讓你接收不到,這樣你的程序肯定是接收不到這個廣播的瞭。網上有很多這樣的例子,什麼提高廣播接收器的優先級又是1000又是10000的。。

大傢可以看看這個廣播的基本介紹:http://wenku.baidu.com/view/226f9dd5b14e852458fb57ba.html

這裡提到瞭把intent-filter中的android:priority的值設置為1000,但是在實時中你設置1000一樣是接受不到廣播的,除非你把手機中的其他接受瞭這個廣播的短信卸載,比如360 GO短信,飛信神馬的。他們的優先級總是要比你的高。你可以繼續BAIDU,有的人會設置它為10000 9999等等,你會發現設置為10000的時候偶爾可以接收到,僅僅是偶爾。那腫麼辦呢。

我下面用的方法不是去接收系統廣播,而是去監聽短信數據庫的變化,當收到短信數據庫變化瞭的時候,去取得最新的那條短信即可。或者你想別的什麼操作也可以。

監聽類SmsReceiver.java

[java]
package com.pei.broadcastReceiver; 
 
import java.util.List; 
 
import com.pei.fixed.AllFinalInfo; 
import com.pei.info.SmsInfo; 
import com.pei.util.SmsContent; 
 
import android.app.Activity; 
import android.database.ContentObserver; 
import android.net.Uri; 
import android.os.Handler; 
 
/**
 * class name:SmsReceiver<BR>
 * class description:數據庫改變監聽類<BR>
 * PS:當數據改變的時候,執行裡面才change方法<BR>
 * Date:2012-3-16<BR>
 * 
 * @version 1.00
 * @author CODYY)peijiangping
 */ 
public class SmsReceiver extends ContentObserver { 
    /**
     * Activity對象
     */ 
    private Activity activity; 
    private List<SmsInfo> infos; 
 
    public SmsReceiver(Handler handler, Activity activity) { 
        super(handler); 
        this.activity = activity; 
    } 
 
    @Override 
    public void onChange(boolean selfChange) { 
        Uri uri = Uri.parse(AllFinalInfo.SMS_URI_INBOX);// 設置一個uri來查看各種類別短信內容 
        SmsContent smscontent = new SmsContent(activity, uri); 
        infos = smscontent.getSmsInfo(); 
        System.out.println(infos.get(1).getSmsbody()); 
        super.onChange(selfChange); 
    } 

怎麼註冊這個監聽呢,隻需:

[java]
ContentObserver co = new SmsReceiver(new Handler(), 
                AndroidUtilActivity.this); 
        this.getContentResolver().registerContentObserver( 
                Uri.parse("content://sms/"), true, co); 

SmsContent.java內容請參考上篇/kf/201203/123797.html博客。AllFinalInfo.SMS_URI_INBOX也請參考上篇博客。

摘自 裴裴的Android學習和分享

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *