Android 无法使用广播接收器执行操作

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

我在我的应用程序中有一个活动,当收到一个特定的关键字作为消息时,它会播放蜂鸣器,但我的代码根本不起作用。根据Logcat,它接收消息

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