当我尝试发送多部分SMS消息时,我从Samsung设备接收到崩溃日志,这是导致崩溃的行:
SmsManager.getDefault().sendMultipartTextMessage(phone, null, SmsManager.getDefault().divideMessage(message), null, null)
其中phone
是一个完全指定的非空电话号码,而message
是一个长String
(最多300个字符),仅带有ASCI符号。唯一值得一提的可能是它包含\n\n
用于文本分离。
这是崩溃日志:
Fatal Exception: java.lang.NullPointerException
Attempt to invoke interface method 'java.util.Iterator java.lang.Iterable.iterator()' on a null object reference
android.os.Parcel.readException (Parcel.java:1699)
android.os.Parcel.readException (Parcel.java:1646)
com.android.internal.telephony.ISms$Stub$Proxy.sendMultipartTextForSubscriber (ISms.java:1719)
android.telephony.SmsManager.sendMultipartTextMessageInternal (SmsManager.java:576)
android.telephony.SmsManager.sendMultipartTextMessage (SmsManager.java:544)
我尝试查看崩溃日志中指定的行的SmsManager
源,但无济于事-似乎它已被OEM修改。
这也不应该是权限问题,因为我在执行sendMultipartTextMessage
行之前就检查了SMS权限。
崩溃发生在三星Galaxy S6和J530F手机上。除此以外,没有其他报道。不幸的是,我没有三星设备可以对此进行测试。
enyone遇到了这个问题吗?预先感谢!
答案 0 :(得分:0)
三星银河S2的特殊实现,在4.0.3更新中有一个讨厌的错误。
private static class GalaxyS2IcsSmsManager extends DonutSmsManager {
private static Method method;
static {
try {
Class<?> classSmsManager = Class.forName("android.telephony.SmsManager");
Class<?> paramTypes[] = new Class[9];
paramTypes[0] = String.class;
paramTypes[1] = String.class;
paramTypes[2] = ArrayList.class;
paramTypes[3] = ArrayList.class;
paramTypes[4] = ArrayList.class;
paramTypes[5] = Boolean.TYPE;
paramTypes[6] = paramTypes[7] = paramTypes[8] = Integer.TYPE;
method = classSmsManager.getMethod("sendMultipartTextMessage", paramTypes);
} catch (Exception ex) {
throw new RuntimeException(ex);
}
}
答案 1 :(得分:-1)
Iterator
通常用于迭代List
,并且sendMultipartTextMessage
具有三个List
子类型(特别是ArrayList
)的参数。
由于发生崩溃,我建议始终确保这些参数为非null。因此,像这样传递空的null
而不是传递ArrayList
:
SmsManager manager = SmsManager.getDefault();
ArrayList<String> parts = manager.divideMessage(message);
manager.sendMultipartTextMessage(phone, null, parts != null ? parts : new ArrayList(),
new ArrayList(), new ArrayList());
请注意,我没有尝试过解决方案,如果此解决方案导致了另一个错误,则最后两个参数可能需要保留null
。同样,这可能在其他地方导致错误,但希望不会崩溃。您可能会使用try-catch块,其中当前的实现位于try块内,并且有可能会捕获异常,并且该解决方案的代码将被执行或什至以不同方式处理(向用户显示错误消息)。在这种情况下,如果正确实施,可以最大程度地减少错误。