3

特定のポートで SMS を受信するアプリを実装したい。

マニフェスト コード:

<receiver android:name=".BinarySMSReceiver"> 
    <intent-filter> 
        <action android:name="android.intent.action.DATA_SMS_RECEIVED"/>
        <data android:port="8091"/>
        <data android:scheme="sms"/> 
    </intent-filter> 
</receiver>

以下のレシーバークラスコード。

public class BinarySMSReceiver extends BroadcastReceiver
{
    @Override
    public void onReceive(Context context, Intent intent)
    {
        Bundle bundle = intent.getExtras();        
        SmsMessage[] msgs = null;

        if(null != bundle)
        {
            String info = "Binary SMS from ";
            Object[] pdus = (Object[]) bundle.get("pdus");
            msgs = new SmsMessage[pdus.length];
            byte[] data = null;

            for (int i=0; i<msgs.length; i++){
                msgs[i] = SmsMessage.createFromPdu((byte[])pdus[i]);                
                info += msgs[i].getOriginatingAddress();                     
                info += "\n*****BINARY MESSAGE*****\n";

                data = msgs[i].getUserData();

                for(int index=0; index<data.length; ++index)
                {
                    info += Character.toString((char)data[index]);
                }
            }

            Toast.makeText(context, info, Toast.LENGTH_SHORT).show();
        }
    }
}

8091この ( ) ポート上にあるかどうかに関係なく、すべての SMS を受信して​​います。ポート固有のメッセージのみを受信したい。

4

2 に答える 2

11

アプリがポート 8091 だけでなく、他のポートに送信されたデータ SMS を受信する理由をまだ疑問に思っている人のために。問題はマニフェスト コードにあります。投稿された多くの解決策を見てきましたが、それらのほとんどは実際には間違っています。

マニフェストは次のようにする必要があります。

<receiver
    android:name = ".SmsReceiver">
    <intent-filter>
        <action android:name="android.intent.action.DATA_SMS_RECEIVED" />
        <data 
            android:scheme="sms"
            android:host="*"
            android:port="8095" />
        </intent-filter>
</receiver>

スキーム、ホスト、およびポート属性は、個別の「データ」要素ではなく、インテント フィルターの 1 つの「データ」要素でのみ定義する必要があります。

また、このリンクからではなく、「データ テスト」セクションの下に、
「ホストとポートが一緒になって URI 権限を構成します。ホストが指定されていない場合、ポートは無視されます。」
そのため、特定のポートでのみデータ SMS をアプリに受信させたい場合は、ホストを指定する必要があることに注意してください。

「ホスト」要素は * (アスタリスク) で、すべてのホスト/電話番号からのデータ SMS を受け入れることを指定します。

これが誰かに役立つことを願っています(:

于 2013-06-12T03:51:31.493 に答える
2

同様の問題が発生しました。「onReceive」コードの先頭に次のチェック条件を追加するだけです。

String dataStr = intent.getDataString();
if (dataStr.indexOf(":8888" ) == -1) {
    return;
}
于 2012-07-16T13:37:20.507 に答える