1. 程式人生 > >推送通知自定義提示聲音

推送通知自定義提示聲音

在自定義推送通知聲音的時候,推送如果不是使用自定義訊息,而是應用平臺預設的通知的話,一般可能沒有辦法設定自定義的聲音。解決辦法。

為了修改自定義聲音可以使用自定義訊息,但是為了不增加額外的工作量,可以在receiver接收到通知的時候自定義播放一段鈴聲。

播放鈴聲的程式碼片段:

public void playSound() {  
        String uri = "android.resource://" + context.getPackageName() + "/"+R.raw.mysound;  
        Uri no=Uri.parse(uri);  
          
        Ringtone r = RingtoneManager.getRingtone(getApplicationContext(),  
                no);  
        r.play();  
    } 
但是有的推送平臺的推送會遇到一個問題就是:在app使用者登入時,會有時一次收到n多個推送的情況,如果每次都簡單的用以上片段播放一段鈴聲的話,聲音一下子疊加在一起,很亂,使用者體驗很差。

為解決這個問題可以將Ringtone物件設定為成員變數,類中只保留一個該物件,如果物件不為null就不再建立該物件,如果鈴聲沒有播放完之前不再次播放鈴聲。

修改程式碼片段:

//播放自定義的聲音
    public synchronized void playSound(Context context) {
        if (!allowMusic) {
            return;
        }
        if (mRingtone == null) {
            LogUtil.log("----------初始化鈴聲----------");
            String uri = "android.resource://" + context.getPackageName() + "/" + R.raw.order_remind;
            Uri no = Uri.parse(uri);
            mRingtone = RingtoneManager.getRingtone(context.getApplicationContext(), no);
        }
        if (!mRingtone.isPlaying()) {
            LogUtil.log("--------------播放鈴聲---------------" + mRingtone.isPlaying());
            mRingtone.play();
        }
    }

通過呼叫isPlaying()方法就可以監聽有鈴聲沒有播放完。

這裡面有一個問題就是:不用將Ringtone只簡單的變為成員變數,為了使該類中只有一個改物件,應該將物件變為靜態:

private static Ringtone mRingtone;
否則:在走該方法的時候mRingtone依然為null,每次依然都會建立該物件。因為mRingtone是新建立物件,所有isPlaying()返回的都是false,達不到想要的目標。(為什麼會這樣,內部原因還不是很清楚,仍在學習中。)