Android,在服务当前不可用时使用 Telephony.SMS_RECEIVED 操作接收广播

Posted

技术标签:

【中文标题】Android,在服务当前不可用时使用 Telephony.SMS_RECEIVED 操作接收广播【英文标题】:Android , Receiving broadcast with Telephony.SMS_RECEIVED action when service is currently unavailable 【发布时间】:2016-05-04 18:05:45 【问题描述】:

现在我正在升级我的应用程序,以帮助发送短信以增加收件人数量。

我的目标是在特殊情况下检查发送进度,例如提供者服务不可用时:

RESULT_ERROR_NO_SERVICE (失败,因为服务当前不可用)

大约一年前,我在做同样的测试,一切都按需要做, 当我关闭我的电话提供商服务或发送到不寻常的号码时 触发了下一个案例之一:

RESULT_ERROR_GENERIC_FAILURE
RESULT_ERROR_NO_SERVICE
RESULT_ERROR_NULL_PDU
RESULT_ERROR_RADIO_OFF

据我所知,这种情况是在我的广播接收器中收到的,我要求在广播接收器意图过滤器中收听 android.provider.Telephony.SMS_RECEIVED 操作,并且此调用来自系统设备。

我了解了意图过滤器的优先级,还使用 ​​queryBroadcastReceivers 检查了哪些广播接收器在我的系统上运行,删除了所有尝试监听相同操作的应用程序并将我的过滤器优先级设置为最大值 “使用大于 SYSTEM_LOW_PRIORITY 且小于 SYSTEM_HIGH_PRIORITY 的值”(2147483647)。

不幸的是,当我的提供商关闭我的广播接收器时我发送 SMS 并且当我将其转回时一切正常。

什么会导致问题?

谢谢!

【问题讨论】:

【参考方案1】:

广播将具有不同的详细信息,您可以像下面的示例一样访问这些详细信息。在我的示例中,如果出现错误,我只是在庆祝错误,但你可以做你想做的事

BroadcastReceiver receiver2 = new BroadcastReceiver() 
    @Override
    public void onReceive(Context arg0, Intent arg1) 
        switch (getResultCode())
        
            case Activity.RESULT_OK:
                Toast.makeText(arg0, "SMS sent",
                        Toast.LENGTH_SHORT).show();
                break;
            case SmsManager.RESULT_ERROR_GENERIC_FAILURE:
                Toast.makeText(arg0, "Generic failure",
                        Toast.LENGTH_SHORT).show();
                break;
            case SmsManager.RESULT_ERROR_NO_SERVICE:
                Toast.makeText(arg0, "No service",
                        Toast.LENGTH_SHORT).show();
                break;
            case SmsManager.RESULT_ERROR_NULL_PDU:
                Toast.makeText(arg0, "Null PDU",
                        Toast.LENGTH_SHORT).show();
                break;
            case SmsManager.RESULT_ERROR_RADIO_OFF:
                Toast.makeText(arg0, "Radio off",
                        Toast.LENGTH_SHORT).show();
                break;
        
    
;

希望对你有帮助:)

【讨论】:

@StavBodik 抱歉。那将是由于这些原因中的任何一个。 1. 如果提供者关闭,它什么也不做。 2.(我怀疑)你安装了另一个像 GoSmsPro 这样的短信应用? 这正是我用 queryBroadcastReceivers 检查过的,我删除了所有应用程序):并且还在其他干净的设备上尝试过,是的,但是如果原因 1 为真,则应该调用 RESULT_ERROR_NO_SERVICE 接收器应该接收到的任何内容, 我什么也没得到 |: @StavBodik 都是运行不同版本或相同版本的设备。 (也许是测试版?) @StavBodik 没有安卓版本。奇巧棒棒糖棉花糖 @StavBodik 好吧,在这种情况下,我所能做的就是给你一些想法。主要的是 - 当您使用未决意图发送短信时,结果通常会在几秒钟内到达。你可以做的是 - 当你发送短信时,还创建一个计时器,检查是否在 5 秒内没有听到广播,然后将其声明为没有可用的提供商。简单的。希望它有所帮助:)

以上是关于Android,在服务当前不可用时使用 Telephony.SMS_RECEIVED 操作接收广播的主要内容,如果未能解决你的问题,请参考以下文章

如果在 DB 服务器不可用时尝试第一次查询,则 Devart/EFCore 永久失败

在 ActiveMQ 代理不可用时重试建立 JMS 连接

当 `this` 不可用时,从拖动回调中检索 DOM 目标

如何在 PremiumV2 不可用时将应用程序服务从 PremiumV2 扩展到 PremiumV3

当一台服务器不可用时如何克服dblink问题

WPF 的命令的自动刷新时机——当你 CanExecute 会返回 true 但命令依旧不可用时可能是这些原因