首页 > 代码库 > android 在短信发送界面, 短信发送失败时,提示音不完整,会被中断

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()这种方法或者新定义一个方法.

android 在短信发送界面, 短信发送失败时,提示音不完整,会被中断