2011-01-31 25 views
2

私のアプリケーションでは、特定の電話番号からSMSを受信することはできますが、システム通知は不要ですが、他のすべてのメッセージはデフォルトのSMSアプリケーションに渡され、 ?Android:特定の電話番号からSMSを受信

もしそうなら、受信するメッセージを選択するためにどのプロセスが最初にキューに入っているかをシステムはどのように知ることができますか?

答えて

3

私はこれを試しませんでしたが、理論的にはそれが動作するはずです:

ordered broadcastとしてSMSブロードキャストが送信されます。つまり、受信者は順番に処理され、ブロードキャストを取り消すことができます。 SMSDispatcher.java、行420を参照してください。

最初に呼び出されるためには、受信者の優先順位が高くなければなりません。

<intent-filter android:priority="1000" > 
    . . . 
</intent-filter> 

ブロードキャストコールをキャンセルするにはbroadcastReceiver.setResultCode(RESULT_CANCELED)。そうすればSMS放送はキャンセルされ、システムSMSアプリ(およびSMS通知機能)によって表示されなくなります。

更新:

またbroadcastReceiver.setResultCode(Intents.RESULT_SMS_HANDLED)を使用してみてください。

アップデート2:

user672601が、これは実際に動作することを別の答えで述べたが、彼は放送受信機の内部でabortBroadcast()を使用しました。

+0

broadcastReveiverを明示的にキャンセルしない限り(またはハンドリングされたとしてフラグを立てていない限り)、キュー上の次のリスナーに送信されます?それが私の必要なものです。試してみる前にあなたの答えを受け入れるほどの肯定的な音です。 :) – Johan

+0

はい、注文された放送をキャンセルすることができます。このリンクはそれについて説明します:http://developer.android.com/reference/android/content/BroadcastReceiver.html –

+0

Peter Knego、それは動作しましたか?それが働いたら私に知らせてください.... – Farhan

0

私はアンドロイドが私たちにイベントを聴くだけの放送リスナを与えてくれると思っています。すべてのメッセージを読んで番号を確認する必要があります。それ以外の操作をしないでください。デフォルトのメッセージングアプリケーションは自動的にそれを処理します....

1

Peter Knegoの答えは正しいです。私はこの正確なことをしようとしていて、彼の解決策を試してみました。それ以外は実際に私が使用した以外は動作します:

this.abortBroadcast(); 

inside the broadcastReceiver。

1
public class NotifyServiceReceiver extends BroadcastReceiver{ 
static final String ACTION ="android.provider.Telephony.SMS_RECEIVED"; 
@Override 
public void onReceive(Context arg0, Intent arg1) { 
    // TODO Auto-generated method stub 
    if(arg1.getAction().equalsIgnoreCase(ACTION)) 
    { 
    Bundle extras = arg1.getExtras(); 

    String strMessage = "private message"; 
    if (extras != null) 
    { 
     Object[] smsextras = (Object[]) extras.get("pdus"); 

     for (int i = 0; i < smsextras.length; i++) 
     { 
      SmsMessage smsmsg = SmsMessage.createFromPdu((byte[])smsextras[i]); 

      String strMsgBody = smsmsg.getMessageBody().toString(); 
      String strMsgSrc = smsmsg.getOriginatingAddress(); 

      //Toast.makeText(GasService.this,strMessage, Toast.LENGTH_SHORT).show(); 
      if(strMsgSrc.equals("+919XXXXXXXXX")) 
      { 
      strMessage += "SMS from " + strMsgSrc + " : " + strMsgBody;    
      Toast.makeText(PrivatesmsService.this,strMessage, Toast.LENGTH_SHORT).show(); 

      abortBroadcast(); 
      } 

     } 

    } 
    } 

} 
} 

あなたがSMSを受信史上ときに、アプリケーションがアクセスするように、マニフェストファイル内とabortBroadcastを(呼び出して、その後、100以上に活動の優先順位を設定することにより、システムに伝えることができます)、それは意志smsが受信トレイに到達するのを防ぎ、BroadcastReceiverがSMSを受信するように設定しているアプリケーションを避けてください

+0

save my day :) +1 – Simmant

関連する問題