【发布时间】:2010-07-28 00:04:04
【问题描述】:
我在我的简单计时器应用程序中使用通知(早期测试阶段),发现在我发出通知的 5% 到 20% 的时间里,声音没有播放。通知在所有其他方面都正确显示,包括 LED 闪光灯,但没有声音。我已经通过临时额外的日志行确认我正在使用的声音 URI 是合理的,并且实际上在可行的情况下和不可行的情况下是相同的。我将总结设置通知的代码,以防我做一些非常愚蠢的事情:
// in a place called from onReceive()...
NotificationManager notifications = ...;
Notification n = new Notification(R.drawable.icon, text, nextMillis);
n.setLatestEventInfo(...);
n.flags = Notification.FLAG_NO_CLEAR | FLAG_SHOW_LIGHTS;
n.ledOnMS = 250; n.ledOffMS = 1250; n.ledARGB = 0xff2222ff;
n.audioStreamType = AudioManager.STREAM_ALARM;
n.sound = myUri;
notifications.notify((int)id, n);
这里是the real thing。我发现的唯一共同因素是,在有问题的情况下,手机处于睡眠状态(屏幕关闭超过 30 秒)。通知是requested from a BroadcastReceiver,已从RTC_WAKEUP alarm 唤醒。想到的故障模式是设备过早地回到睡眠状态,但 logcat 中没有任何迹象表明这一点。事实上,我在 logcat 中看不到成功和丢失声音之间的任何区别。为了解决睡眠问题,如果有的话,我暂时添加了(this commit)这个 WakeLock:
+ PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "Timer");
+ wl.acquire();
+ Log.d(TimerActivity.TAG, "Got wake lock");
notifications.notify((int)id, n);
Log.d(TimerActivity.TAG, "Notified!");
+ try {
+ Thread.sleep(1000);
+ } catch (InterruptedException e) { e.printStackTrace(); }
+ Log.d(TimerActivity.TAG, "Released wake lock");
+ wl.release();
...自从我添加了这个问题之后就没有发现这个问题,但这可能是巧合,这显然是一个丑陋的 hack,当我实际发布这个项目时我宁愿避免(目前只有一个其他人使用据我所知)。
这已在运行 Android 2.2 (Froyo) 的两台 Nexus One 上看到。它在 2.1 上没有出现,但在那个版本上用的不多,在 G1 上的 1.6 上也没有出现过,在那里使用了几个月。在一天中的任何时候都可以看到它,只有来自 SD 卡的声音 和来自内部存储的声音。 截至 2011 年 1 月,在 Android 2.2.1 上它只发生在 SD 卡中的铃声。我还搜索了 Android bug tracker 一点,但无济于事。
提交了in my app's issue tracker,但现在看来它可能是一个操作系统错误。当声音来自 SD 卡时,我没有做任何不同的事情;就应用而言,它只是一个 URI。
【问题讨论】:
标签: android audio notifications