0

我的问题是一头雾水:Android 4.x / Jelly Bean 是怎么回事?服务、粘性、前景等方面是否存在已知问题?

背景故事:我在各种 Android 设备和模拟器上成功测试了我的音乐播放器应用程序,然后最近又在物理果冻豆设备(三星 Rugby Pro)上测试了我的音乐播放器应用程序。我发现当屏幕关闭时,该MediaPlayer onCompletion功能没有被一致地触发。大多数情况下它不会被解雇几分钟。当屏幕打开时,无论我的活动是否显示,应用程序都可以正常工作。

(在 Gingerbread、KitKat、Lollipop 或 Marshmallow 上没有问题。我有这些版本的物理设备,它们都可以完美运行。)

设备信息:

  • 操作系统版本:3.0.31-656355
  • 发布:4.1.1
  • 设备:科曼切特
  • 型号:三星-SGH-I547
  • 产品:科曼彻
  • 品牌:三星
  • 显示:JRO03L.I547UCBLL1
  • CPU_ABI:armeabi-v7a
  • CPU_ABI2:armeabi
  • 硬件:qcom
  • 编号:JRO03L
  • 制造商:三星
  • 用户:se.infra
  • 主持人:SEP-125
4

1 回答 1

0

我想通了;我希望这对你也有帮助......

问题在于触发onCompletion事件,而是reset()无限期地阻塞。我之前将此归因于Android 问题 #959: MediaPlayer “crash” (deadlocks the call thread) 在重置或释放未使用的 MediaPlayer 时,这对我的情况不正确。

我的特殊问题是我的测试设备上的激进睡眠行为。当我在飞行模式下运行少数其他应用程序时会弹出此错误,因为对reset()(or release()) 的调用也会释放MediaPlayer实例的WakeLock. 一旦发生这种情况,设备将进入休眠状态,并且代码似乎会阻止该功能。我无法通过附加和/或插入调试器来重现此问题,因为其中任何一个都阻止了设备睡眠!

我的解决方案是创建一个单独管理WakeLock的,我acquire()基本上是在播放开始时和release()所有歌曲播放完之后。从技术上讲,我仅在活动已暂停并在恢复时释放时才执行此操作,因为WakeLock在设备已经唤醒时没有必要保持 a 。

PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE);
WakeLock wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "MyTag");
wakeLock.acquire();
于 2016-04-27T15:11:28.843 回答