J'écris une application qui notifie à un utilisateur d'informations très sensibles à temps, et je pense que beaucoup d'entre eux voudraient utiliser une sonnerie téléphonique au lieu de simplement les sons de notification courts. J'ai activé cette fonctionnalité en définissant Heres Le code que j'utilise dans mon récepteur C2DM: P> Android: Ringtonetype = "Tout" code> dans mes préférencesCrean, et cela fonctionne bien, sauf que lorsqu'une sonnerie téléphonique est choisie, il continue à jouer pour toujours jusqu'à ce que l'utilisateur touche la barre de notification. . Comment puis-je le faire éteindre après 30 secondes, sans annuler la notification?
NotificationManager nm = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
Notification notif = new Notification(....)
....
String ringtone = PreferenceManager.getDefaultSharedPreferences(context).getString("ringtone", "");
notif.sound = Uri.parse(ringtone);
notif.audioStreamType = AudioManager.STREAM_NOTIFICATION;
nm.notify(1, notif);
3 Réponses :
Android ne vous donne pas accès à interférer avec la notification de la lecture du son, mais si vous avez le contrôle total de la sonnerie, vous pouvez l'arrêter après 30 secondes ou faire ce que vous voulez avec elle. P >
Ici, je suppose que vous utilisez un service d'arrière-plan pour exécuter la notification. P>
comme une étape préliminaire, vous devez faire la notification sans son. Juste une notification par défaut de la barre des tâches simple. Ensuite, nous utiliserons notre propre MEDIAMPLayer objet pour lire la sonnerie pendant 30 secondes. P >
1) Si vous exécutez la notification sur place: Créez un objet MediaPlayer, commencez à lire la sonnerie L'utilisateur cueilli juste après avoir démarré la notification. Puis comptent 30 secondes avec une minuterie et une timerask ( Voir exemple ici sur la façon dont Pour les utiliser) ou planifiezTheadpoolEcutor et appelez MediaPlayer Stop () Pour arrêter la sonnerie après 30 secondes. p>
2) Si vous programmez la notification pendant une période ultérieure: dès que vous avez défini votre notification, créez un AlarmManager et programmer pour qu'il soit déclenché en même temps avec votre notification. Votre alarme pourrait déclencher un autre service d'arrière-plan que vous avez écrit dans lequel vous jouez la sonnerie pendant 30 secondes à l'aide d'un objet Mediaplayer comme expliqué dans la partie 1). P>
Dans les deux cas, la notification sera toujours présente et la façon dont vous allez jouer à la sonnerie sera totalement indépendante de celle-ci. Vous aurez le contrôle total sur la sonnerie. Vous pouvez même le rejouer pendant 30 secondes encore après une heure programmée si l'utilisateur n'a pas vérifié la notification à ce moment-là (puisque vous disez que la notification fournit des informations très sensibles, sinon je ne voudrais pas boguer l'utilisateur avec des sonneries. insistant). P>
Existe-t-il un moyen lorsque l'utilisateur touche la barre de notification pour que je puisse détecter cela et éteindre l'alarme? Autre que ce serait assez gênant d'avoir la sonnerie continuer à jouer. Si c'est la seule alternative, je pourrais simplement les conseiller de télécharger des tons de notifications étendus ou quelque chose
Bien sûr, il existe de nombreuses façons de le détecter et tout dépend de ce que vous voulez que votre notification fasse. Ensuite, vous devez communiquer entre l'activité résultante recevant l'intention de votre notification et votre service contenant l'objet MediaPlayer et annuler la lecture. Voici un tutoriel détaillé sur la manière de capturer les notifications: développeur.android.com / Guide / Thèmes / UI / Innificateurs / ...
Je ne parle pas du moment où la notification est cliquée, voire rejetée. Je veux dire normalement si un utilisateur ne fait que toucher le haut de la barre de notification, plus aucun son n'est joué. Je ne vois pas un moyen de capturer ça, je me trompe?
Regardez ceci ( développeur.android.com/reference/android/accessieuxse RVICE / ... ) Et ceci ( développeur.android.com / Guide / Thèmes / UI / Accessibilité / ... ). Ceux-ci pourraient être le seul moyen de la comprendre. Autre que cela, il n'y a pas de moyen que je connaisse.
Cela devrait le faire.
.... mediaPlayer.start(); .... final Handler handler = new Handler(); handler.postDelayed(new Runnable() { @Override public void run() { if (mediaPlayer.isPlaying()) mediaPlayer.stop(); } }, timeout);
Où avez-vous reçu l'instance MediaPlayer?
Une solution de contournement simple serait d'annuler la notification après 30 secondes et de créer une nouvelle. P>
Vous pouvez même cloner la notification d'origine et simplement retirer la sonnerie pour le nouveau. P>
Comment détecter si la notification a déjà été annulée par l'utilisateur, donc je ne fais pas que proposer une notification en double après avoir déjà cliqué dessus?
Offtopic: C2DM est obsolète de la réécrire à l'aide de la messagerie de Google Cloud (GCM)