Страница 1 из 1

SMS автоответчик

Добавлено: 05 авг 2014, 12:43
lavAzza
Абсолютный новичок и в программировании вообще, и в программировании на Андроид в частности, поэтому сразу респект тому, кто хотя бы просто осилит.)

Моя задача: программа умеет слать смс на указанный номер, а также автоматически отсылать смс в ответ на входящие смс, содержащие определенный текст.

Как я на данный момент это пытаюсь реализовать.
Есть два класса -
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)
Класс Main

Код: Выделить всё

   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
        }

    }
Класс SMS

Код: Выделить всё

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);
    }
}  
Возможно, подобный подход к решению задачи в корне неверен, в этом случае с удовольствием выслушаю как надо было сделать.
Бьюсь над этой (уверен, пустяковой, что еще более обидно) задачей уже два месяца. :roll: Помогите плз.

Re: SMS автоответчик

Добавлено: 07 авг 2014, 06:40
lavAzza
Ну, товарищи!)
Если короче: как отправить смс из класса, не расширяющего Activity? Учитывая, что метод должен знать контекст активити.

Код: Выделить всё

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); 
    } 

Re: SMS автоответчик

Добавлено: 07 авг 2014, 13:21
KamiSempai
Зачем тут PendingIntent если вы его не используете?

Re: SMS автоответчик

Добавлено: 21 авг 2014, 21:46
Saint_Byte
Надо больше дебага !!! А не с экшепшеном на форум