sendDataMessage всегда вызывает исключение нулевого указателя - PullRequest
1 голос
/ 18 марта 2012

надеюсь, я смогу получить помощь по проблеме, которая у меня возникла. Я использую класс «android.telephony.SmsManager» для отправки текстового сообщения данных через функцию API: «sendDataMessage (...)» и каждый раз, когда вызывается функция, я получаю исключение нулевого указателя. Я провел свое исследование и обнаружил, что это может быть вызвано попыткой отправить слишком большое сообщение с данными (порядка 133 байтов или более). Я посылаю 5 байтов - так что я знаю, что я не превышаю лимит. Я не получаю исключение нулевого указателя на эмуляторе (хотя я знаю, что есть другие проблемы с эмулятором, неправильно отправляющим SMS-сообщения с данными, поэтому, возможно, я получил бы ошибку, если эмулятор работал). Мой код выглядит следующим образом:

SmsManager sm = SmsManager.getDefault();
int SMS_PORT = 8091;
sm.sendDataMessage("5555551212", null, (short)SMS_PORT, "hello".getBytes(), null, null);

В соответствии с документацией API, 3 аргумента, которые у меня есть как "ноль" выше, могут быть нулевыми. Я также попытался отправить намерения в последние 2 аргумента и строку во втором аргументе, но все еще получаю исключение нулевого указателя.

Обратите внимание, что я получаю это исключение при запуске на своем телефоне Android. Я использую пряники и использую правильный уровень API для ГБ. Мой файл Android Manafest имеет необходимые разрешения для отправки SMS.

LogCat исключения нулевого указателя выглядит следующим образом:

E/AndroidRuntime( 1690): FATAL EXCEPTION: main
E/AndroidRuntime( 1690): java.lang.IllegalStateException: Could not execute method of the activity
E/AndroidRuntime( 1690):        at android.view.View$1.onClick(View.java:2144)
E/AndroidRuntime( 1690):        at android.view.View.performClick(View.java:2485)
E/AndroidRuntime( 1690):        at android.view.View$PerformClick.run(View.java:9081)
E/AndroidRuntime( 1690):        at android.os.Handler.handleCallback(Handler.java:587)
E/AndroidRuntime( 1690):        at android.os.Handler.dispatchMessage(Handler.java:92)
E/AndroidRuntime( 1690):        at android.os.Looper.loop(Looper.java:130)
E/AndroidRuntime( 1690):        at android.app.ActivityThread.main(ActivityThread.java:3686)
E/AndroidRuntime( 1690):        at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime( 1690):        at java.lang.reflect.Method.invoke(Method.java:507)
E/AndroidRuntime( 1690):        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867)
E/AndroidRuntime( 1690):        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625)
E/AndroidRuntime( 1690):        at dalvik.system.NativeStart.main(Native Method)
E/AndroidRuntime( 1690): Caused by: java.lang.reflect.InvocationTargetException
E/AndroidRuntime( 1690):        at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime( 1690):        at java.lang.reflect.Method.invoke(Method.java:507)
E/AndroidRuntime( 1690):        at android.view.View$1.onClick(View.java:2139)
E/AndroidRuntime( 1690):        ... 11 more
E/AndroidRuntime( 1690): Caused by: java.lang.NullPointerException
E/AndroidRuntime( 1690):        at android.os.Parcel.readException(Parcel.java:1328)
E/AndroidRuntime( 1690):        at android.os.Parcel.readException(Parcel.java:1276)
E/AndroidRuntime( 1690):        at com.android.internal.telephony.ISms$Stub$Proxy.sendData(ISms.java:359)
E/AndroidRuntime( 1690):        at android.telephony.SmsManager.sendDataMessage(SmsManager.java:212)
E/AndroidRuntime( 1690):        at com.test.datasmstest.DataSMSTestActivity.DoClick(DataSMSTestActivity.java:55)
E/AndroidRuntime( 1690):        ... 14 more

Есть идеи - будет ли полезной дополнительная информация для решения этой проблемы?

Спасибо!

Ответы [ 3 ]

2 голосов
/ 21 марта 2012

Я выяснил, что происходит - я использую телефонную трубку спринта, и спринт не разрешает текстовые сообщения (двоичные данные). Я знаю это, потому что я взял то же самое приложение, которое сгенерировало вышеупомянутое исключение нулевого указателя, и запустил его на телефоне без спринта (в данном случае t-mobile). Текстовое сообщение с данными было успешно отправлено. Он был адресован порту моего спринт-телефона, и на мобильный телефон t-mobile, который отправил текстовое сообщение, было отправлено следующее текстовое сообщение:

[Бесплатное сообщение: невозможно отправить сообщение на 15555551212. Пожалуйста, попробуйте еще раз без символа в тексте.]

15555551212 - это номер моего спринта (скрыт по понятным причинам).

Итак, приведенный выше код отлично работает на некоторых мобильных телефонах, а не на других. Я предполагаю, что реализация android на моем телефоне в sprints не реализует должным образом sendDataMessage (или преднамеренно убивает эту функцию), так что она выдает исключение нулевого указателя.

1 голос
/ 18 марта 2012
Intent smsIntent = new Intent(Intent.ACTION_VIEW);

                smsIntent.setType("vnd.android-dir/mms-sms");

                smsIntent.putExtra("address", "838255");

                smsIntent.putExtra("sms_body","");

                startActivity(smsIntent);

попробуйте этот код, он отлично работает

0 голосов
/ 18 марта 2012

Если вам нужна дополнительная документация, этот учебник может помочь вам: http://mobiforge.com/developing/story/sms-messaging-android

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...