2011-08-19 15 views
6

Cerco di ottenere il testo di Cell Broadcast messaggio come SMS, ma does'not lavoro:Come ricevere il messaggio Cell Broadcast?

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(); 

Sapete alcun modo per farlo?

+1

Cosa intendi per messaggio di trasmissione cellulare, come una notifica push o ...? – Jakar

+0

@Jakar - [Cell Broadcast] (http://en.wikipedia.org/wiki/Cell_Broadcast) – GrAnd

risposta

7

Ho trascorso anche un po 'di tempo a investigare su questa domanda. E sembra che non ci siano API pubbliche per farlo. Ma posso condividere alcuni risultati della mia ricerca di reverse engineering ...

Il mio Samsung Galaxy S è in grado di ricevere messaggi CB, quindi ho decompilato l'app per SMS e ho esaminato il codice. Essa ha il seguente BroadcastReceiver nel suo file manifesto:

<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> 

Annotare il android.provider.Telephony.CB_RECEIVED intent-filtro. Non ho trovato alcuna documentazione al riguardo, ma dal suo nome ho pensato che fosse l'unica trasmissione che ho bisogno di catturare per ora.

Quindi ho cercato attraverso il codice di apk decompilato e ho scoperto che utilizza l'interfaccia android.provider.Telephony.Sms.Intents->getCbMessagesFromIntent() per accedere ai messaggi di recupero CB, che restituisce l'istanza della classe CbMessage. Questa interfaccia è obsoleta anche per semplici messaggi SMS, quindi ho pensato che CbMessage dovesse funzionare con pdus come SmsMessage. Finalmente ho trovato la classe source of SmsCbMessage che è abbastanza simile a SmsMessage tramite API. Dipende da 5-6 file java Android interni, quindi per semplicità li prendo semplicemente dallo stesso sito e li includo nel mio progetto. Il broadcastReceiver è uguali ai suoi, tranne la classe SmsMessage è sostituito dal SmsCbMessage:

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(); 
     }       
    } 
} 

Dopo aver installato la mia applicazione nel mio telefono SGS con il ricevitore sopra, e consentendo la ricezione di messaggi CB in applicazione telefono SMS, la mia app è stata in grado di mostrare i messaggi CB in brindisi in parallelo con la ricezione tramite l'applicazione SMS standard.

I problemi sono ancora necessari da risolvere:

  • Come abilitare/disabilitare/configure_channels di messaggi CB nella mia richiesta ? L'app SMS utilizza le funzioni getCbSettings()/setCbSettings(), ma non le ho trovate. Quindi temporaneamente ho usato altre app per questo.
  • Come inviare interruzione messaggio CB, quindi altre app non li ricevono? È sembra abortBroadcast() non funziona qui, perché il messaggio di trasmissione non è ordinato (isOrderedBroadcast() restituisce false).
+0

Grazie, ma sfortunatamente non funziona nel mio caso. Hai qualche autorizzazione in manifest? – VVS

+0

Nessuna autorizzazione speciale, solo 'android.permission.RECEIVE_SMS'. Inoltre ho dovuto abilitare la ricezione CB in un'applicazione SMS standard. – GrAnd

+0

HTC Desire non ha impostazioni CB nell'applicazione SMS standard. Può essere abilitato solo dalle impostazioni comuni del telefono. Quindi ... sembra che sia solo per Samsung Galaxy S. Grazie, comunque. – VVS

Problemi correlati