6

SMS を送信してユーザーにリマインダー時間が経過したことを通知するリマインダー アプリがあります。これはうまくいきます。ただし、電話がスリープ状態でリマインダーを逃した場合に何が起こるかをテストしています。

AlarmManagerリマインダー時間に対応するアラームを設定するために使用しています。私のログによると、電話が再起動し、SMS を送信しようとしたときにアラームが鳴ったが、SMS が受信されないことが示されています。

問題は、SMS が送信されない理由をデバッグする方法があるかということです。

私の現在のコードは、アラーム イベントが発生したときに ContentObserver を設定します。

    private void registerToListenForSentSMS()
{
    MessageSentListener smsObeserver = new MessageSentListener(new Handler());
    ContentResolver contentResolver = TheEveryOtherAlarmAppApplication.getAppContext().getContentResolver();
    contentResolver.registerContentObserver(Uri.parse("content://sms"), true, smsObeserver);
}

MessageSentListener は、SMS イベントが発生したことを通知されます

public class MessageSentListener extends ContentObserver
{

public MessageSentListener(Handler handler)
{
    super(handler);
}

@Override
public void onChange(boolean selfChange)
{
    super.onChange(selfChange);

    Log.d(Constants.ALARM_APP_LOG_TAG, "Something happend");
    ContentResolver contentResolver = AlarmAppApplication.getAppContext().getContentResolver();

    contentResolver.unregisterContentObserver(this);
}
}

しかし、これはアプリに関係のない SMS イベントが原因である可能性があります。とにかく、それは本当に解決策に近づくことはありません - 何も起こらなかったときにがうまくいかなかったのか知りたいです!

アラーム SMS が送信されない場合は、再送信するか、メールなどの他の通知方法を使用できます。

4

1 に答える 1

5

失敗した SMS に関する通知を受け取るには、ブロードキャスト レシーバーと保留中の意図が必要です。

以下のコードスニペットが役立ちます

//---sends an SMS message to another device---
    private void sendSMS(String phoneNumber, String message)
    {        
        String SENT = "SMS_SENT";
        String DELIVERED = "SMS_DELIVERED";

        PendingIntent sentPI = PendingIntent.getBroadcast(this, 0,
            new Intent(SENT), 0);

        PendingIntent deliveredPI = PendingIntent.getBroadcast(this, 0,
            new Intent(DELIVERED), 0);

        //---when the SMS has been sent---
        registerReceiver(new BroadcastReceiver(){
            @Override
            public void onReceive(Context context, Intent arg1) {
                switch (getResultCode())
                {
                    case Activity.RESULT_OK:
                        Toast.makeText(context, "SMS sent", 
                                Toast.LENGTH_SHORT).show();
                        break;
                    case SmsManager.RESULT_ERROR_GENERIC_FAILURE:
                        Toast.makeText(context, "Generic failure", 
                                Toast.LENGTH_SHORT).show();
                        break;
                    case SmsManager.RESULT_ERROR_NO_SERVICE:
                        Toast.makeText(context, "No service", 
                                Toast.LENGTH_SHORT).show();
                        break;
                    case SmsManager.RESULT_ERROR_NULL_PDU:
                        Toast.makeText(context, "Null PDU", 
                                Toast.LENGTH_SHORT).show();
                        break;
                    case SmsManager.RESULT_ERROR_RADIO_OFF:
                        Toast.makeText(context, "Radio off", 
                                Toast.LENGTH_SHORT).show();
                        break;
                }
            }
        }, new IntentFilter(SENT));

        //---when the SMS has been delivered---
        registerReceiver(new BroadcastReceiver(){
            @Override
            public void onReceive(Context context, Intent arg1) {
                switch (getResultCode())
                {
                    case Activity.RESULT_OK:
                        Toast.makeText(context, "SMS delivered", 
                                Toast.LENGTH_SHORT).show();
                        break;
                    case Activity.RESULT_CANCELED:
                        Toast.makeText(context, "SMS not delivered", 
                                Toast.LENGTH_SHORT).show();
                        break;                        
                }
            }
        }, new IntentFilter(DELIVERED));        

        SmsManager sms = SmsManager.getDefault();
        sms.sendTextMessage(phoneNumber, null, message, sentPI, deliveredPI);  
于 2012-06-03T12:34:14.877 に答える