Java Android-接收器未注册

Java Android-接收器未注册,java,android,broadcastreceiver,text-to-speech,Java,Android,Broadcastreceiver,Text To Speech,我正在尝试编写一个简单的应用程序,将使用textToSpeech阅读收入短信,使用broadcastReceiver 这是一项活动: public class MainActivitySmsToVoice extends Activity { private TextToSpeech engine; private static final int STATUS_CHECK = 0; Button btnStart; Button btnStop; MySmsToVoiceReceiver b

我正在尝试编写一个简单的应用程序,将使用textToSpeech阅读收入短信,使用broadcastReceiver

这是一项活动:

public class MainActivitySmsToVoice extends Activity {

private TextToSpeech engine;
private static final int STATUS_CHECK = 0;
Button btnStart;
Button btnStop;
MySmsToVoiceReceiver br;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main_activity_sms_to_voice);

    btnStart = (Button) findViewById(R.id.button1);
    btnStop = (Button) findViewById(R.id.button2);

    btnStart.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            btnStart.setVisibility(View.VISIBLE);
            btnStop.setVisibility(View.VISIBLE);

            br = new MySmsToVoiceReceiver();
            //register SMS receiver
            registerReceiver(br, new IntentFilter("android.provider.Telephony.SMS_RECEIVED"));
        }
    });
    Intent checkIntent = new Intent();
    checkIntent.setAction(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA);
    startActivityForResult(checkIntent, STATUS_CHECK);
}

//This method will be called after startActivityForResult() finishes, 
//and check weather the text to speech installed on device
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {

    switch (resultCode) {
    case TextToSpeech.Engine.CHECK_VOICE_DATA_PASS:
        engine = new TextToSpeech(this, (OnInitListener) this);
        break;
    case TextToSpeech.Engine.CHECK_VOICE_DATA_FAIL:
        Intent installIntent = new Intent();
        installIntent
                .setAction(TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA);
        startActivity(installIntent);
        break;
    default:
        Log.e("textToSpeach", "Unable to intall TextToSpeach module");
    }
}

@Override
protected void onPause() {
    super.onPause();
    unregisterReceiver(br);
    btnStop.setVisibility(View.INVISIBLE);
}
}

这是广播接收机:

public class MySmsToVoiceReceiver extends BroadcastReceiver {
private static final String SMS_RECEIVE_ACTION = "android.provider.Telephony.SMS_RECEIVED";
private TextToSpeech engine;

@Override
public void onReceive(Context context, Intent intent)
{
    Log.i("sms_receiver","within the onReceive method");
    if (intent != null
            && intent.getAction() != null
            && intent.getAction().compareToIgnoreCase(SMS_RECEIVE_ACTION) == 0)
    {
        Object[] vec = (Object[]) intent.getExtras().get("pdus");
        SmsMessage[] messages = new SmsMessage[vec.length];
        for (int i = 0; i < vec.length; i++)
        {
            messages[i] = SmsMessage.createFromPdu((byte[]) vec[i]);
            Log.i("sms_receiver", messages[i].getMessageBody());
            //speak the message
            engine.speak( messages[i].getMessageBody().toString(), 
                    TextToSpeech.QUEUE_ADD, null);
        }
    }
}
}

运行时,我得到一个错误:

java.lang.RuntimeException:无法暂停活动 java.lang.IllegalArgumentException:未注册的接收器:null


我做错了什么?

我认为registerReceiver应该在onResume上,而您必须在onPause上使用unregisterReceiver。另外,您是否在清单中添加了意图过滤器?“unRegisterReceiver”已在“onPause”上。意图筛选器位于清单上。为什么“registerReceiver”应该在“onResume”上?我不想在“onCreate”上做吗?