9 votes

Est-il possible d'ajuster le volume du son de notification dynamiquement sur Android O et au-dessus ?

Je comprends parfaitement que depuis Android O et au-dessus, il n'y a pas de moyen facile de personnaliser le son de la notification via le code de l'application.

La méthode courante pour le faire est d'invoquer Settings.ACTION_CHANNEL_NOTIFICATION_SETTINGS

private void showNotificationSoundListPreferenceDialogFragmentCompat(Preference preference) {
    if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        Intent intent = new Intent(Settings.ACTION_CHANNEL_NOTIFICATION_SETTINGS);
        intent.putExtra(Settings.EXTRA_APP_PACKAGE, getContext().getPackageName());
        intent.putExtra(Settings.EXTRA_CHANNEL_ID, com.yocto.wenote.reminder.Utils.createNotificationChannel());
        try {
            startActivity(intent);
        } catch (android.content.ActivityNotFoundException e) {
            Log.e(TAG, "", e);
            trackEvent("showNotificationSoundListPreferenceDialogFragmentCompat", "fatal", e.getMessage());
        }
    }
}

Ça ressemble à ça

entrer la description de l'image ici

Cependant, je remarque que certaines applications sur le marché offrent la possibilité d'ajuster dynamiquement le volume du son de la notification.

entrer la description de l'image ici

Puis-je savoir comment y parvenir?

4voto

forthelulx Points 1370

Ceci n'est qu'un hack, une manière de le faire et cela permettra d'obtenir le comportement requis. Dans mon application, ciblant l'API 26; j'ai implémenté une personnalisation du son et des vibrations manuellement.

NotificationCompat.Builder notification = new NotificationCompat.Builder(this, "Channel1");

if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {

    // Vibrations

    Vibrator vib = (Vibrator) this.getSystemService(Context.VIBRATOR_SERVICE);
    vib.vibrate(VibrationEffect.createWaveform(new long[] {200,300,500,100,100}, 1));

    //Sound 

    Intent soundIntent = new Intent(this, PlaySound.class);
    serviceIntent.setAction("ACTION_START_PLAYBACK");
    serviceIntent.putExtra("UriSound", soundUri.toString());
    context.startForegroundService(soundIntent);

    // if notification is outted, just delete notification; thus delete intent

    Intent outNotification = new Intent(context, PlaySound.class);
    deleteIntent.setAction("ACTION_STOP_PLAYBACK");
    PendingIntent pendingOutNotification =
            PendingIntent.getService(this, 0, outNotification, 0);
    builder.setDeleteIntent(pendingOutNotification);

} else {

    builder.setVibrationPattern(new long[]{100, 200, 300, 400, 500, 400, 300, 200, 400});
    builder.setSound(uri);

}

notificationManager.notify(0, builder.build());

Dans votre PlaySound.class étendre le service, Jouez votre son sur un lecteur multimédia, et contrôlez le volume ou le son particulier en fonction de l' intent de ce canal particulier...

Ciblez le volume ou l'uri en fonction de l'entrée des utilisateurs à partir du curseur, puis envoyez-le via intent ou enregistrez-le dans une paire clé-valeur en utilisant sharedpreferences.

2voto

Vanshaj Daga Points 1509

Vous pouvez y parvenir en suivant les étapes suivantes Vérifiez les autorisations appropriées

isNotificationPolicyAccessGranted()

retourne boolean et fait partie de NotificationManager. Il est requis à partir d'Android N car il peut gérer le "ne pas déranger" Si non fourni, demandez explicitement l'autorisation

Settings.ACTION_NOTIFICATION_POLICY_ACCESS_SETTINGS

configurer AudioManager dans votre activité créer une vue personnalisée avec un curseur pour obtenir un int entre getStreamMinVolume(5) et getStreamMaxVolume(5)

puis définir le volume souhaité avec

setStreamVolume(5, votrevaleur souhaitée en int, 0)

J'espère que cela vous aidera!

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