【问题标题】:Why does MediaPlayer continue playing audio with screen off为什么 MediaPlayer 在屏幕关闭的情况下继续播放音频
【发布时间】:2019-01-07 13:35:49
【问题描述】:

The documentation解释

使用唤醒锁

在设计播放媒体的应用程序时 背景,设备可能会在您的服务运行时进入睡眠状态。 因为 Android 系统会尝试节省电池,而设备 正在休眠,系统会尝试关闭手机的任何功能 那些不是必需的,包括 CPU 和 WiFi 硬件。 但是,如果您的服务正在播放或流式传输音乐,您希望 防止系统干扰您的播放。

那么,当我关闭屏幕时,为什么我的音频会继续播放?

Other answers 强化我的信念

如果您想在活动不在的情况下继续播放音乐 前台,你需要使用服务。

但我的手机没有停止播放音频。
请注意,我问这个问题是为了了解发生了什么,不是因为我想知道当屏幕变暗时我如何pause the music

我没有使用服务,没有向我的清单添加"android.permission.WAKE_LOCK" 权限,并且正在 UI 线程中工作。 (为什么这首先不会导致 ANR,但 UI 似乎保持响应。)

Uri songUri = Uri.fromFile(new File(firstSong.getPath())); 
try {
    Timber.d("The following error messages regarding QCMediaPlayer can hopefully be safely ignored. See https://stackoverflow.com/questions/24501086/why-mediaplayer-throws-not-present-error-when-creating-instance-of-it");
    MediaPlayer mediaPlayer = new MediaPlayer();
    mediaPlayer.setAudioAttributes(new AudioAttributes.Builder()
            .setUsage(AudioAttributes.USAGE_MEDIA)
            .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
            .setLegacyStreamType(STREAM_MUSIC).build());
    mediaPlayer.setDataSource(getApplicationContext(), songUri);
    mediaPlayer.prepare(); // TODO: use prepareAsync instead
    mediaPlayer.start();
} catch (IllegalArgumentException | IOException e){
    Timber.w("File %s does not exist.", songUri);
}

mediaPlayer 的实例化实际上会导致 LogCat 中出现错误,但 I doubt it is relevant。反正就是这样:

E/ExtMediaPlayer-JNI: QCMediaPlayer could not be located....
E/MediaPlayer-JNI: JNIMediaPlayerFactory: bIsQCMediaPlayerPresent 0
E/ExtMediaPlayer-JNI: QCMediaPlayer could not be located....
E/MediaPlayer-JNI: JNIMediaPlayerFactory: bIsQCMediaPlayerPresent 0

【问题讨论】:

  • 您是否尝试在 OnPause 方法中释放您的媒体播放器?
  • 不,我没有。但是如果只暂停发布的媒体播放器,那么文档中提到的部分 WakeLock 根本不需要

标签: android


【解决方案1】:

您的应用由操作系统自行决定。仅仅因为它可以关闭应用程序并不意味着它。或者它可能会选择延迟,等待资源变得更加有限,然后再终止您的应用程序。不同的设备和 OEM 实施将在不同的时间做出这些决定,这取决于设备的动态状态。

此外,仅仅因为您的最后一个Activity 已被销毁并不意味着您的应用程序将被终止。主线还在。它可能正在运行CountDownTimer,或者等待广播意图等。毕竟,如果您的应用程序有事要做,操作系统为什么要干预(如果没有必要)?

关闭屏幕不会强制设备进入睡眠状态(尽管打开屏幕会阻止设备进入睡眠状态)。在屏幕关闭的情况下,对于具有有效WakeLock 打开、设备维护期、广播、接收数据包等的应用程序,设备将继续保持唤醒状态。如果设备未处于睡眠状态,您的应用程序将继续执行 (即使不是您的应用保持唤醒状态)。

此外,Android 通常可以随时终止任何应用。它可以终止前台服务,即使它们持有WakeLock。当然,您会期望不那么重要的应用程序首先被终止,但随着资源变得越来越有限,操作系统必须变得越来越激进。

这就是为什么您应该描述您的应用对操作系统的相对重要性(使用Services、前台服务、Wakelocks 等)。

【讨论】:

    猜你喜欢
    • 2021-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多