Vibración y sonido predeterminados en la notificación

93

Estoy tratando de obtener una alerta de vibración y sonido predeterminada cuando llegue mi notificación, pero hasta ahora no tuve suerte. Me imagino que tiene algo que ver con la forma en que configuro los valores predeterminados, pero no estoy seguro de cómo solucionarlo. ¿Alguna idea?

public void connectedNotify() {
    Integer mId = 0;
    NotificationCompat.Builder mBuilder =
            new NotificationCompat.Builder(this)
            .setSmallIcon(R.drawable.ic_notify)
            .setContentTitle("Device Connected")
            .setContentText("Click to monitor");

    Intent resultIntent = new Intent(this, MainActivity.class);

    TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
    stackBuilder.addParentStack(MainActivity.class);
    stackBuilder.addNextIntent(resultIntent);
    PendingIntent resultPendingIntent =     
          PendingIntent.getActivity(getApplicationContext(), 
          0, 
          resultIntent,  
          PendingIntent.FLAG_UPDATE_CURRENT);
    mBuilder.setContentIntent(resultPendingIntent);
    mBuilder.setOngoing(true);
    Notification note = mBuilder.build();
    note.defaults |= Notification.DEFAULT_VIBRATE;
    note.defaults |= Notification.DEFAULT_SOUND;
    NotificationManager mNotificationManager =
        (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
    mNotificationManager.notify(mId, note);

}
Dave Moore
fuente
3
Todas las respuestas solo reiteran alguna variación del código que ya tiene, y ninguna de ellas responde la pregunta en mi opinión. Su código se ve bien, AFAICT. Lo más probable es que solo falte android.permission.VIBRATEen AndroidManifest.xml.
Olaf Dietsche
Para quien pueda aplicar soluciones en este hilo y aún no tenga ninguna vibración en las notificaciones, es posible que primero deba habilitar la vibración de su canal de notificación. Eche un vistazo a esto: stackoverflow.com/a/47646166/8551764
Mostafa Arian Nejad

Respuestas:

203

Algunos códigos ficticios pueden ayudarte.

   private static NotificationCompat.Builder buildNotificationCommon(Context _context, .....) {
            NotificationCompat.Builder builder = new NotificationCompat.Builder(_context)
            .setWhen(System.currentTimeMillis()).......;
     //Vibration
        builder.setVibrate(new long[] { 1000, 1000, 1000, 1000, 1000 });

     //LED
        builder.setLights(Color.RED, 3000, 3000);

     //Ton
        builder.setSound(Uri.parse("uri://sadfasdfasdf.mp3"));

    return builder;
   }

Agregue a continuación el permiso para Vibración en el AndroidManifest.xmlarchivo

<uses-permission android:name="android.permission.VIBRATE" />
TeeTracker
fuente
114
La vibratefunción +1 requiere <uses-permission android:name="android.permission.VIBRATE" />permiso
ashakirov
1
En algunos casos, debe usar el formato argb de color hexadecimal, como 0xffffffff, en lugar de Color.White, porque existe una pequeña posibilidad de que el dispositivo del usuario use Color (RGB) para un parámetro ARGB y obtendrá el color incorrecto. Esto sucedió conmigo.
Beto Caldas
55
La vibración ahora tiene un retraso de 1000 ms. Si configura el primero en 0, se apagará instantáneamente. Es un patrón {retrasar, vibrar, dormir, vibrar, dormir}.
Tom
11
No he necesitado agregar <uses-permission android:name="android.permission.VIBRATE" />para trabajar.
Iqbal
1
¿Alguien sabe cómo usar setSound en API 26?
Rodrigo Manguinho
61

Una extensión de la respuesta de TeeTracker,

para obtener el sonido de notificación predeterminado, puede hacer lo siguiente

NotificationCompat.Builder mBuilder =
            new NotificationCompat.Builder(this)
            .setSmallIcon(R.drawable.ic_notify)
            .setContentTitle("Device Connected")
            .setContentText("Click to monitor");

Uri alarmSound = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
builder.setSound(alarmSound);

Esto le dará el sonido de notificación predeterminado.

nikoo28
fuente
35

Notificación Vibrar

mBuilder.setVibrate(new long[] { 1000, 1000});

Sonido

mBuilder.setSound(Settings.System.DEFAULT_NOTIFICATION_URI);

para más opciones de sonido

Cristiana chavez
fuente
2
Para el vibrador, asegúrese de incluir el <uses-permission android:name="android.permission.VIBRATE" />en su AndroidManifest.xml
Aaron Esau
¿Cuánto tiempo dura esta vibración? ¿O solo vibrará una vez?
Zapnologica
13

Me funciona bien, puedes probarlo.

 protected void displayNotification() {

        Log.i("Start", "notification");

      // Invoking the default notification service //
        NotificationCompat.Builder  mBuilder =
                new NotificationCompat.Builder(this);
        mBuilder.setAutoCancel(true);

        mBuilder.setContentTitle("New Message");
        mBuilder.setContentText("You have "+unMber_unRead_sms +" new message.");
        mBuilder.setTicker("New message from PayMe..");
        mBuilder.setSmallIcon(R.drawable.icon2);

      // Increase notification number every time a new notification arrives //
        mBuilder.setNumber(unMber_unRead_sms);

      // Creates an explicit intent for an Activity in your app //

        Intent resultIntent = new Intent(this, FreesmsLog.class);

        TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
        stackBuilder.addParentStack(FreesmsLog.class);

      // Adds the Intent that starts the Activity to the top of the stack //
        stackBuilder.addNextIntent(resultIntent);
        PendingIntent resultPendingIntent =
                stackBuilder.getPendingIntent(
                        0,
                        PendingIntent.FLAG_UPDATE_CURRENT
                );
        mBuilder.setContentIntent(resultPendingIntent);

      //  mBuilder.setOngoing(true);
        Notification note = mBuilder.build();
        note.defaults |= Notification.DEFAULT_VIBRATE;
        note.defaults |= Notification.DEFAULT_SOUND;

        mNotificationManager =
                (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
      // notificationID allows you to update the notification later on. //
        mNotificationManager.notify(notificationID, mBuilder.build());

    }
Selim Raza
fuente
10

Esta es una forma sencilla de llamar a la notificación mediante el uso de vibración y sonido predeterminados del sistema.

private void sendNotification(String message, String tick, String title, boolean sound, boolean vibrate, int iconID) {
    Intent intent = new Intent(this, MainActivity.class);
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    PendingIntent pendingIntent = PendingIntent.getActivity(this, 0 /* Request code */, intent,
            PendingIntent.FLAG_ONE_SHOT);
    Notification notification = new Notification();

    NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this);

    if (sound) {
        notification.defaults |= Notification.DEFAULT_SOUND;
    }

    if (vibrate) {
        notification.defaults |= Notification.DEFAULT_VIBRATE;
    }

    notificationBuilder.setDefaults(notification.defaults);
    notificationBuilder.setSmallIcon(iconID)
            .setContentTitle(title)
            .setContentText(message)
            .setAutoCancel(true)
            .setTicker(tick)
            .setContentIntent(pendingIntent);

    NotificationManager notificationManager =
            (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

    notificationManager.notify(0 /* ID of notification */, notificationBuilder.build());
}

Agregue el permiso de vibración si lo va a usar:

<uses-permission android:name="android.permission.VIBRATE"/>

Buena suerte,'.

Maher Abuthraa
fuente
¿Alguien puede decirme por qué la vibración no funciona cuando el teléfono está en una llamada? O ¿podemos hacer una notificación para forzar la vibración incluso cuando el teléfono está en llamada?
Me ayudó notificationBuilder.setDefaults (notification.defaults);
Saveen
@ user526206, no lo sé. Nunca lo he probado. Puede abrir una nueva pregunta ya que no tiene nada con el comportamiento de notificación.
Maher Abuthraa
7

Estoy usando el código de seguimiento y funciona bien para mí.

private void sendNotification(String msg) {
    Log.d(TAG, "Preparing to send notification...: " + msg);
    mNotificationManager = (NotificationManager) this
            .getSystemService(Context.NOTIFICATION_SERVICE);

    PendingIntent contentIntent = PendingIntent.getActivity(this, 0,
            new Intent(this, MainActivity.class), 0);

    NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(
            this).setSmallIcon(R.drawable.ic_launcher)
            .setContentTitle("GCM Notification")
            .setAutoCancel(true)
            .setDefaults(Notification.DEFAULT_ALL)
            .setStyle(new NotificationCompat.BigTextStyle().bigText(msg))
            .setContentText(msg);

    mBuilder.setContentIntent(contentIntent);
    mNotificationManager.notify(NOTIFICATION_ID, mBuilder.build());
    Log.d(TAG, "Notification sent successfully.");
}
Suresh Kumar
fuente
1

Para Kotlin puedes probar esto.

var builder = NotificationCompat.Builder(this,CHANNEL_ID)<br/>
     .setVibrate(longArrayOf(1000, 1000, 1000, 1000, 1000))<br/>
     .setSound(Settings.System.DEFAULT_NOTIFICATION_URI)
Sachin Shakya
fuente
1

// establecer audio de notificación

builder.setDefaults(Notification.DEFAULT_VIBRATE);
//OR 
builder.setDefaults(Notification.DEFAULT_SOUND);
Mayuri Khinvasara
fuente
1

Para admitir la versión> = 26 del SDK, también debe crear NotificationChanel y establecer un patrón de vibración y un sonido allí. Hay una muestra de código de Kotlin:

    val vibrationPattern = longArrayOf(500)
    val soundUri = "<your sound uri>"

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            val notificationManager =    
                 getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
            val attr = AudioAttributes.Builder()
                        .setUsage(AudioAttributes.USAGE_ALARM)
                        .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
                        .build()
            val channelName: CharSequence = Constants.NOTIFICATION_CHANNEL_NAME
            val importance = NotificationManager.IMPORTANCE_HIGH
            val notificationChannel =
                NotificationChannel(Constants.NOTIFICATION_CHANNEL_ID, channelName, importance)
                notificationChannel.enableLights(true)
                notificationChannel.lightColor = Color.RED
                notificationChannel.enableVibration(true)
                notificationChannel.setSound(soundUri, attr)
                notificationChannel.vibrationPattern = vibrationPattern
                notificationManager.createNotificationChannel(notificationChannel)
    }

Y este es el constructor:

 with(NotificationCompat.Builder(applicationContext, Constants.NOTIFICATION_CHANNEL_ID)) {
        setContentTitle("Some title")
        setContentText("Some content")
        setSmallIcon(R.drawable.ic_logo)
        setAutoCancel(true)    
        setVibrate(vibrationPattern)
        setSound(soundUri)
        setDefaults(Notification.DEFAULT_VIBRATE)
        setContentIntent(
            // this is an extension function of context you should build
            // your own pending intent and place it here
            createNotificationPendingIntent(
                Intent(applicationContext, target).apply {
                    flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
                }
            )
        )

        return build()
    }

Asegúrese de AudioAttributesser elegido correctamente para leer más aquí .

MeLine
fuente