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
).
Cosa intendi per messaggio di trasmissione cellulare, come una notifica push o ...? – Jakar
@Jakar - [Cell Broadcast] (http://en.wikipedia.org/wiki/Cell_Broadcast) – GrAnd