Java Android-接收器未注册
我正在尝试编写一个简单的应用程序,将使用textToSpeech阅读收入短信,使用broadcastReceiver 这是一项活动: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
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”上做吗?