Android 三星设备上的SmsManager崩溃

Android 三星设备上的SmsManager崩溃,android,Android,我在尝试发送多部分SMS消息时收到三星设备的崩溃日志,这是导致崩溃的线路: SmsManager.getDefault().sendMultipartTextMessage(phone, null, SmsManager.getDefault().divideMessage(message), null, null) 其中,phone是一个完全指定的不可为空的电话号码,message是一个长字符串(最多300个字符),仅带有ASCI符号。唯一值得注意的是,它可能包含用于文本分隔的\n\n 以下

我在尝试发送多部分SMS消息时收到三星设备的崩溃日志,这是导致崩溃的线路:

SmsManager.getDefault().sendMultipartTextMessage(phone, null, SmsManager.getDefault().divideMessage(message), null, null)
其中,
phone
是一个完全指定的不可为空的电话号码,
message
是一个长
字符串(最多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)
我试图查看故障日志中指定的行的
smsmsmanager
源代码,但没有结果-它似乎已被OEM修改

这也不应该是权限问题,因为我在执行
sendMultipartTextMessage
行之前检查了SMS权限

事故发生在三星Galaxy S6和J530F手机上。除此之外,从未有其他报道。不幸的是,我没有三星的设备来测试这个


有人遇到过这个问题吗?提前谢谢

迭代器
通常用于迭代
列表
sendMultipartTextMessage
有三个属于
列表
子类型的参数(特别是
数组列表

由于崩溃正在发生,我建议始终确保这些参数为非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());
smsmsmanager-manager=smsmsmanager.getDefault();
ArrayList parts=manager.divideMessage(消息);
manager.sendMultipartTextMessage(phone,null,parts!=null?parts:new ArrayList(),
新建ArrayList(),新建ArrayList());

请注意,我尚未尝试该解决方案,如果此解决方案导致不同的错误,则最后两个参数可能需要保持
null
。此外,这可能会在其他地方导致错误,但希望不会导致崩溃。您可能会使用try-catch块,其中您当前的实现位于try块内,并且可能会捕获异常,并且此解决方案的代码将被执行,甚至以不同的方式处理(向用户显示错误消息)。在这种情况下,如果实施得当,可以最大限度地减少错误。

三星Galaxy S2的特殊实施,它在4.0.3更新中存在严重缺陷

私有静态类galaxys2cssmsmanager扩展了donutsmmanager{
私有静态方法;
静止的{
试一试{
Class classSmsManager=Class.forName(“android.telephony.smsmsmanager”);
类paramTypes[]=新类[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);
}捕获(例外情况除外){
抛出新的运行时异常(ex);
}
}

请添加更多详细信息,最好编写当前类的完整代码。您如何确定这部分代码首先引发异常?请发送完整的堆栈跟踪?您应该将
smsmsmsmanager.getDefault().divideMessage(message)
send参数的外侧,以便更好地查找异常位置,如果它首先抛出异常的话。更好的是,您可以将该函数放在其他位置,例如About Activity的
onCreate
,仅用于测试目的,并带有一些常量消息值。@BAHMAN您可以从堆栈跟踪中看到它崩溃的原因
android.telephony.smsmsmanager.sendMultipartTextMessage(SmsManager.java:544)
这是我指的方法。正如我提到的,此崩溃只发生在三星设备上,我无法在我的设备上复制。Genymotion emulator有一些三星仿真器映像。你能通过此仿真器测试此代码吗?将这些
分隔消息(message)
sendMultipartTextMessage
在某个测试类中的两行中找到更好的问题。这并没有回答问题,所做的假设是错误的。
smsmsmanager.divideMessage
如果消息始终为null,并且不需要传递
new ArrayList()
对于发送和传递挂起的意图参数,更不用说这些参数根本不相关。正如前面提到的,此崩溃只发生在三星设备上。如果我的实现有问题,它也会在其他设备上崩溃。是的,但您如何确保
divideMessage
的输出不会返回
null
ArrayList
?我还提到您可能不需要传递
新的ArrayList()
到最后两个参数,即发送和传递挂起的意图参数。我相信尝试一下不会有什么坏处,可能会解决崩溃问题。基本上,例外情况是告诉我们某个列表参数正在处理中,但它为空,这不能被误解为其他参数。为了更详细地说明,我试图说明仅在三星设备上(
divideMessage
)可能存在奇怪的行为/实现(到目前为止)。此解决方案作为一种设备兼容性解决方案提供,以在发生这种情况时调整行为。
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);
        }
    }