簡體   English   中英

SmsManager在三星設備上崩潰

[英]SmsManager crash on Samsung devices

我在嘗試發送多部分SMS消息時收到三星設備的崩潰日志,這是導致崩潰的行:

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遇到過這個問題? 提前致謝!

三星Galaxy S2的特殊實現,它在4.0.3更新中有一個令人討厭的錯誤。

看到這個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);
        }
    }

Iterator通常是迭代ListsendMultipartTextMessage有三個參數,這些參數是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塊內,並且可能會捕獲異常,並且該解決方案的代碼將被執行或甚至以不同方式處理(向用戶顯示錯誤消息)。 在這種情況下,如果正確實施,可以最小化錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM