Notez que dans cet exemple les juges, par le changement de volume de données, si vous voulez utiliser un autre volume, changer!
Mise à JOUR:
Méthode ci-dessus soi-disant ne fonctionne pas de la Guimauve, MAIS il y a beaucoup mieux maintenant depuis MediaSession a été introduite! Alors d'abord, vous devez migrer votre code de MediaController/MediaSession modèle et ensuite utiliser ce code:
En quelque sorte bouton de volume de l'appareil sont détectés même avec l'écran éteint (il vous suffit de vous inscrire bon support bouton intention récepteur le cas échéant pour votre plate-forme!)
Mise à JOUR 2 depuis GalDude demandé quelques infos sur l'obtention des médias MediaSession/MediaController. Désolé, mais depuis que j'ai arrêté à l'aide de Java, il sera dans Kotlin:
lateinit var mediaSession:MediaSessionCompat//you have to initialize it in your onCreate method
val kontroler:MediaControllerCompatget()= mediaSession.controller //in Java it's just getController() on mediaSession//in your onCreate/start method:
mediaSession =MediaSessionCompat(this,"YourPlayerName", receiver,null)
mediaSession.setFlags(MediaSessionCompat.FLAG_HANDLES_MEDIA_BUTTONS orMediaSessionCompat.FLAG_HANDLES_TRANSPORT_CONTROLS)
mediaSession.isActive =trueif(ratingIsWorking)//note: rating crashes on some machines you have to check it!
mediaSession.setRatingType(RatingCompat.RATING_5_STARS)
mediaSession.setCallback(object:MediaSessionCompat.Callback(){...//here you have to implement what happens with your player when play/pause/stop/ffw etc. is requested - see exaples elsewhere})//onDestroy/exit method:
mediaSession.isActive =false
mediaSession.release()
Cela n'a pas de travail ici...
Va touches de volume être détecté lorsque l'écran est éteint? OU est-ce que votre solution de travail pour le cas lorsque l'écran est allumé?
Ce code fonctionne que si l'application est en pause. Comment détecter le changement de volume après la suppression de l'application à partir de l'exécution de l'état.?
Ce n'est plus possible w/ Android Guimauve, tous les paramètres de volume ont été supprimés à partir de android.fournisseur de.Les paramètres.Système. - developer.android.com/sdk/api_diff/23/changes/...
Il EST encore possible. Je vais mettre à jour ma réponse dans un instant!
Note de côté: VolumeProviderCompat ne fonctionne que sur les API 21(+). Et sur mon Nexus 5 FOIS, en observant les paramètres du système t en fait, le travail, tout comme sur les anciennes plates-formes.
Cela ne fonctionne pas lorsque l'écran est éteint!
Peut-être ROM dépendant, il fonctionne sur tous les appareils que j'ai vérifié. Avez-vous essayé plusieurs touches, au lieu d'un long?
Pouvez-vous fournir un exemple de code pour le Matshmallow cas? Comment puis-je obtenir le MediaSession\Controller?
Voir mise à jour ci-dessus.
Où avez-vous initialiser mSession dans la mise à Jour 1 de votre réponse?
Dans mon Service la méthode onCreate
Dans la dernière kotlin exemple, où avez-vous receiver de la variable?
Oh, désolé. C'est un récepteur standard code: <code> val récepteur = Nomcomposant(packageName, MediaButtonIntentReceiver::classe.java.nom)</code>
où je dois utiliser MediaControllerCompat? @ssuukk
Cela ne semble pas fonctionner à tous pour moi, même dans une Activité. Je ne vois pas kontroler utilisé. Est-il important? Pouvez-vous s'il vous plaît dites-moi ce que je fais mal? Voici le projet: s000.tinyupload.com/?file_id=99484997837082357593
Tout ce que vous avez à faire est de mettre en œuvre un comportement correct dans votre VolumeProviderCompat et l'appliquer à votre MediaSession, voir ci-dessus. Seule cette partie est importante.
Le PSBA Musique application dispose d'un Service (MediaPlaybackService) qui répond à la touche de volume événements par l'enregistrement d'un BroadcastReceiver (MediaButtonIntentReceiver).
Voici l'extrait de code où il inscrit le récepteur:
Cela fonctionne même si l'application Musique n'est pas au premier plan. N'est-ce pas ce que vous voulez?
les boutons de volume ne sont pas considérés comme des "boutons de médias" en ROM stock. Je suppose que cette application est en mesure d'obtenir les boutons de volume, car il fonctionne avec une custom rom android...
Pourriez-vous fournir le lien vers la documentation à l'appui de votre propos?
eh bien, en utilisant la rom stock, créer un récepteur qui sont à l'écoute des médias boutons, appuyez sur un bouton de volume et d'observer que rien ne se passe...
Ce à propos de Google Jouer de la Musique? Il n'est pas l'action du joueur, mais il gère aussi les boutons de médias, aussi lorsqu'il n'est pas en premier plan...
J'ai été capable de le faire fonctionner sur android 5+ périphériques à l'aide de MediaSession. Cependant,ContentObserver suggéré par @ssuukk n'a pas fonctionné pour moi sur les deux 4.4 et 7.0 appareils (au moins sur la Rom que j'ai testé sur).
Voici un exemple complet qui fonctionne sur android 5+.
Service:
import android.app.Service;import android.content.Intent;import android.os.IBinder;import android.support.v4.media.VolumeProviderCompat;import android.support.v4.media.session.MediaSessionCompat;import android.support.v4.media.session.PlaybackStateCompat;publicclassPlayerServiceextendsService{privateMediaSessionCompat mediaSession;@Overridepublicvoid onCreate(){super.onCreate();
mediaSession =newMediaSessionCompat(this,"PlayerService");
mediaSession.setFlags(MediaSessionCompat.FLAG_HANDLES_MEDIA_BUTTONS |MediaSessionCompat.FLAG_HANDLES_TRANSPORT_CONTROLS);
mediaSession.setPlaybackState(newPlaybackStateCompat.Builder().setState(PlaybackStateCompat.STATE_PLAYING,0,0)//you simulate a player which plays something..build());//this will only work on Lollipop and up, see https://code.google.com/p/android/issues/detail?id=224134VolumeProviderCompat myVolumeProvider =newVolumeProviderCompat(VolumeProviderCompat.VOLUME_CONTROL_RELATIVE,/*max volume*/100,/*initial volume level*/50){@Overridepublicvoid onAdjustVolume(int direction){/*
-1 -- volume down
1 -- volume up
0 -- volume button released
*/}};
mediaSession.setPlaybackToRemote(myVolumeProvider);
mediaSession.setActive(true);}@OverridepublicIBinder onBind(Intent intent){returnnull;}@Overridepublicvoid onDestroy(){super.onDestroy();
mediaSession.release();}}
Il intercepte les boutons de volume complètement ainsi, alors que ce code est en cours d'exécution, vous ne serez pas en mesure de régler le volume de la sonnerie à l'aide de boutons de volume. Ce sera peut-être possible de le fixer, je ne l'ai pas essayer.
Si vous exécutez l'exemple-est, les boutons de volume reste contrôlée par l'application même lorsque l'écran est éteint et que l'application a été retirée des "Applications Récentes" de la liste. Vous aurez à aller à Settings->Applications, recherchez l'application et de la force de l'arrêter pour obtenir des boutons de volume arrière.
n'avoir rien dans onAdjustVolume. Je suis en cours d'exécution sur le nexus 5
Si vous ajoutez ce code de ligne , il ne fonctionne pas. : if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { mediaSession.setCallback(new MediaSessionCompat.Callback(){ }); }
Cette solution est assez bon, mais ne fonctionne pas lorsque l'écran est éteint, aucune solution? Merci
caisse Le contrôle de Votre Application, de Volume et de Lecture ...Cela aidera à résoudre votre problème... plusieurs applications pourraient vouloir écouter appuie sur un bouton de fond, c'est peut être la raison pour laquelle KeyEvents ne peuvent être traitées que par les Activités qu'ils sont à l'interface de l'utilisateur en appuyant sur les touches.
Remarque: cela ne fonctionne que pour des Activités, et non pas des Services comme la question des états.
Selon le contexte dans lequel la fonction de rappel est nécessaire, une solution alternative pourrait être disponible.
Pour être en mesure de détecter le bouton de volume à une Activité serait nécessaire de remplacer le dispatchKeyEvent fonction. Pour que cela soit présent dans de multiples activités pourrait pourrait écrire une super-classe contenant le substituée une fonction qui est étendue par la suite pour toutes les activités.
Voici le code pour la détection de Volume Haut/Bas touches:
//Over-ride this function to define what should happen when keys are pressed (e.g. Home button, Back button, etc.)@Overridepublicboolean dispatchKeyEvent(KeyEventevent){if(event.getAction()==KeyEvent.ACTION_DOWN){switch(event.getKeyCode()){caseKeyEvent.KEYCODE_VOLUME_UP://Volume up key detected//Do somethingreturntrue;caseKeyEvent.KEYCODE_VOLUME_DOWN://Volume down key detected//Do somethingreturntrue;}}returnsuper.dispatchKeyEvent(event);}
Cette une amende de l'activité! Les Services ne permet pas de dresser une liste des événements comme les Activités.
ce rappel n'est inclus à l'Activité de la classe, pas de Service
Ce n'est pas une réponse car la question est à propos du Service, pas d'Activité
À en juger par le couple d'autres questions sur ce sujet, non.
Autre question 1,
Question 2
Des Services tout simplement ne reçoivent pas KeyEvent rappels.
C'est possible. Utilisez le code ci-dessous (pour les nouvelles versions d'Android, en particulier de la Guimauve, voir en bas de la réponse):
Puis dans votre service onCreate de l'enregistrer avec:
Puis annuler l'inscription dans onDestroy:
Notez que dans cet exemple les juges, par le changement de volume de données, si vous voulez utiliser un autre volume, changer!
Mise à JOUR:
Méthode ci-dessus soi-disant ne fonctionne pas de la Guimauve, MAIS il y a beaucoup mieux maintenant depuis MediaSession a été introduite! Alors d'abord, vous devez migrer votre code de MediaController/MediaSession modèle et ensuite utiliser ce code:
En quelque sorte bouton de volume de l'appareil sont détectés même avec l'écran éteint (il vous suffit de vous inscrire bon support bouton intention récepteur le cas échéant pour votre plate-forme!)
Mise à JOUR 2 depuis GalDude demandé quelques infos sur l'obtention des médias MediaSession/MediaController. Désolé, mais depuis que j'ai arrêté à l'aide de Java, il sera dans Kotlin:
VolumeProviderCompat
ne fonctionne que sur les API 21(+). Et sur mon Nexus 5 FOIS, en observant les paramètres du système t en fait, le travail, tout comme sur les anciennes plates-formes.receiver
de la variable?kontroler
utilisé. Est-il important? Pouvez-vous s'il vous plaît dites-moi ce que je fais mal? Voici le projet: s000.tinyupload.com/?file_id=99484997837082357593Le PSBA Musique application dispose d'un Service (MediaPlaybackService) qui répond à la touche de volume événements par l'enregistrement d'un BroadcastReceiver (MediaButtonIntentReceiver).
Voici l'extrait de code où il inscrit le récepteur:
Aussi, n'oubliez pas de manifeste:
Cela fonctionne même si l'application Musique n'est pas au premier plan. N'est-ce pas ce que vous voulez?
J'ai été capable de le faire fonctionner sur android 5+ périphériques à l'aide de
MediaSession
. Cependant,ContentObserver
suggéré par @ssuukk n'a pas fonctionné pour moi sur les deux 4.4 et 7.0 appareils (au moins sur la Rom que j'ai testé sur).Voici un exemple complet qui fonctionne sur android 5+.
Service:
Dans
AndroidManifest.xml
:Dans votre activité:
Il y a plusieurs choses à savoir:
Settings->Applications
, recherchez l'application et de la force de l'arrêter pour obtenir des boutons de volume arrière.if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { mediaSession.setCallback(new MediaSessionCompat.Callback(){ }); }
Vous avez besoin pour jouer vide son de service, puis seulement vous pouvez écouter les changements de volume. Suite a fonctionné pour moi
Étapes
1. Mettre en blanc.mp3 en raw dossier (à Télécharger à partir de ici)
2. Démarrez media à onStartCommand()
3. Vous devez décider d'arrêter et de libération mediaplayer. C'est mieux de le faire dans onDestroy()
4. Créer récepteur de Radiodiffusion qui sera à l'écoute pour les changements de volume
5. Enregistrer le récepteur de radiodiffusion dans onStartCommand()
6. Annuler l'inscription broadccast récepteur dans onDestroy()
C'est tout
Android n'a pas de document de l'Api sur l'interaction avec les boutons de volume dans ce cas. Donc je suppose que la réponse est non...
caisse Le contrôle de Votre Application, de Volume et de Lecture ...Cela aidera à résoudre votre problème... plusieurs applications pourraient vouloir écouter appuie sur un bouton de fond, c'est peut être la raison pour laquelle KeyEvents ne peuvent être traitées que par les Activités qu'ils sont à l'interface de l'utilisateur en appuyant sur les touches.
Remarque: cela ne fonctionne que pour des Activités, et non pas des Services comme la question des états.
Selon le contexte dans lequel la fonction de rappel est nécessaire, une solution alternative pourrait être disponible.
Pour être en mesure de détecter le bouton de volume à une Activité serait nécessaire de remplacer le
dispatchKeyEvent
fonction. Pour que cela soit présent dans de multiples activités pourrait pourrait écrire une super-classe contenant le substituée une fonction qui est étendue par la suite pour toutes les activités.Voici le code pour la détection de Volume Haut/Bas touches:
Cela nécessite Sucette (v5.0/API 21) ou plus
Mon objectif était d'ajuster le volume du système à partir d'un Service. Toute action peut être prise sur appuyez sur si.