2011-08-19 153 views
6

我試圖讓小區廣播消息就像短信的文本,但它does'not工作:如何獲取小區廣播消息?

public class SMSReceiver extends BroadcastReceiver { 

@Override 
public void onReceive(Context context, Intent intent) { 
    Bundle bundle = intent.getExtras(); 
    SmsMessage[] msgs = null; 
    String str = ""; 
    if (bundle != null) { 
     // ---retrieve the SMS message received--- 
     Object[] pdus = (Object[]) bundle.get("pdus"); 
     msgs = new SmsMessage[pdus.length]; 
     for (int i = 0; i < msgs.length; i++) { 
      msgs[i] = SmsMessage.createFromPdu((byte[]) pdus[i]); 
      str =msgs[i].getOriginatingAddress(); 
      str += " :"; 
      str += msgs[i].getMessageBody().toString(); 

你知道任何方式得到它?

+1

你是什麼意思的小區廣播消息,如推送通知,或...? – Jakar

+0

@Jakar - [小區廣播](http://en.wikipedia.org/wiki/Cell_Broadcast) – GrAnd

回答

7

我也花了一些時間對這個問題進行調查。而且似乎沒有公開的API來做到這一點。但我可以分享我的逆向工程研究的一些結果...

我的三星Galaxy S能夠接收CB消息,所以我反編譯短信應用程序,並查看代碼。它在其清單文件中的以下BroadcastReceiver

<receiver android:name=".transaction.PrivilegedSmsReceiver"> 
     ... 
     <intent-filter> 
      <action android:name="android.provider.Telephony.CB_RECEIVED" /> 
     </intent-filter> 
     <intent-filter> 
      <action android:name="android.provider.Telephony.CB_SETTINGS_AVAILABLE" /> 
     </intent-filter> 
     <intent-filter> 
      <action android:name="android.provider.Telephony.SET_CB_ERR_RECEIVED" /> 
     </intent-filter> 
     <intent-filter> 
      <action android:name="android.provider.Telephony.GET_CB_ERR_RECEIVED" /> 
     </intent-filter> 
    </receiver> 

注意android.provider.Telephony.CB_RECEIVED意圖過濾器。我沒有找到任何關於它的文檔,但是從它的名字我認爲這是我現在需要捕捉的唯一一個廣播。

然後我通過反編譯apk的代碼進行搜索,發現它使用android.provider.Telephony.Sms.Intents->getCbMessagesFromIntent()接口訪問檢索CB消息,它返回CbMessage類實例。即使對於簡單的SMS消息,該接口也是過時的,所以我認爲CbMessage應該與pdus一起使用,因爲SmsMessage可以。最後我發現了source of SmsCbMessage這個類,它與API的SmsMessage非常相似。它取決於5-6內部的Android Java文件,所以爲了簡單起見,我只是從同一個網站抓取它們並將它們包含到我的項目中。 的broadcastReceiver是你的一樣,除了類SmsMessageSmsCbMessage取代:

public class CbReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     //---get the CB message passed in--- 
     Bundle bundle = intent.getExtras();   
     SmsCbMessage[] msgs = null; 
     String str = "";    
     if (bundle != null) { 
      //---retrieve the SMS message received--- 
      Object[] pdus = (Object[]) bundle.get("pdus"); 
      msgs = new SmsCbMessage[pdus.length];    
      for (int i=0; i<msgs.length; i++) { 
       msgs[i] = SmsCbMessage.createFromPdu((byte[])pdus[i]);     
       str += "CB lang " + msgs[i].getLanguageCode();      
       str += " :"; 
       str += msgs[i].getMessageBody().toString(); 
       str += "\n";   
      } 
      //---display the new CB message--- 
      abortBroadcast(); 
      Toast.makeText(context, str, Toast.LENGTH_SHORT).show(); 
     }       
    } 
} 

安裝我的申請,我的SGS電話與所述接收器的上方,並且使在電話SMS應用程序接收的CB消息後,我的應用程序是能夠通過標準的SMS應用程序並行顯示CB信息。仍然需要

的問題需要解決:

  • 如何啓用/禁用我的 申請CB消息/ configure_channels?短信應用使用getCbSettings()/setCbSettings()功能, ,但我沒有找到它們。所以暫時我使用了其他應用程序。
  • 如何 中止CB消息廣播,所以其他應用程序不會收到它們?它 似乎abortBroadcast()在這裏不起作用,因爲廣播 消息沒有排序(isOrderedBroadcast()返回false)。
+0

謝謝,但不幸的是它不適用於我的情況。你有清單中的任何權限? – VVS

+0

沒有特殊的權限,只有'android.permission.RECEIVE_SMS'。此外,我必須在標準SMS應用程序中啓用CB接收。 – GrAnd

+0

HTC Desire在標準短信應用程序中沒有CB設置。它只能從普通電話設置啓用。所以......看起來就像是三星Galaxy S一樣。謝謝你。 – VVS