2016-04-30 9 views
2

Ich möchte eine Rich Communication-Nachricht abfangen (bekannt als Chat in einigen Netzwerken wie Vodafone). Ich habe erfolgreich einen SMS-Empfänger mit einem Intent-Filter und Broadcast-Empfänger implementiert, der großartig funktioniert. Wenn die SMS jedoch eine Rich-Communication-Nachricht ist, wird der Empfänger nie angerufen.Wie kann ich eine reiche Kommunikation Nachricht auf Android abfangen

In meinem Manifest:

<receiver 
    android:name=".IncomingSMS" 
    android:enabled="true" 
    android:exported="true"> 
    <intent-filter android:priority="999"> 
     <action android:name="android.provider.Telephony.SMS_RECEIVED"/> 
    </intent-filter> 
</receiver> 

und meine Rundfunkempfänger sieht wie folgt aus:

public class IncomingSMS extends WakefulBroadcastReceiver 
{ 
    @Override 
    public void onReceive(Context context, Intent intent) 
    { 
     // Retrieves a map of extended data from the intent. 
     final Bundle bundle = intent.getExtras(); 

     if (bundle != null) 
     { 
      final Object[] pdusObj = (Object[]) bundle.get("pdus"); 

      SmsMessage currentMessage; 
      if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) 
      { 
       String format = bundle.getString("format"); 
       currentMessage = SmsMessage.createFromPdu((byte[]) pdusObj[0], format); 

      } 
      else 
      { 
       //noinspection deprecation 
       currentMessage = SmsMessage.createFromPdu((byte[]) pdusObj[0]); 
      } 

      String number = currentMessage.getDisplayOriginatingAddress(); 

      Intent serviceintent = new Intent(context, ChargingMonitorService.class); 
      serviceintent.putExtra(NUMBER, number); 
      startWakefulService(context, serviceintent); 

     } // bundle is null 
    } 
} 

Das alles funktioniert perfekt, außer wenn die Textnachricht eine Rich Communication (oder Chat) Nachricht die OnReceive() wird nie aufgerufen.

Da ist nichts in der Android-Dokumentation, also nehme ich an, dass es eine herstellerspezifische Absicht sein wird, aber was ist das?

+0

RCS hat wirklich nichts mit SMS zu tun, also wird Ihr Receiver niemals für diese feuern. Es gibt mehrere Open-Source-RCS-Implementierungen für Android, die Sie sich ansehen können, aber es ist viel mehr involviert als einfache Textnachrichten zu verarbeiten. –

+0

Obwohl RCS unterscheidet sich von SMS in derselben Standard-Messaging-App auf Samsung-Handys auf Vodafone behandelt. Ich weiß es nicht, aber ich gehe davon aus, dass es kein Samsung-Feature ist. Sie können sehen, einige Nachrichten haben "SMS" in der Blase und einige haben "Chat". Da in den Android-Entwicklerdokumenten nichts enthalten ist, vermute ich, dass es sich um eine herstellerspezifische Absicht handelt, die wahrscheinlich nur auf bestimmten Geräten funktioniert, aber ich würde trotzdem gerne wissen, was sie sind. Ich bin nur daran interessiert, die Absenderdetails zu erkennen, so dass ich nicht den komplizierteren Code benötige, der benötigt wird, um die Nachricht vollständig zu interpretieren. –

Antwort

1

Nach ein bisschen Reverse Engineering habe ich herausgefunden und für Samsung-Geräte zu beantworten. Ich sah mir das Manifest der Nachrichten App auf einem gerooteten Samsung Gerät an, um die Absichten zu finden. Ich habe dann meinen eigenen Empfänger eingerichtet und die Bundle-Extras für nützliche Daten überprüft.

Im Manifest:

<receiver 
     android:name=".RCSReceiver" 
     android:permission="com.samsung.rcs.permission.RCS_APP_PERMISSION" 
     android:enabled="true" 
     android:exported="true"> 
     <intent-filter> 
      <category android:name="com.samsung.rcs.framework.instantmessaging.category.ACTION"/> 
      <category android:name="com.samsung.rcs.framework.instantmessaging"/> 
      <action android:name="com.samsung.rcs.framework.instantmessaging.action.RECEIVE_CHAT_INVITATION"/> 
      <action android:name="com.samsung.rcs.framework.instantmessaging.action.RECEIVE_PARTICIPANT_INSERTED"/> 
      <action android:name="com.samsung.rcs.framework.instantmessaging.action.RECEIVE_PARTICIPANT_UPDATED"/> 
     </intent-filter> 
    </receiver> 

