commands - keyevent android studio
onKeyDown en un servicio?(Global Hot Keys) (2)
Básicamente, lo que estoy tratando de lograr es con teclas de acceso rápido globales personalizadas o, en otras palabras, "las cosas sucederán cuando presiono ciertos botones sin importar qué programa esté actualmente en la parte superior".
Supongo que se necesita un servicio.
Tengo una prueba rápida y sucia que solo me dice lo que se presionó que funcionará si es la ventana activa.
public boolean onKeyDown(int keyCode, KeyEvent event) {
char pop;
pop = (char)event.getUnicodeChar();
Toast.makeText(this, Character.toString(pop) , Toast.LENGTH_SHORT).show();
return super.onKeyDown(keyCode, event);
}
Pero obviamente si cambio de ventana o entro en un cuadro de texto, no funciona. Si lo coloco directamente en un servicio (o en un servicio de servicio de imputación) y lanzo dicho servicio, no pasa nada. (¿Es posible que se requieran algunos permisos?) ¿Alguna sugerencia sobre el error? ¿O una mejor manera de capturar qué botón se presiona?
¡Gracias!
Esto requiere Lollipop (v5.0 / API 21) o superior
Mi objetivo era ajustar el volumen del sistema desde un Servicio, por lo que esto solo escuchará al rockero. Cualquier acción se puede tomar en la prensa sin embargo.
Anulará la acción de la tecla de volumen, por lo que su uso global puede no ser deseable.
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 = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE);
int STREAM_TYPE = AudioManager.STREAM_MUSIC;
int currentVolume = audio.getStreamVolume(STREAM_TYPE);
int maxVolume = audio.getStreamMaxVolume(STREAM_TYPE);
return new VolumeProviderCompat(VolumeProviderCompat.VOLUME_CONTROL_RELATIVE, maxVolume, currentVolume) {
@Override
public void onAdjustVolume(int direction) {
// Volume Up = AudioManager.ADJUST_LOWER, Volume Down = AudioManager.ADJUST_LOWER, Release = AudioManager.ADJUST_SAME
// Replace with your action, if you don''t want to adjust system volume
if (direction == AudioManager.ADJUST_RAISE) {
audio.adjustStreamVolume(STREAM_TYPE,
AudioManager.ADJUST_RAISE, AudioManager.FLAG_REMOVE_SOUND_AND_VIBRATE);
}
else if (direction == AudioManager.ADJUST_LOWER) {
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();
}
}
}
No puedes hacer esto :)