it-swarm.com.de

Deaktivieren Sie die Vibration für eine Benachrichtigung

Ich schreibe eine App mit Benachrichtigung. Die Entwicklerrichtlinien von Google ermutigen die Entwickler, Einstellungen zum Anpassen der Benachrichtigungen bereitzustellen (Vibration deaktivieren, Benachrichtigungston einstellen ...). Ich versuche, die Vibration für Benachrichtigungen zu deaktivieren, wenn der Benutzer dies so eingestellt hat.

Ich verwende NotificationCompat.Builder, um die Benachrichtigung zu erstellen, wie folgt:

NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(Application.getContext())
            .setDefaults(Notification.DEFAULT_ALL)
            .setPriority(Notification.PRIORITY_MAX)
            .setSmallIcon(R.drawable.ic_launcher)
            .setLargeIcon(largeIconBitmap)
            .setAutoCancel(true)
            .setContentIntent(resultPendingIntent)
            .setContentTitle(title)
            .setContentText(content);

Ich habe verschiedene Möglichkeiten versucht, Benachrichtigungen zu deaktivieren:

notificationBuilder.setVibrate(null);

notificationBuilder.setVibrate(new long[]{0l, 0l});

notificationBuilder.setDefaults(Notification.DEFAULT_ALL | ~Notification.DEFAULT_VIBRATE);

notificationBuilder.setDefaults(Notification.DEFAULT_LIGHTS | Notification.DEFAULT_SOUND);`

Ich habe auch versucht, die Benachrichtigung zu erstellen und die Werte für das resultierende Objekt zu ändern:

Notification notification = notificationBuilder.build();
notification.vibrate = null;

Das Telefon vibriert jedoch immer noch, wenn die Benachrichtigung angezeigt wird.

Wie kann ich die Vibration für Benachrichtigungen deaktivieren?

24
nstCactus

Nach einer langen Trial & Error-Sitzung habe ich endlich verstanden, was falsch ist.

Das Problem liegt in dieser Anweisung notificationBuilder.setDefaults(Notification.DEFAULT_ALL).

Unabhängig davon, welchen Parameter Sie an notificationBuilder.setVibrate() übergeben, nachdem Sie DEFAULT_ALL oder DEFAULT_VIBRATE eingestellt haben, wird er unbemerkt verworfen. Jemand bei Google muss sich entschieden haben, setDefaults eine höhere Priorität als setVibrate zu geben.

So habe ich die Vibration für Benachrichtigungen in meiner App deaktiviert:

notificationBuilder.setDefaults(Notification.DEFAULT_LIGHT | Notification.DEFAULT_SOUND)
                   .setVibrate(new long[]{0L}); // Passing null here silently fails

Dies funktioniert, fühlt sich aber nicht richtig an, um einen neuen long[] zu initialisieren, nur um die Vibration zu deaktivieren.

48
nstCactus

Sie werden nicht angehalten, weil Sie "setDefaults(Notification.DEFAULT_ALL)" verwenden. Wenn Sie die Vibration und den Sound stoppen möchten, entfernen Sie diese Zeile, oder wenn Sie den Standardton verwenden und die Vibration stoppen müssen. Ich denke, Sie müssen setDefaults(Notification.DEFAULT_SOUND) usw. verwenden.

3

.setVibrate(null) arbeitet für mich - und eine bessere Lösung als das Erstellen eines unnötigen langen [].

Ergebnis: Das Gerät vibriert nicht und auch in LogCat gibt es kein Murren. :)

1
private void removeSoundAndVibration(Notification notification) {
        notification.sound = null;
        notification.vibrate = null;
        notification.defaults &= ~DEFAULT_SOUND;
        notification.defaults &= ~DEFAULT_VIBRATE;

Dieser Code stammt aus der Notification Compat-API-Klasse. Dies sollte funktionieren, fügen Sie all dies Ihrem Builder hinzu.

0
Bipin
notification.vibrate = new long[] { -1 };

Dieser Code funktioniert für mich.

0
Houssin Boulla