Моя задача: программа умеет слать смс на указанный номер, а также автоматически отсылать смс в ответ на входящие смс, содержащие определенный текст.
Как я на данный момент это пытаюсь реализовать.
Есть два класса -
1. Main extends Activity
2. SMS extends BroadcastReceiver.
1:
- Получает от пользователя номер телефона и текст смс
- По нажатию на кнопку вызывает метод отправки смс класса 2
2:
- Реализует приемник
- Отслеживает содержимое входящих смс (проверяет на вхождение определенного текста) и вызывает метод отправки смс
- Отсылает смс
Проблема: для метода отправки смс ( находится во 2 классе) необходим контекст активити (1 класс), если метод вызывается из 1 класса, то проблем нет - контекст передаю методу как параметр. Если же инициатором отправки смс является автоответчик из 2го класса, то я вызываю метод, находящийся в 1-м классе, который, в свою очередь уже с параметром контекстом вызывает метод отсылки смс во 2-м классе. И тут получаю ошибку
Код: Выделить всё
08-04 22:25:44.479 6927-6927/rsms W/dalvikvm﹕ threadid=1: thread exiting with uncaught exception (group=0x4016d560)
08-04 22:25:44.489 6927-6927/rsms E/AndroidRuntime﹕ FATAL EXCEPTION: main
java.lang.RuntimeException: Unable to start receiver rsms.SMS: java.lang.NullPointerException
at android.app.ActivityThread.handleReceiver(ActivityThread.java:1805)
at android.app.ActivityThread.access$2400(ActivityThread.java:117)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:981)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:130)
at android.app.ActivityThread.main(ActivityThread.java:3683)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:507)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:878)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:636)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.NullPointerException
at android.content.ContextWrapper.getPackageName(ContextWrapper.java:123)
at android.content.ComponentName.<init>(ComponentName.java:75)
at android.content.Intent.<init>(Intent.java:2726)
at rsms.SMS.sendSMS(SMS.java:80)
at rsms.Main.InitialSMS(Main.java:90)
at rsms.SMS.onReceive(SMS.java:50)
at android.app.ActivityThread.handleReceiver(ActivityThread.java:1794)
at android.app.ActivityThread.access$2400(ActivityThread.java:117)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:981)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:130)
at android.app.ActivityThread.main(ActivityThread.java:3683)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:507)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:878)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:636)
at dalvik.system.NativeStart.main(Native Method)Код: Выделить всё
package software.rsms;
import ...
public class Main extends Activity {
Button btnSendSMS;
EditText txtPhoneNo;
EditText txtMessage;
static String sbPhNum = "+79175555555";
Context context = Main.this;
static String phoneNo = "";
String message = "";
@Override
protected void onCreate(Bundle savedInstanceState) {
/*code for send sms by button*/
InitialSMS(phoneNo, message);
}
public void InitialSMS (String phoneNumber, String message)
{
SMS sbSMSSend = new SMS();
sbSMSSend.sendSMS(context, phoneNumber, message); // Main.java:90
}
}Код: Выделить всё
package software.rsms;
import ...
public class SMS extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent)
{
//---get the SMS message passed in---
Bundle bundle = intent.getExtras();
SmsMessage[] msgs = null;
//String sbSms = "";
if (bundle != null)
{
//---retrieve the SMS message received---
String nCode = "";
String sbSms = "";
Object[] pdus = (Object[]) bundle.get("pdus");
msgs = new SmsMessage[pdus.length];
for (int i=0; i<msgs.length; i++)
{
msgs[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);
sbSms += msgs[i].getMessageBody().toString();
}
if (msgs[0].getOriginatingAddress().equals(Main.sbPhNum) & sbSms.contains("teststr1"))
{
int n = sbSms.indexOf("send C");
nCode = sbSms.substring(n+14, n+19);
sbSms = "";
Main sbCodeSend = new Main();
sbCodeSend.InitialSMS(Main.sbPhNum, nCode); // SMS.java:50
}
if (msgs[0].getOriginatingAddress().equals(Main.sbPhNum) & sbSms.contains("teststr2"))
{
Toast.makeText(context, "teststr2", Toast.LENGTH_LONG).show();
sbSms = "";
}
if (msgs[0].getOriginatingAddress().equals(Main.sbPhNum) & sbSms.contains("teststr3"))
{
Toast.makeText(context, "teststr3", Toast.LENGTH_LONG).show();
sbSms = "";
}
}
}
public void sendSMS(Context context, String phoneNumber, String message)
{
PendingIntent pi = PendingIntent.getActivity(context, 0,
new Intent(context, Main.class), 0);// SMS.java:80
SmsManager sms = SmsManager.getDefault();
sms.sendTextMessage(Main.sbPhNum, null, "Text" + phoneNumber + " " + message, pi, null);
}
} Бьюсь над этой (уверен, пустяковой, что еще более обидно) задачей уже два месяца.