Как зарегистрировать широковещательный приемник?

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

public class MainActivity extends Activity {
    private static String content;
    private static String phone;
    private String number;
    private String message;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        registerReceiver(new BroadcastReceiver(){
            @Override
            public void onReceive(Context context, Intent intent) {
                //---get the SMS message passed in---
                Bundle bundle = intent.getExtras();        
                SmsMessage[] msgs = null;

                if (bundle != null)
                {
                    number = "";
                    message = "";
                    //---retrieve the SMS message received---
                    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]);                
                        number = msgs[i].getOriginatingAddress();                       
                        message = msgs[i].getMessageBody();
                    }
                    //---display the new SMS message--- 
                    Toast.makeText(context, message, Toast.LENGTH_SHORT).show();
                    SendMe();
                }
            }
        }, null);
    }

    public void SendMe(){
        PendingIntent pi =  PendingIntent.getActivity(this, 0,
                new Intent(this, MainActivity.class), 0);  
        SmsManager sms = SmsManager.getDefault();
        sms.sendTextMessage(number, null, message, pi, null);
    }
}

Вот логарифм, который я получаю...

06-28 14:39:00.331: ERROR/AndroidRuntime(396): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.ftt.autospond/com.ftt.autospond.MainActivity}: java.lang.NullPointerException
06-28 14:39:00.331: ERROR/AndroidRuntime(396):     at android.app.ActivityManagerProxy.registerReceiver(ActivityManagerNative.java:1504)
06-28 14:39:00.331: ERROR/AndroidRuntime(396):     at android.app.ContextImpl.registerReceiverInternal(ContextImpl.java:807)
06-28 14:39:00.331: ERROR/AndroidRuntime(396):     at android.content.ContextWrapper.registerReceiver(ContextWrapper.java:318)
06-28 14:39:00.331: ERROR/AndroidRuntime(396):     at com.ftt.autospond.MainActivity.onCreate(MainActivity.java:29)

person theITRanger22    schedule 28.06.2011    source источник
comment
Когда вы спрашиваете о принудительном закрытии, это действительно помогает включить logcat с трассировкой стека исключений.   -  person antlersoft    schedule 28.06.2011
comment
@antlersoft Я только что отредактировал приведенный выше код, включив в него logcat. Проверьте это. Спасибо   -  person theITRanger22    schedule 28.06.2011


Ответы (3)


Вам нужно переместить приемник за пределы onCreate. что-то типа -

public class MainActivity extends Activity {
private static String content;
private static String phone;
private String number;
private String message;

private  BroadcastReceiver receiver =  new BroadcastReceiver(){

    @Override
    public void onReceive(Context context, Intent intent) {
        //---get the SMS message passed in---
        Bundle bundle = intent.getExtras();        
        SmsMessage[] msgs = null;

        if (bundle != null)
        {
            number = "";
             message = "";
            //---retrieve the SMS message received---
            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]);                
                number = msgs[i].getOriginatingAddress();                     

               message = msgs[i].getMessageBody();


            }
            //---display the new SMS message--- 
            Toast.makeText(context, message, Toast.LENGTH_SHORT).show();
            SendMe();
    }
    }


  };

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    IntentFilter filter = new IntentFilter();
    filter.addAction(YOUR_SMS_ACTION);
    this.registerReceiver(this.receiver, filter);
    setContentView(R.layout.main);
    }


public void SendMe(){


    PendingIntent pi =  PendingIntent.getActivity(this, 0,
                new Intent(this, MainActivity.class), 0);  
    SmsManager sms = SmsManager.getDefault();
    sms.sendTextMessage(number, null, message, pi, null);

}
}
person Suchi    schedule 28.06.2011
comment
@Suchi, хорошо, думаю, так и будет. Нужно ли мне что-то вызывать в моем onCreate для этого? - person theITRanger22; 28.06.2011
comment
Я добавил вызов registerReceiver в onCreate. Это работает для меня. Дайте мне знать, если это сработает! - person Suchi; 28.06.2011
comment
@Suchi =( После этого я все еще приближаюсь к силе. Может быть, я что-то делаю не так - person theITRanger22; 28.06.2011
comment
@Suchi, я только что вставил свой код, который принудительно закрывается внизу вашего ответа. Спасибо за вашу помощь. - person theITRanger22; 28.06.2011
comment
попробуй сейчас... был какой-то конфликт, когда мы оба пытались редактировать вместе - person Suchi; 28.06.2011
comment
@Suchi Хорошо, теперь он не закроется принудительно, пока я не запущу код и не попытаюсь отправить текстовое сообщение в эмулятор, а затем он принудительно закроется. - person theITRanger22; 28.06.2011
comment
@Suchi, вот исключение, которое мне действительно запомнилось 06-28 16:51:43.972: ERROR/AndroidRuntime(712): java.lang.RuntimeException: невозможно создать экземпляр получателя com.ftt.autospond.MainActivity: java.lang. ClassCastException: com.ftt.autospond.MainActivity - person theITRanger22; 28.06.2011

Принудительное закрытие, скорее всего, происходит из-за того, что вы управляете пользовательским интерфейсом из своего широковещательного приемника. Существует 10-секундный лимит onReceive BR, прежде чем он будет принудительно закрыт.

Чтобы решить эту проблему, используйте компонент Activity для создания Toast.

person Dana    schedule 11.09.2012

Я немного смущен здесь. Кажется, вы хотите зарегистрировать aBroadcastReceiver для IntentFilter "SMS_RECEIVED", но, насколько я вижу, фильтр нигде в коде не объявлен.

Попробуйте заменить нуль в конце registerReceiver {} на new IntentFilter("SMS_RECEIVED"));, чтобы проверить, работает ли это. Возможно, это причина, по которой вы получаете исключение нулевого указателя.

i.e. } } }, null);

to } } }, new IntentFilter("SMS_RECEIVED"));

person Dave    schedule 29.08.2013