2011-08-19 97 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