2010-07-28 33 views
3

我在我的簡單定時器應用程序(早期測試階段)中使用通知,發現可能有5%到20%的時間我發出通知,聲音沒有播放。通知在所有其他方面都正確顯示,包括LED閃光燈,但保持沉默。我已經用臨時額外的日誌行確認了我使用的聲音URI是合理的,並且事實上在工作情況和沒有工作的情況下是相同的。我來總結一下代碼中設置了通知,如果我做的身世愚蠢的事情:爲什麼我的通知有時會使用SD卡的鈴聲保持沉默?

// 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)這個喚醒鎖定暫時:

+ 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 One上已經出現。在2.1版本上沒有看到,但在該版本上使用得並不多,並且在1.6版本的G1上沒有看到它,在那裏使用了幾個月。已經在一天的所有時間內看到,只有來自SD卡的聲音 以及來自內部存儲器 的聲音。 截至2011年1月的Android 2.2.1版本,它僅與SD卡上的鈴聲一起發生。我也搜索了Android bug tracker有點,無濟於事。

提起它in my app's issue tracker但它現在好像可能是一個操作系統錯誤。當SD卡的音調不同時,我什麼也不做;它只是應用程序所關心的URI。

回答

1

這個工作對我來說:

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

我不明白,在你的代碼。

希望也適合你。

+0

確實*這會與我想要使用的特定聲音和燈光設置發生衝突,但它給了我使用振動的想法,這很有用。也許即使聲音偶爾失敗,振動也不會。 – 2010-12-02 23:43:34

相關問題