我的一些客户(约100人)报告该应用未发送短信。所以我在应用程序中添加了调试日志,并出现以下错误:
(1) RESULT_ERROR_GENERIC_FAILURE (Generic failure cause)
根据文档,错误的来源无法识别,可能是设备没有网络,airplaine模式已开启等。
这就是发送短信的方式:
private void sendSMS(@NonNull String phoneNumber, @NonNull String message, @Nullable PendingIntent pendingIntentSent, @Nullable PendingIntent pendingIntentDelivered) {
SmsManager smsManager = null;
try {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1) {
int smsId = SmsManager.getDefaultSmsSubscriptionId();
smsManager = SmsManager.getSmsManagerForSubscriptionId(smsId);
}
else {
smsManager = SmsManager.getDefault();
}
}
catch (Exception e) {
e.printStackTrace();
}
if (smsManager == null)
smsManager = SmsManager.getDefault();
ArrayList<String> messageDivided = smsManager.divideMessage(message);
if (messageDivided.size() == 1) {
smsManager.sendTextMessage(phoneNumber, null, message, pendingIntentSent, pendingIntentDelivered)
}
else {
ArrayList<PendingIntent> piSentList = null;
ArrayList<PendingIntent> piDeliveredList = null;
if (pendingIntentSent != null) {
piSentList = new ArrayList<>();
}
if (pendingIntentDelivered != null) {
piDeliveredList = new ArrayList<>();
}
for (int i = 0; i < messageDivided.size(); i++) {
if (pendingIntentSent != null)
piSentList.add(pendingIntentSent);
if (pendingIntentDelivered != null)
piDeliveredList.add(pendingIntentDelivered);
}
smsManager.sendMultipartTextMessage(phoneNumber, null, messageDivided, piSentList, piDeliveredList);
}
}
我发现如果邮件长度小于160个字符,错误就会消失,并且可以成功发送短信。但是,这是部分修复,因为我不希望我的用户限制SMS。
SMS长度限制也与载体不同。
US Cellular :
每条短信限制为150个字符,包括空格和 标点。如果消息超过150个字符,则余数 将丢失,导致收到不完整的消息。注意: 有些手机可能有较小的字符限制。
其他网络运营商有不同的短信长度,140或160。