2012-02-07 18 views
3

私のキャリア(私はベネズエラに住んでいます)はいつも私にSMSを送信しています、そのうちのいくつかはうんざりです、私は気にしています、私は本当に市場からSMSアプリをダウンロードしたくありません非常に具体的かつ簡単な何かをしているからです。Android。

基本的な考え方:私は、OSにうまくいくために、SMSの意図をキャプチャするBroadcastReceiverを持っています。私はここで何も処理しません。(私は思うように複雑なルールを作りたいと思っています。 DBや他の非同期タスク(BroadcastReceiverで実行できない)を使用している場合は、SMSを処理するIntentServiceに同じバンドルを送信します。

これは一般的に問題なく動作します。システム通知にSMSがあり、SMSが完全に処理されないようにするには、ブロードキャストを停止できます。IntentService

は問題:

私はサービスにSMSを処理した後、私はSMSを持って気づくようにシステムを望んでいた天気をかを決定するにはどうすればよいですか?

私は強くBroadcastReceiver内部procesingを行うことを避けるためにしたいと思います。 (This has important repercussions to what you can do in an onReceive(Context, Intent) implementation: anything that requires asynchronous operation is not available, because you will need to return from the function to handle the asynchronous operation, but at that point the BroadcastReceiver is no longer active and thus the system is free to kill its process before the asynchronous operation completes.

私はSMSを処理していましたが、私の基準に合致しなかった場合は、SMS Reciveブロードキャストをバンドルに追加して再度確認することができました。しかし、私はこれを動作させることはできません。

コード:

public class SmsReceiver extends BroadcastReceiver 
{ 
    @Override 
    public void onReceive(Context context, Intent intent) 
    { 
     if(!intent.getExtras().getBoolean("previouslyChecked",false)){ 
      this.abortBroadcast(); 
      Intent serviceIntent = new Intent(context, SmsRecievedServices.class); 
      serviceIntent.putExtras(intent); 
      context.startService(serviceIntent); 
     } 
    } 
} 

public class SmsRecievedServices extends IntentService { 

    public SmsRecievedServices() { 
     super("SmsRecievedServices"); 
    } 

    @Override 
    protected void onHandleIntent(Intent intent) { 
     Bundle bundle = intent.getExtras();  
     if(!smsMatchesCriteria(bundle)){ 
      Intent intent2 = new Intent("android.provider.Telephony.SMS_RECEIVED"); 
      bundle.putBoolean("previouslyChecked",true); 
      intent2.putExtras(bundle); 
      sendOrderedBroadcast(intent2,"android.permission.RECEIVE_SMS"); 
     }   
    } 
} 

ブロードキャストレシーバは意図を取得し、放送を中止doesntのが、システムがSMSで拾うのdoesnt。何か案は?

編集(ブランデルさんのコメントに応答して):

私は多分私が余分を追加すると、それを台無しにするという事実について考え、私は次のことを試してみました:

public class SmsReceiver extends BroadcastReceiver 
{ 
    @Override 
    public void onReceive(Context context, Intent intent) 
    {   
     int randomNum = (int)Math.ceil(Math.random()*100); 
     if(randomNum > 20){ 
      this.abortBroadcast(); 
      Intent serviceIntent = new Intent(context, SmsRecievedServices.class); 
      serviceIntent.putExtras(intent); 
      context.startService(serviceIntent); 
     } 
    } 
} 

public class SmsRecievedServices extends IntentService { 

    public SmsRecievedServices() { 
     super("SmsRecievedServices"); 
    } 

    @Override 
    protected void onHandleIntent(Intent intent) { 
     Log.i("SMSManager","Forwarding intent"); 
    Bundle bundle = intent.getExtras(); 
    Intent intent2 = new Intent("android.provider.Telephony.SMS_RECEIVED"); 
    intent2.putExtras(bundle); 
    sendOrderedBroadcast(intent2, "android.permission.RECEIVE_SMS"); 
     } 
} 

LogCat出力は次のようになります。

02-10 22:06:24.632: I/SMSManager(424): RandomNumber: 74 
02-10 22:06:24.673: I/SMSManager(424): Forwarding intent 
02-10 22:06:24.683: I/SMSManager(424): RandomNumber: 64 
02-10 22:06:24.803: I/SMSManager(424): Forwarding intent 
02-10 22:06:24.824: I/SMSManager(424): RandomNumber: 28 
02-10 22:06:24.832: I/SMSManager(424): Forwarding intent 
02-10 22:06:24.854: I/SMSManager(424): RandomNumber: 14 

ご覧のとおり、メッセージはシステムから3回隠されていました.4回目は、randomNumberが20よりも小さいので、中止の呼び出しを呼び出さないようにしました。受信トレイや通知バーに新しいSMSを表示しないでください。

+0

添付ファイルなしで 'sendOrderedBroadcast()'を試したことがありますか?また、SMSのために作成していないインテントを既に追加して追加する必要があるかどうかを確認しました。 – Blundell

+0

あなたのコメントに答えるために私の質問を編集しました。私が最初に得たのと全く同じ意図を再送しているので、ランダムな条件が満たされたときに新しいSMSとして表示されると思っていました。 – blindstuff

+0

現時点での問題は、転送の意図がない、つまり通知に新しいSMSがないことです。 – Blundell

答えて

4

メッセージングアプリケーションでandroid.provider.Telephony.SMS_RECEIVED意図する受信機は、(それがスプーフィングされたインテントをドロップ)保護されており、プラットフォームによって送られる唯一のプロセスインテント。

ブロードキャスト受信者での処理を避ける唯一の方法は、アプリケーションにandroid.permission.WRITE_SMS権限を追加して、SMSをデータベースに書き込むことです。

SMS/MMSプロバイダは公開APIではないため、バージョンとベンダによって異なる可能性があります。

通常、メッセージの処理は、受信者がキャンセルを希望する場合に行う必要があります。多くの時間を要するアクション(多くの連絡先情報をリストするなど)は、アプリケーションのキャッシュメカニズムによって解決する必要があります。

0

私はプッシュを調査するとき、これについて昨日読んでいました。この記事では、(SMSセクションの下で)SMSを傍受するために利用できるAPIを指しています。それは助けるかもしれない?

http://tokudu.com/2010/how-to-implement-push-notifications-for-android/

+0

私はSMSを傍受する方法を知っています。あなたのリンクは本当に申し訳ありません。 Btw、あなたはアンドロイドでプッシュしたい場合は、私はC2DMをお勧めします:http://stackoverflow.com/questions/4014391/anyone-doing-c2dm-on-android/4014969#4014969 – blindstuff

+0

まあまあまあまあです。私はAPIがhttps://labs.ericsson.com/apis/mobile-push/に役立つと思った。私はC2DMソリューションに感謝した。 – MartinS

関連する問題