mit der zusätzlichen Erlaubnis:

<uses-permission android:name="com.samsung.rcs.im.READ_PERMISSION"/> 

und dem Empfänger-Code wie folgt aussieht:

public class RCSReceiver extends BroadcastReceiver 
{ 
    private static final String RECEIVE_CHAT_INVITATION = "com.samsung.rcs.framework.instantmessaging.action.RECEIVE_CHAT_INVITATION"; 
    private static final String RECEIVE_PARTICIPANT_UPDATED = "com.samsung.rcs.framework.instantmessaging.action.RECEIVE_PARTICIPANT_UPDATED"; 
    private static final String RECEIVE_PARTICIPANT_INSERTED = "com.samsung.rcs.framework.instantmessaging.action.RECEIVE_PARTICIPANT_INSERTED"; 
    private Logger log = LoggerFactory.getLogger(MainActivity.class); 

    @Override 
    public void onReceive(Context context, Intent intent) 
    { 
     log.debug("RCS Receiver"); 
     String action = intent.getAction(); 

     Bundle bundle = intent.getExtras(); 
     if(bundle != null) 
     { 
      if (RECEIVE_PARTICIPANT_UPDATED.equals(action) || RECEIVE_PARTICIPANT_INSERTED.equals(action)) 
      { 
       String participant = bundle.getString("participant"); 
       if (participant != null) 
       { 
        String number = participant.substring(4); // get the string after "tel:" 
        log.debug("Chat number is: " + number); 
       } 
      } 
      else if (RECEIVE_CHAT_INVITATION.equals(action)) 
      { 
       String subject = bundle.getString("subject"); 
       if(subject != null) 
       { 
        log.debug("Chat subject: " + subject); 
       } 
      } 
     } 
    } 
} 

In den "Teilnehmern" extra war die Telefonnummer mit dem Präfix "tel:" und der Nachrichtentext war im Betreff-Bündel extra.

Dies funktioniert natürlich nur auf Samsung-Geräten und da es sich nicht um eine veröffentlichte API handelt, können Änderungen ohne Vorankündigung vorgenommen werden. Es ist unbekannt, wie lange es funktionieren wird oder ob es auf allen Versionen von Android auf Samsung funktioniert. Es diente jedoch meinem Zweck, die Nummer eines eingehenden Chats abzufangen.

Die vollständige Liste der Aktionen ist unten jedoch nur die beiden oben gezeigten hatte etwas Nützliches in den Bundle Extras. Die zusätzlichen Daten für die anderen Absichten waren in Parcels und würden beim Reverse Engineering viel mehr Aufwand erfordern.

<action android:name="com.samsung.rcs.framework.instantmessaging.action.RECEIVE_TYPING_NOTIFICATION"/> 
    <action android:name="com.samsung.rcs.framework.instantmessaging.action.RECEIVE_CHAT_CLOSED"/> 
    <action android:name="com.samsung.rcs.framework.instantmessaging.action.RECEIVE_NEW_MESSAGE"/> 
    <action android:name="com.samsung.rcs.framework.instantmessaging.action.DELETE_MESSAGES_RESPONSE"/> 
    <action android:name="com.samsung.rcs.framework.instantmessaging.action.DELETE_CHATS_RESPONSE"/> 
    <action android:name="com.samsung.rcs.framework.instantmessaging.action.RECEIVE_CHAT_INVITATION"/> 
    <action android:name="com.samsung.rcs.framework.instantmessaging.action.SEND_MESSAGE_RESPONSE"/> 
    <action android:name="com.samsung.rcs.framework.instantmessaging.action.RECEIVE_MESSAGE_NOTIFICATION_STATUS"/> 
    <action android:name="com.samsung.rcs.framework.instantmessaging.action.RECEIVE_SEND_MESSAGE_RESPONSE"/> 
    <action android:name="com.samsung.rcs.framework.instantmessaging.action.ADD_PARTICIPANTS_RESPONSE"/> 
    <action android:name="com.samsung.rcs.framework.instantmessaging.action.RECEIVE_MESSAGE_INSERTED"/> 
    <action android:name="com.samsung.rcs.framework.instantmessaging.action.RECEIVE_PARTICIPANT_INSERTED"/> 
    <action android:name="com.samsung.rcs.framework.instantmessaging.action.RECEIVE_PARTICIPANT_UPDATED"/> 
    <action android:name="com.samsung.rcs.framework.instantmessaging.action.GET_IS_COMPOSING_ACTIVE_URIS_RESPONSE"/>