【问题标题】:Android - determining why SMS sending failedAndroid - 确定短信发送失败的原因
【发布时间】:2012-06-20 19:03:26
【问题描述】:

我有一个提醒应用程序,它会发送一条短信通知用户他们的提醒时间已经过去。这很好用。但是,我一直在测试当手机处于睡眠状态并错过提醒时会发生什么。

我正在使用AlarmManager 设置闹钟以对应提醒时间。我的日志显示,当手机重新启动并尝试发送 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 事件引起的。无论如何,它并没有真正让我更接近解决方案 - 我想知道当什么都没有发生时出了什么问题!

如果没有发送警报短信,我可以重新发送或使用其他通知方式,例如电子邮件等。

【问题讨论】:

    标签: android sms


    【解决方案1】:

    您将需要广播接收器和待定意图才能收到有关失败短信的通知。

    下面的代码 sn-p 会帮助你

    //---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);  
    

    【讨论】:

    • 谢谢 - 我会试试看。我假设我必须在 onReceive() 方法中取消注册接收器。
    • 这似乎行得通。不过有几个问题 - 1 - 看来我不需要取消注册接收器(当接收到进一步的 SMS 时,它们不会记录任何内容等)。为什么是这样? 2 - Android 如何知道 SMS 已发送?那里有一些低级的 SMS 功能吗?
    • 在哪里可以取消注册广播
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-23
    • 1970-01-01
    • 1970-01-01
    • 2011-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多