2011-08-19 23 views
6

Trato de texto del mensaje de difusión celular como SMS, pero does'not trabajo:¿Cómo obtener el mensaje de difusión celular?

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

¿Conoce alguna manera de conseguirlo?

+1

¿Qué quiere decir con mensaje de difusión celular, como una notificación de inserción, o ...? – Jakar

+0

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

Respuesta

7

También dediqué un tiempo a la investigación de esta pregunta. Y parece que no hay una API pública para hacer eso. Pero puedo compartir algunos resultados de mi investigación de ingeniería inversa ...

Mi Samsung Galaxy S puede recibir mensajes de CB, así que descompilé la aplicación de SMS y busqué en el código. Tiene la siguiente BroadcastReceiver en su archivo de manifiesto:

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

Nota del android.provider.Telephony.CB_RECEIVED intención de filtro. No encontré ninguna documentación al respecto, pero de su nombre asumí que es la única transmisión que tengo que atrapar por ahora.

Luego busqué a través del código de la aplicación descompilada y encontré que usa la interfaz android.provider.Telephony.Sms.Intents->getCbMessagesFromIntent() para acceder a recuperar mensajes CB, que devuelve CbMessage instancia de clase. Esta interfaz está desactualizada incluso para mensajes SMS simples, por lo que supuse que CbMessage debería funcionar con pdus como SmsMessage. Finalmente encontré la clase source of SmsCbMessage que es bastante similar a SmsMessage por API. Depende de 5-6 archivos Java internos de Android, así que por simplicidad simplemente los tomé del mismo sitio y los incluí en mi proyecto. El broadcastReceiver es el mismo que el suyo, excepto la clase SmsMessage se sustituye por 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(); 
     }       
    } 
} 

Después de instalar mi aplicación en mi teléfono SGS con el receptor arriba, y que permite la recepción de mensajes de difusión en la aplicación de teléfono SMS, mi aplicación fue capaz de mostrar mensajes CB en tostadas en paralelo con recibirlas mediante la aplicación de SMS estándar. Todavía se necesitan

Las cuestiones a resolver:

  • Cómo activar/desactivar/configure_channels de mensajes informativos en mi solicitud ? La aplicación de SMS usa las funciones getCbSettings()/setCbSettings(), pero no las encontré. Así que temporalmente usé otra aplicación para eso.
  • Cómo abortar la transmisión de mensajes CB, por lo que otras aplicaciones no los reciben? Es parece que abortBroadcast() no funciona aquí, porque el mensaje de difusión no está ordenado (isOrderedBroadcast() devuelve false).
+0

Gracias, pero desafortunadamente no funciona en mi caso. ¿Tienes algún permiso en manifiesto? – VVS

+0

Sin permisos especiales, solo 'android.permission.RECEIVE_SMS'. También tuve que habilitar la recepción de CB en la aplicación de SMS estándar. – GrAnd

+0

HTC Desire no tiene configuraciones de CB en la aplicación de SMS estándar. Se puede habilitar solo desde la configuración común del teléfono. Entonces ... parece que es solo para Samsung Galaxy S. Gracias, de todos modos. – VVS

Cuestiones relacionadas