Android - 确定短信发送失败的原因

bar*_*rry 6 sms android

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

我正在AlarmManager设置警报以对应提醒时间.我的日志记录显示,当手机重新启动并且发送短信的尝试发生时,闹钟响起,但从未收到短信.

所以问题是,有没有办法调试为什么不发送短信?

我的当前代码在发生警报事件时设置ContentObserver:

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

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);
}
}
Run Code Online (Sandbox Code Playgroud)

但这可能是由与我的应用程序无关的SMS事件引起的.无论如何,它并没有真正让我更接近解决方案 - 我想知道什么时候出现什么问题!

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

Vip*_*hah 5

您将需要广播接收器和待定意图以获得有关失败短信的通知.

下面的代码片段可以帮助您

//---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);  
Run Code Online (Sandbox Code Playgroud)


小智 0

您可以使用 BroadcastReceiver 检查短信是否发送,如果没有发送,是什么问题

 val TAG = "TRACK_SMS_STATUS"

    private fun sendSMS(phoneNumber: String, message: String) {
    val send = "SMS_SENT"
    val delivered = "SMS_DELIVERED"
    val sentPI = PendingIntent.getBroadcast(activity, 0,
        Intent(send), PendingIntent.FLAG_IMMUTABLE)
    val deliveredPI = PendingIntent.getBroadcast(activity, 0,
        Intent(delivered),  PendingIntent.FLAG_IMMUTABLE)

    //---when the SMS has been sent---
    registerReceiver(object : BroadcastReceiver() {
        override fun onReceive(arg0: Context?, arg1: Intent?) {
            val bundle: Bundle? = arg1?.extras
            when (resultCode) {
                AppCompatActivity.RESULT_OK -> {
                    Log.d(TAG, "SMS sent")
                }
                SmsManager.RESULT_ERROR_GENERIC_FAILURE -> {
                    Log.d(TAG,   "Generic failure")

                }
                SmsManager.RESULT_ERROR_NO_SERVICE -> {
                    Log.d(TAG, "No service")
                }
                SmsManager.RESULT_ERROR_NULL_PDU -> {
                    Log.d(TAG, "Null PDU")
                }
                SmsManager.RESULT_ERROR_RADIO_OFF -> {
                    Log.d(TAG, "Radio off")
                }
            }
        }
    }, IntentFilter(send))

    //---when the SMS has been delivered---
    registerReceiver(object : BroadcastReceiver() {
        override fun onReceive(arg0: Context?, arg1: Intent?) {
            when (resultCode) {
                AppCompatActivity.RESULT_OK -> {
                    Log.d(TAG, "SMS delivered")
                }
                AppCompatActivity.RESULT_CANCELED -> {
                    Log.d(TAG, "SMS not delivered")
                }
            }
        }
    }, IntentFilter(delivered))
    val sms = SmsManager.getDefault()
    sms.sendTextMessage(phoneNumber, null, message, sentPI, deliveredPI)
}
Run Code Online (Sandbox Code Playgroud)