2 votes

Android 10 - comment désactiver la vibration de la sonnerie sans activer la fonction "Ne pas déranger" ?

Sur Android 10 J'essaie de désactiver la vibration pour "Ring Volume".
J'essaie donc d'atteindre l'état de l'image, que je peux atteindre via l'interface utilisateur - de manière programmatique.

  • Vibration désactivée du volume de la sonnerie
  • Ne pas déranger mode off

enter image description here

Problème :

J'ai essayé d'utiliser le AudioManager.setRingerMode() Ses spécifications disent :

    /**
     * Sets the ringer mode.
     * <p>
     * Silent mode will mute the volume and will not vibrate. Vibrate mode will
     * mute the volume and vibrate. Normal mode will be audible and may vibrate
     * according to user settings.
     * <p>This method has no effect if the device implements a fixed volume policy
     * as indicated by {@link #isVolumeFixed()}.
     * * <p>From N onward, ringer mode adjustments that would toggle Do Not Disturb are not allowed
     * unless the app has been granted Do Not Disturb Access.
     * See {@link NotificationManager#isNotificationPolicyAccessGranted()}.
     * @param ringerMode The ringer mode, one of {@link #RINGER_MODE_NORMAL},
     *            {@link #RINGER_MODE_SILENT}, or {@link #RINGER_MODE_VIBRATE}.
     * @see #getRingerMode()
     * @see #isVolumeFixed()
     */
    public void setRingerMode(int ringerMode) {

Il semble que ce serait le moyen d'atteindre l'État sur l'image.

Mais le code ci-dessous active le mode "Ne pas déranger". Ce qui, en dépit de la désactivation de la vibration a aussi beaucoup d'autres effets : supprimer les notifications etc. que je ne veux pas activer.

Voir l'image ci-dessous

final AudioManager audio = (AudioManager) mContext.getSystemService(mContext.AUDIO_SERVICE);
audio.setRingerMode(AudioManager.RINGER_MODE_SILENT);

L'état sur l'image ci-dessus est-il inaccessible par programme ?
Selon ce fil de discussion - Activer le mode silencieux dans Android sans déclencher la fonction Ne pas déranger il est inaccessible ?

Ne pas déranger s'active sur RINGER_MODE_SILENT

enter image description here

1voto

Skip Points 1285

J'en ai trouvé d'autres sur le comportement décrit. Le mode DND s'active - lorsque

  1. Il y avait une commande pour passer en mode vibration. audioManager.setRingerMode(AudioManager.RINGER_MODE_VIBRATE);
  2. Lorsque le téléphone (ou l'émulateur dans mon cas) ne prend pas en charge la vibration.

Pour prendre en charge les modes vibreur, silencieux et normal, et la possibilité de régler le volume sans passer en mode DND enter image description here enter image description here enter image description here Je fais ce qui suit :

private void adjustVolume(double ringAndNotificationsVolumeInPercent, int ringMode) {

    // ringer mode applies to notification
    final AudioManager audioManager = (AudioManager) context.getSystemService(context.AUDIO_SERVICE);

     // ALWAYS set the ringer mode, cause changing the volume might implicitly change the mode
    switch (ringMode) {
        case AudioManager.RINGER_MODE_SILENT:
            /**
             * This is a tricky one:
             *
             * The goal is - to just disable Vibration and set volume to 0.
             *
             * using
             * audioManager.setRingerMode(AudioManager.RINGER_MODE_SILENT);
             * sets the phone to to "DontDisturb" mode,
             * having a lot of side effects: like supressing notifications etc.
             *
             * Instead - setting the phone to "RINGER_MODE_NORMAL",
             * then adjusting the volume - has the correct effect.
             */
            audioManager.setRingerMode(AudioManager.RINGER_MODE_NORMAL);
            audioManager.adjustStreamVolume(AudioManager.STREAM_NOTIFICATION, AudioManager.ADJUST_MUTE, AudioManager.FLAG_VIBRATE);
            break;

        case AudioManager.RINGER_MODE_VIBRATE:
            Log.d(TAG, "vibrate mode");
            if (utilsVolume.isDontDisturbOff()) {

                // if there is no vibrate mode - the OS may set the phone to DontDisturb
                audioManager.setRingerMode(AudioManager.RINGER_MODE_VIBRATE);
            } else {
                Log.d(TAG, "Cant enable vibration mode, cause the Dont DIsturb Mode is on. It would cause ");
            }
            break;

        case AudioManager.RINGER_MODE_NORMAL:
            audioManager.setRingerMode(AudioManager.RINGER_MODE_NORMAL);

            // adjust volume
            setSoundRelativeToMax(ringAndNotificationsVolumeInPercent, AudioManager.STREAM_NOTIFICATION);
            setSoundRelativeToMax(ringAndNotificationsVolumeInPercent, AudioManager.STREAM_RING);
            break;

        default:
            Log.d("TAG", "Ignore unknown RINGER_MODE " + ringMode);
            break;
    }
}

private void setSoundRelativeToMax(double percent, int streamType) {
    // requested rights in MainActivity
    final AudioManager audio = (AudioManager) context.getSystemService(context.AUDIO_SERVICE);

    int maxVolume = audio.getStreamMaxVolume(streamType);
    int seventyVolume = (int) (maxVolume * percent);
    audio.setStreamVolume(streamType, seventyVolume, 0);
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X