0

アプリが SMS を正常に送信したときに通知を受信しようとしています。BroadcastReceiver通知に使用します。に登録し、 に登録onResume()解除しonPause()ます。しかし、SMSを送信しても通知されません。ループにブレークポイントを設定しましたBroadcastReceiverが、通知がありません。何が問題なのですか?私のコードは次のとおりです。

@Override
public void onResume() {
    super.onResume();

    //---create the BroadcastReceiver when the SMS is sent---
    smsSentReceiver = new BroadcastReceiver(){
        @Override
        public void onReceive(Context arg0, Intent arg1) {

            switch (getResultCode())
            {
                case Activity.RESULT_OK:
                    Toast.makeText(getBaseContext(), "SMS sent",
                        Toast.LENGTH_SHORT).show();
                    break;
                case SmsManager.RESULT_ERROR_GENERIC_FAILURE:
                    Toast.makeText(getBaseContext(), "Generic failure",
                        Toast.LENGTH_SHORT).show();
                    break;
                case SmsManager.RESULT_ERROR_NO_SERVICE:
                    Toast.makeText(getBaseContext(), "No service",
                        Toast.LENGTH_SHORT).show();
                    break;
                case SmsManager.RESULT_ERROR_NULL_PDU:
                    Toast.makeText(getBaseContext(), "Null PDU",
                        Toast.LENGTH_SHORT).show();
                    break;
                case SmsManager.RESULT_ERROR_RADIO_OFF:
                    Toast.makeText(getBaseContext(), "Radio off",
                        Toast.LENGTH_SHORT).show();
                    break;
            }
        }
    };

    //---create the BroadcastReceiver when the SMS is delivered---
    smsDeliveredReceiver = new BroadcastReceiver(){
        @Override
        public void onReceive(Context arg0, Intent arg1) {
            switch (getResultCode())
            {
               case Activity.RESULT_OK:
                   Toast.makeText(getBaseContext(), "SMS delivered",
                        Toast.LENGTH_SHORT).show();
                   break;
               case Activity.RESULT_CANCELED:
                   Toast.makeText(getBaseContext(), "SMS not delivered",
                        Toast.LENGTH_SHORT).show();
                   break;
            }
        }
    }; 

    //---register the two BroadcastReceivers---
    registerReceiver(smsSentReceiver, new IntentFilter(SENT));
    registerReceiver(smsDeliveredReceiver, new IntentFilter(DELIVERED));      
}

@Override
public void onPause() {
    super.onPause();
    //---unregister the two BroadcastReceivers---
    unregisterReceiver(smsSentReceiver);
    unregisterReceiver(smsDeliveredReceiver);        
}
4

1 に答える 1

1

あなたのユースケースについてはわかりません。ドキュメントでは、onPause で受信者の登録を解除することを提案していますが、アプリがバックグラウンドにあるときに受信者が送信されると、インテントを見逃すことになります。インテントをバックグラウンドで受け取りたい場合は、次の 2 つのオプションがあります。

  1. サービスを実行し、そこに受信者​​を登録します。
  2. 可能であれば、ブロードキャスト レシーバーをマニフェストに登録できます。

文書によると

注: Activity.onResume() 実装でレシーバーを登録する場合は、Activity.onPause() で登録を解除する必要があります。(一時停止するとインテントを受信しなくなり、不要なシステム オーバーヘッドが削減されます)。

また、ACTION 文字列 (「android.provider.Telephony.SMS_RECEIVED」) にタイプミスがなく、正しい権限 (「android.permission.RECEIVE_SMS」) があることも確認してください。

編集してください(特にCommonsWareの回答)

Android 送信 SMS インテントとは何ですか?

送信された SMS メッセージの Android ブロードキャスト レシーバー?

「Android が SMS を送信するときにブロードキャストされるインテントはありません。これはおそらくプライバシー上の理由によるものです。」...CommonsWare

于 2013-03-30T14:47:13.070 に答える