2015-06-27

[Android] 如何設定"提醒"的聲音、閃光、震動形式. How to set the Sound, Lights, and Vibrate of a Notification

If you don't want any ringtone, don't set Notification.DEFAULT_SOUND to setDefault(), and don't call setSound(ringtoneUri) of NotificationCompat.Builder.

 If you just want default ringtone, call setDefault(Notification.DEFAULT_SOUND);

 If you just want default vibrate, call setDefault(Notification.DEFAULT_VIBRATE);

 If you just want default lights, call setDefault(Notification.DEFAULT_LIGHTS);

If you need a custom ringtone, call setSound(ringtoneUri), but don't call setDefault(DEFAULT_ALL) or setDefault(DEFAULT_SOUND).
Because setDefault(DEFAULT_ALL) or setDefault(DEFAULT_SOUND) make setSound(ringtoneUri) useless.

Check here about how to use Ringtone Picker to get a ringtone Uri.
http://codeviki.blogspot.tw/2015/06/android-show-ringtone-picker-activity.html

Check here about how to get ringtone title from ringtone Uri.
http://codeviki.blogspot.tw/2015/06/android-get-ringtone-title-from-ringtone-uri.html


static Notification buildNotification(
 boolean vibrateEnabled,
 boolean lightsEnabled,
 String ringtoneUriString)
{
 int defaults = 0;

 // set vibrate to defaults
 if (vibrateEnabled) {
  // use default vibrate pattern
     defaults |= Notification.DEFAULT_VIBRATE;
 }

 // set lights to defaults
 if (lightsEnabled) {
     // use default light blink pattern
     defaults |= Notification.DEFAULT_LIGHTS;
 }

 // parse ringtone
 Uri ringtoneUri = null;
    try {
        ringtoneUri = Uri.parse(ringtoneUriString);
    } catch (Exception ignored) {
        Logcat.w(ignored, "Parse notification ringtone uri fail. "
            + "ringtoneUriString = ", ringtoneUriString);
        // if parse ringtone fail, use default ringtone
        defaults |= Notification.DEFAULT_SOUND;
    }
 
 NotificationCompat.Builder builder =
     new NotificationCompat.Builder(context)
         .setSmallIcon(R.drawable.my_notification_icon)
         .setContentTitle("title")
         .setContentText("contentText")
         .setAutoCancel(true)
         .setDefaults(defaults);

 // if ringtoneUriString is empty string, the uri won't be null
    if (!ringtoneUriString.isEmpty() && ringtoneUri != null) {
     builder.setSound(ringtoneUri);
 }

 return builder.build();
}