Android:SMSManager - 尝试获取空数组的长度

Android : SMSManager - Attempt to get length of null array

当我尝试使用 sendTextMesasge 方法发送消息时,SMSManager 出现了错误。它 returns 我 java.lang.NullPointerException: Attempt to get length of null array.

这是我的代码:

        // Constructs the message
        TelephonyManager mTelephonyMgr = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);     
        String myPhoneNumber = mTelephonyMgr.getLine1Number();
        String destNumber = taskManager.getHelpCenterNumber();
        String message = getResources().getString(R.string.call_me_message) + " " + myPhoneNumber+".";

        // Sends the message
        SmsManager smsManager = SmsManager.getDefault();
        smsManager.sendTextMessage(destNumber, null, message, null, null);

LogCat 收到此消息:

08-03 09:59:10.548: E/AndroidRuntime(19825): FATAL EXCEPTION: main
08-03 09:59:10.548: E/AndroidRuntime(19825): Process: com.solarsquareretailer.view, PID: 19825
08-03 09:59:10.548: E/AndroidRuntime(19825): java.lang.NullPointerException: Attempt to get length of null array
08-03 09:59:10.548: E/AndroidRuntime(19825):    at android.os.Parcel.readException(Parcel.java:1546)
08-03 09:59:10.548: E/AndroidRuntime(19825):    at android.os.Parcel.readException(Parcel.java:1493)
08-03 09:59:10.548: E/AndroidRuntime(19825):    at com.android.internal.telephony.ISms$Stub$Proxy.sendText(ISms.java:1428)
08-03 09:59:10.548: E/AndroidRuntime(19825):    at android.telephony.SmsManager.sendTextMessage(SmsManager.java:305)
08-03 09:59:10.548: E/AndroidRuntime(19825):    at com.solarsquareretailer.view.MainActivity.onOptionsItemSelected(MainActivity.java:245)

我已经在我的应用程序中多次发现这个问题(但从未在我的测试中),并且几个月来一直试图找到解决方案。到目前为止,我找不到重现它的测试用例。

使用Sms.sendMultipartTextMessage方法:

SmsManager sms = SmsManager.getDefault();
ArrayList<String> parts = sms.divideMessage(msg);
sms.sendMultipartTextMessage(number, null, parts, null, null);

也无济于事 - 因为如果消息只有一个部分,它最终会在内部调用 sendTextMessage - 但无论如何,如果你切换到它可能是个好主意,以防你有更长的消息。

我最终将代码包装在一个 try-catch 中,并在它发生时向服务器报告。据我所见,似乎 'normal' 条消息似乎触发了它。

有一个类似的情况 here,但在那种情况下,消息有一个待发送的 PendingIntent。您可能想尝试一下。

首先,您需要 AndroidManifest.xml 中的权限才能读取 Phone 状态

<uses-permission android:name="android.permission.READ_PHONE_STATE"/> 

然后尝试在 Try Catch 块中获取设备的手机号码。

可能会发生 getLine1Number() return 空值。 所以你需要处理异常

try 
{
    myPhoneNumber = mTelephonyMgr.getLine1Number();
}
catch(NullPointerException ex)
{
}

发现我的 destNumber 为空且不正确(不是 phone 号码)。这就是为什么我有一个 java.lang.NullPointerException.