为什么我的通知有时会沉默来自SD卡的铃声?

时间:2010-07-28 00:04:04

标签: android audio notifications

我在我的简单计时器应用程序(早期测试阶段)中使用通知,并发现可能有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();

...自从我添加了这个问题以后就没有看到这个问题了,但这可能是巧合,这显然是一个丑陋的黑客攻击,当我实际发布这个项目时我宁愿避免(目前只有一个人使用我知道的。)

在两台运行Android 2.2(Froyo)的Nexus上已经看到了这一点。它没有出现在2.1上,但是在那个版本上并没有使用太多,并且在G1上没有看到1.6,它在那里使用了几个月。在一天中的任何时候都可以看到,只有来自SD卡的声音 和内部存储截至2011年1月,在Android 2.2.1上,它只发生在SD卡的铃声中。我也搜索了Android bug tracker,但无济于事。

提起它in my app's issue tracker但现在看来它可能是操作系统错误。当音调来自SD卡时我没有什么不同;就应用程序而言,它只是一个URI。

1 个答案:

答案 0 :(得分:1)

这对我有用:

notification.defaults = Notification.DEFAULT_SOUND
                      | Notification.DEFAULT_VIBRATE
                      | Notification.DEFAULT_LIGHTS;

我在你的代码中没有看到。

希望这对你也有用。