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.
当我尝试使用 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.