Android 无法使用广播接收器执行操作
我在我的应用程序中有一个活动,当收到一个特定的关键字作为消息时,它会播放蜂鸣器,但我的代码根本不起作用。根据Logcat,它接收消息Android 无法使用广播接收器执行操作,android,android-broadcast,Android,Android Broadcast,我在我的应用程序中有一个活动,当收到一个特定的关键字作为消息时,它会播放蜂鸣器,但我的代码根本不起作用。根据Logcat,它接收消息 public class SmsReceiver extends BroadcastReceiver { int k = 0; public static final String SMS_EXTRA_NAME = "pdus"; MediaPlayer mPlay = new MediaPlayer(); p
public class SmsReceiver extends BroadcastReceiver {
int k = 0;
public static final String SMS_EXTRA_NAME = "pdus";
MediaPlayer mPlay = new MediaPlayer();
public void onReceive(Context context, Intent intent) {
// Get the SMS map from Intent
Bundle extras = intent.getExtras();
String body = "";
SharedPreferences myPrefs = context.getSharedPreferences("test", Context.MODE_PRIVATE);
String password = myPrefs.getString("password", "a");
String find = "find " + password;
mPlay.create(context, R.raw.music);
AudioManager am = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
am.setStreamVolume(AudioManager.STREAM_MUSIC, am.getStreamMaxVolume(AudioManager.STREAM_MUSIC), 0);
mPlay.setAudioStreamType(AudioManager.STREAM_MUSIC);
if (extras != null) {
// Get received SMS array
Object[] smsExtra = (Object[]) extras.get(SMS_EXTRA_NAME);
for (int i = 0; i < smsExtra.length; ++i) {
SmsMessage sms = SmsMessage.createFromPdu((byte[]) smsExtra[i]);
body = sms.getMessageBody().toString();
if (body.equalsIgnoreCase(find)) {
this.abortBroadcast();
int dur = mPlay.getDuration();
for (int j = 0;; j += dur) {
if (k == 1)
break;
mPlay.start();
try {
Thread.sleep(dur);
} catch (InterruptedException e) {
}
}
}
}
}
}
@Override
public void onKeyDown() {
k = 1;
}
public void onDestroy() {
mPlay.stop();
mPlay.release();
}
}
公共类SmsReceiver扩展了BroadcastReceiver{
int k=0;
公共静态最终字符串SMS_EXTRA_NAME=“pdus”;
MediaPlayer mPlay=新MediaPlayer();
公共void onReceive(上下文、意图){
//从Intent获取SMS映射
Bundle extras=intent.getExtras();
字符串体=”;
SharedReferences myPrefs=context.getSharedReferences(“test”,context.MODE\u PRIVATE);
字符串密码=myPrefs.getString(“密码”,“a”);
字符串find=“find”+密码;
mPlay.create(上下文,R.raw.music);
AudioManager am=(AudioManager)context.getSystemService(context.AUDIO\u服务);
am.setStreamVolume(AudioManager.STREAM_MUSIC,am.getStreamMaxVolume(AudioManager.STREAM_MUSIC),0);
mPlay.setAudioStreamType(AudioManager.STREAM_MUSIC);
如果(附加值!=null){
//获取接收到的SMS阵列
Object[]smsExtra=(Object[])extras.get(SMS\u EXTRA\u NAME);
对于(int i=0;i
您设置好了吗
<uses-permission android:name="android.permission.RECEIVE_SMS" />
<uses-permission android:name="android.permission.READ_SMS" />
如果这不能回答您的问题,请告诉我们什么不起作用。另一个改进是为您的循环执行此操作:
mp = MediaPlayer.create(context, R.raw.music);
mp.setOnCompletionListener(new OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
mp.start();
}
});
mp.start();
谢谢你的回答。它工作得很好。if语句下的代码仍然相同,无法中断for循环以播放媒体对象。要么是因为我无法重写onKeyDown(),要么是因为我使用了错误的方法。。请帮帮我。!你想干什么?是否要播放循环音乐并使用“onKeyDown()”停止播放?是!音频播放正确,但我的for循环没有中断。原因可以是上述两种情况中的任何一种。好吧,您想在用户按下一个键之前播放循环吗?是的!我想循环,直到用户按下键。您可以从所讨论的代码中看到我这样做的方法。
mp = MediaPlayer.create(context, R.raw.music);
mp.setOnCompletionListener(new OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
mp.start();
}
});
mp.start();