【发布时间】:2013-05-22 15:09:35
【问题描述】:
我的应用程序发送 SMS 消息,我想知道如果没有可用的移动网络(信号接收)并且无法发送 SMS,是否需要捕获异常?
【问题讨论】:
-
好问题! Have a look here 用于检查移动网络是否可用的“正常”方式。当我查看
telephony.SmsManager的 API 文档时,sendTextMessage方法只会在存在非法参数时抛出异常。
我的应用程序发送 SMS 消息,我想知道如果没有可用的移动网络(信号接收)并且无法发送 SMS,是否需要捕获异常?
【问题讨论】:
telephony.SmsManager 的 API 文档时,sendTextMessage 方法只会在存在非法参数时抛出异常。
你可以注册这个处理程序来处理结果:
registerReceiver(new BroadcastReceiver()
{
@Override
public void onReceive(Context context, Intent intent)
{
int resultCode = getResultCode();
switch (resultCode)
{
case Activity.RESULT_OK:
break;
case SmsManager.RESULT_ERROR_GENERIC_FAILURE:
break;
case SmsManager.RESULT_ERROR_NO_SERVICE:
break;
case SmsManager.RESULT_ERROR_NULL_PDU:
break;
case SmsManager.RESULT_ERROR_RADIO_OFF:
break;
}
}
}, new IntentFilter("SMS_SENT"));
然后,如documentation所示,可以发送如下文字:
sendTextMessage (number, null, "text", PendingIntent.getBroadcast(this, 0,
new Intent("SMS_SENT_ACTION"), 0), null);
【讨论】:
你应该明白,调用SmsManager.sendTextMessage()不会立即同步发送消息,所以不会因为发送失败而抛出异常。
但是,当您调用sendTextMessage() 时,您可以提供PendingIntent,该PendingIntent 将在消息发送成功/失败时触发。这是该参数文档的相关部分:
如果不为 null,则为 PendingIntents 的 ArrayList(每条消息一个 部分),当相应的消息部分已经被广播时 发送。结果代码将是 Activity.RESULT_OK 表示成功,或者一个 这些错误:
RESULT_ERROR_GENERIC_FAILURE
RESULT_ERROR_RADIO_OFF
RESULT_ERROR_NULL_PDU
对于 RESULT_ERROR_GENERIC_FAILURE,每个 sentIntent 可能包含额外的 “errorCode”包含无线电技术特定的值,通常 仅对故障排除有用。
【讨论】:
AFAIK 也不例外,但您可以使用 ConnectivityManger 获取此类信息。
您还需要ACCESS_NETWORK_STATE 权限。
【讨论】: