1

我正在编写一个警报(有点)应用程序,它使用带有 RTC_WAKEUP 标志的 AlarmManager 注册广播意图,以在指定时间关闭。作品...

当接收到广播时,接收器启动一个活动,使用 STREAM_ALARM 流通过 MediaPlayer 播放铃声,并做一些其他的事情。一切正常,但如果在屏幕关闭时接收到广播,则活动正确启动但不播放铃声。如果在屏幕打开和解锁时收到,则可以正常工作并播放铃声。

编辑在播放铃声的活动中添加代码。

public void onCreate(Bundle bundle) {
    super.onCreate(bundle)
    ...
    Window window = getWindow();
    window.addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
    window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
    window.addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);
    window.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
    ringtonePlayer = new MediaPlayer();
    ...
    playRingtone();
}

private void playRingtone() throws IllegalArgumentException, SecurityException,      IllegalStateException, IOException {
    ringtonePlayer.setDataSource(prefs.getString(getRingTone(), RingtoneManager.getActualDefaultRingtoneUri(this, RingtoneManager.TYPE_RINGTONE).toString()));

    ringtonePlayer.setAudioStreamType(AudioManager.STREAM_ALARM);
    ringtonePlayer.setWakeMode(this, PowerManager.PARTIAL_WAKE_LOCK);
    ringtonePlayer.setLooping(true);
    ringtonePlayer.prepare();
    ringtonePlayer.start();
    Log.i(LOG_TAG, "Ringtone started");
}
4

3 回答 3

5

这是一篇较旧的帖子,但我遇到了同样的问题,并且认为我知道这里缺少什么。这只是一个假设,没有看到更多您的代码,但通常,如果您使用 mediaPlayer,最好在 onStop() 和 onPause() 中停止它(或在 onPause() 中暂停它)。如果你已经这样做了,这里有一个可能的解决方案。在 onPause 或 onStop 中,不要调用:

 mMediaPlayer.stop();

(以及所有需要的东西,如发布等)。因为当您调用 WakeLock 并设置标志以保持屏幕开启等时,onStop() 和 onPause() 会在 onCreate 完成后为您的活动多次调用。这是我在装有 Android 4.1.2 的设备 Samsung Galaxy s3 上检测到的内容 相反,要确保 MediaPlayer 在完成后停止,请执行以下操作:

   if(this.isFinishing()){

        mMediaPlayer.stop();

   }

有了这个,您可以确保仅在您的活动真正完成时才调用它。这应该有效。

于 2013-08-01T05:05:39.783 回答
1

在 onResume 中调用 play - 这对我有用

public class AlarmActivity extends Activity {
    private Uri uri = null;
    private int volume;
    private MediaPlayer mp = null;

    private void play() {
        if (uri == null) {
            return;
        }
        mp = new MediaPlayer();
        AudioManager audioManager = (AudioManager)getSystemService(Context.AUDIO_SERVICE);
        audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC) * volume / 100, 0);
        mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
        mp.setOnPreparedListener(mpOnPrepared);
        mp.setOnCompletionListener(mpOnCompletion);
        try {
            mp.setDataSource(this, uri);
            mp.prepare();
        } catch (IOException e) {
            mp.release();
            mp = null;
            return;
        }
    }

    private OnPreparedListener mpOnPrepared = new OnPreparedListener()
    {
        @Override
        public void onPrepared(MediaPlayer mp)
        {
            mp.start();
        }
    };

    private OnCompletionListener mpOnCompletion = new OnCompletionListener() {
        @Override
        public void onCompletion(MediaPlayer mp) {
            mp.release();
            mp = null;
        }
    };

    private void stop() {
        if (mp != null) {
            mp.release();
            mp = null;
        }
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        setContentView(R.layout.activity_alarm);

        getWindow().addFlags(
            WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON |
            WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON |
            WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED |
            WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);

        SharedPreferences sp = getSharedPreferences("settings", MODE_PRIVATE);
        uri = Uri.parse(sp.getString("uri", ""));
        volume = sp.getInt("volume", 100);
    }

    @Override
    protected void onResume () {
        super.onResume();

        play();
    }

    @Override
    protected void onPause () {
        super.onPause();

        stop();

        finish();
    }
}
于 2015-04-01T12:38:07.473 回答
0

尝试添加

getWindow().addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);   
getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);

Activity那个开始MediaPlayer

你需要用它来打开屏幕,如果你愿意,在Activity开始之前解锁它。

于 2013-04-16T23:19:11.507 回答