2016-04-30 15 views
2

豊富なコミュニケーションメッセージ(Vodafoneのようないくつかのネットワークでチャットと呼ばれる)を傍受したいと思います。私は首尾よく動作するインテントフィルターとブロードキャストレシーバーを使ってSMSレシーバーを実装しました。しかし、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とはまったく関係がありませんので、受信者は決して着火することはありません。 Android用のオープンソースのRCS実装はいくつかありますが、簡単なテキストメッセージを扱うよりもはるかに複雑です。 –

+0

RCSはSMSとは異なりますが、ボーダフォンのSamsung携帯電話で同じデフォルトのメッセージングアプリで処理されます。私は知らないが、私はそれがサムスンの特徴ではないと仮定している。バブルの中に「SMS」があり、「チャット」があるものもあります。 Androidデベロッパーのドキュメントには何もないので、特定のデバイスでのみ動作するベンダー固有の意図であるとは思われますが、それでも何かを知りたいと思っています。私は、送信者の詳細を検出することだけに興味があるので、メッセージを完全に解釈するために必要な複雑なコードは必要ありません。 –

答えて

1

リバースエンジニアリングの後、私はサムスンのデバイスを理解して答えました。私は、根っこのサムスンのデバイス上のメッセージアプリの目録を見て、そのインテントを見つけました。私は自分自身の受信機をセットアップし、有用なデータがあればバンドル・エクストラを調べました。マニフェストで

<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は予告なしに変更される可能性があるため、どれくらい時間がかかるか、SamsungのすべてのバージョンのAndroidで動作します。しかし、それは着信チャットの数を傍受する目的を果たしました。

アクションの完全なリストは以下の通りですが、上記の2つのバンドルだけがバンドルのエクストラに役立つものを持っていました。他のインテントの余分なデータはパーセルにあり、リバースエンジニアリングではかなりの労力が必要です。

<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"/> 
関連する問題