我正在编写一个警报(kinda)应用程序,该应用程序使用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");
}

===============>>#1 票数:5

这是一篇较旧的文章,但我遇到了同样的问题,并认为我知道这里缺少什么。 这只是一个假设,没有看到更多代码,但是通常,如果使用mediaPlayer,则最好在onStop()和onPause()中停止它(或在onPause()中暂停它)。 如果您已完成此操作,则可以使用一种可能的解决方案。 在onPause或onStop中,请勿致电:

 mMediaPlayer.stop();

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

   if(this.isFinishing()){

        mMediaPlayer.stop();

   }

这样,您可以确保仅在您的活动真正完成时才调用它。 这应该工作。

===============>>#2 票数:1

在onResume中呼叫播放-对我来说这项工作

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

===============>>#3 票数:0

尝试添加

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

到启动MediaPlayerActivity

您需要使用此功能打开屏幕,然后根据需要在Activity开始之前将其解锁。

  ask by Inn0vative1 translate from so

未解决问题?本站智能推荐:

关注微信公众号