2016-04-30 63 views
2

我想攔截Rich Communication消息(在沃達豐等網絡上稱爲「聊天」)。我已經成功地實現了一個使用意圖過濾器和廣播接收器的短信接收器,這非常棒。但是,如果SMS是豐富的通信消息,則接收方將永遠不會被呼叫。如何在Android上攔截豐富的通信消息

在我的清單:

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

和我的廣播接收器看起來是這樣的:

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

這一切能夠完美除非這個短信是一個富通信(或聊天)消息的onReceive ()永遠不會被調用。

Android文檔中沒有任何內容,所以我假設它將成爲供應商特定的意圖,但它是什麼?

+0

RCS確實與SMS沒有任何關係,所以您的Receiver永遠不會爲這些問題而着火。 Android有幾種開源的RCS實現可供您查看,但涉及的內容比處理簡單的文本消息要複雜得多。 –

+0

雖然RCS與SMS不同,但它在沃達豐的三星手機上的相同默認消息應用程序中處理。我不知道但我假設它不是三星專用功能。你可以看到有些消息在泡泡中有「SMS」,有些則有「聊天」。 Android開發人員文檔中沒有任何內容,因此我懷疑它將成爲供應商特定的意圖,可能只適用於特定設備,但我仍然想知道它們是什麼。我只感興趣的是檢測發件人的詳細信息,所以我不需要更多涉及的代碼來完全解釋郵件。 –

回答

1

經過一些逆向工程,我已經想出了三星設備的答案。我查看了根源三星設備上Messages應用程序的清單,以查找意圖。然後,我設置了我自己的接收器,並檢查了Bundle演員的任何有用的數據。

在清單:

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

與其他權限:

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

和接收器的代碼如下所示:

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

在 「參與者」 額外的是以「tel:」爲前綴的電話號碼,並且消息文本處於附加主題捆綁中。

這當然只適用於三星設備,因爲它沒有發佈的API顯然會隨時更改,恕不另行通知,所以未知它可以工作多長時間,或者它是否適用於三星所有Android版本。但是,它符合我攔截來電聊天的目的。

下面是完整的操作列表,但只有上面顯示的兩個操作在捆綁附加功能中有用。其他意圖的額外數據在Parcels中,並且在逆向工程中需要更多的努力。

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