2010-08-11 4 views
16

Ce que j'essaie de faire, c'est d'abord des raccourcis clavier personnalisés ou, en d'autres termes, "des choses se produiront quand j'appuierai sur certains boutons, quel que soit le programme en cours".
Je suppose qu'un service est nécessaire.onKeyDown dans un service? (Touches de raccourci globales)

J'ai un test rapide et sale qui me dit juste ce qui a été pressé qui fonctionnera si c'est la fenêtre active. Mais évidemment, si je change de fenêtre ou que je vais dans une boîte de texte, cela ne fonctionne pas. Si je le colle directement dans un service (ou un imputmethodservice) et que je lance ce service, rien ne se passe. (Certaines autorisations requises peut-être?) Des suggestions où je me trompe? Ou une meilleure façon de capturer quel bouton est pressé?

Merci!

+0

hiii si u hv une solution pour cela, alors laissez-moi plz knw. –

+1

@Vincent Romain Guy travaille dans l'équipe Android, il a dit que c'est [impossible] (http://stackoverflow.com/a/3455094/942821). Et Fizz, pourriez-vous accepter la réponse de Romain? –

+0

duplication possible de [Est-il possible de créer un service Android à l'écoute des touches matérielles?] (Http://stackoverflow.com/questions/2986337/is-it-possible-to-create-android-service- that-listens-for-hardware-key-presse) – isalgueiro

Répondre

17

Vous ne pouvez pas le faire :)

+1

Même dans une application d'accessibilité? Il n'y a aucun moyen de réagir aux pressions sur les touches ou les touches logicielles dans un service? – amfcosta

+0

@Romain Guy - Monsieur, et si en appuyant sur la maison, je voudrais mettre l'écran sur? Comment samsung note II le ferait-il? –

+2

@Romain - Elaborer s'il vous plaît - merci –

0

Cela nécessite Lollipop (v5.0/API 21) ou plus

Mon objectif était de régler le volume du système à partir d'un service, donc cela n'écoutera la bascule . Toute action peut être prise sur la presse si. Il va surcharger l'action de la touche de volume, donc son utilisation globale peut ne pas être souhaitée.

public class VolumeKeyController { 

    private MediaSessionCompat mMediaSession; 
    private final Context mContext; 

    public VolumeKeyController(Context context) { 
     mContext = context; 
    } 

    private void createMediaSession() { 
     mMediaSession = new MediaSessionCompat(mContext, KeyUtil.log); 

     mMediaSession.setFlags(MediaSessionCompat.FLAG_HANDLES_MEDIA_BUTTONS | 
       MediaSessionCompat.FLAG_HANDLES_TRANSPORT_CONTROLS); 
     mMediaSession.setPlaybackState(new Builder() 
       .setState(PlaybackStateCompat.STATE_PLAYING, 0, 0) 
       .build()); 
     mMediaSession.setPlaybackToRemote(getVolumeProvider()); 
     mMediaSession.setActive(true); 
    } 

    private VolumeProviderCompat getVolumeProvider() { 
     final AudioManager audio = mContext.getSystemService(Context.AUDIO_SERVICE); 

     int STREAM_TYPE = AudioManager.STREAM_MUSIC; 
     int currentVolume = audio.getStreamVolume(STREAM_TYPE); 
     int maxVolume = audio.getStreamMaxVolume(STREAM_TYPE); 
     final int VOLUME_UP = 1; 
     final int VOLUME_DOWN = -1; 

     return new VolumeProviderCompat(VolumeProviderCompat.VOLUME_CONTROL_RELATIVE, maxVolume, currentVolume) { 
      @Override 
      public void onAdjustVolume(int direction) { 
       // Up = 1, Down = -1, Release = 0 
       // Replace with your action, if you don't want to adjust system volume 
       if (direction == VOLUME_UP) { 
        audio.adjustStreamVolume(STREAM_TYPE, 
          AudioManager.ADJUST_RAISE, AudioManager.FLAG_REMOVE_SOUND_AND_VIBRATE); 
       } 
       else if (direction == VOLUME_DOWN) { 
        audio.adjustStreamVolume(STREAM_TYPE, 
          AudioManager.ADJUST_LOWER, AudioManager.FLAG_REMOVE_SOUND_AND_VIBRATE); 
       } 
       setCurrentVolume(audio.getStreamVolume(STREAM_TYPE)); 
      } 
     }; 
    } 

    // Call when control needed, add a call to constructor if needed immediately 
    public void setActive(boolean active) { 
     if (mMediaSession != null) { 
      mMediaSession.setActive(active); 
      return; 
     } 
     createMediaSession(); 
    } 

    // Call from Service's onDestroy method 
    public void destroy() { 
     if (mMediaSession != null) { 
      mMediaSession.release(); 
     } 
    } 
} 
Questions connexes