三星设备上的SmsManager崩溃

时间:2018-12-01 12:17:31

标签: android

当我尝试发送多部分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遇到了这个问题吗?预先感谢!

2 个答案:

答案 0 :(得分:0)

三星银河S2的特殊实现,在4.0.3更新中有一个讨厌的错误。

See this bug

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块内,并且有可能会捕获异常,并且该解决方案的代码将被执行或什至以不同方式处理(向用户显示错误消息)。在这种情况下,如果正确实施,可以最大程度地减少错误。