android 在簡訊發送介面, 簡訊發送失敗時,提示音不完整,會被中斷
1. 當一條SMS到來, 此時SMS是unseen狀態, 就會彈出Notification提示使用者
2. 但如果處於同一個連絡人的介面下, 使用者會立刻看到這條SMS, 此時這條SMS會被快速的標記為seen, 並取消Notification, 所以使用者會聽到鈴聲響了一下又中斷了
3. Fail的簡訊也是同樣的原理, 一開始這條fail的簡訊會被標記為unseen, 但同時因為處於同一個介面下, 已經看到了這條Fail的資訊, 所以也會出現這個問題.
現在的情況是新來SMS有一個feature, 判斷當前處於同一個連絡人介面下時, 不再彈出Notification, 取而代之是輕聲響鈴一下, 但不彈出Notification. 如果你認可這個feature, 我們可以把這個feature擴充到fail的資訊上.
你看Mms的code, 裡面有個MessagingNotification.java, 其中一個方法是blockingUpdateNewMessageIndicator, 它裡面有一句:
synchronized (sCurrentlyDisplayedThreadLock) {
我們可以把這段話copy到notifyFailed這個方法裡,
也就是在
boolean enabled = NotificationPreferenceActivity.getNotificationEnabled(context);
if (!enabled) {
return;
}
之後,加上
NotificationProfile notiProf = getNotificationProfileByThreadId(context, threadId);
synchronized (sCurrentlyDisplayedThreadLock) {
Log.d(TAG, "newMsgThreadId = " + threadId + "sCurrentlyDisplayedThreadId = " + sCurrentlyDisplayedThreadId);
if (threadId > 0 && threadId == sCurrentlyDisplayedThreadId) {
if (DEBUG) {
Log.d(TAG, "blockingUpdateNewMessageIndicator: newMsgThreadId == " +
"sCurrentlyDisplayedThreadId so NOT showing notification," +
" but playing soft sound. threadId: " + threadId);
}
playInConversationNotificationSound(context, notiProf);
return;
}
}
同時,
MessagingNotification.java中,因為notifySendFailed()傳遞給notifyFailed()的threadId永遠都是0,所以麻煩你確認一下這裡是否已經改成了有拿到threadId的方式:
在Mms code中SmsReceiverService.java的函數messageFailedToSend()最後添加long threadId = MessagingNotification.getSmsThreadId(this, uri);就獲得了正確的threadId,然後調用notifySendFailed(), 可能需要配合修改一下notifySendFailed()這個方法或者新定義一個方法.