Прослушиватель ключевых событий кнопки громкости

Я создаю библиотеку для отслеживания событий пользователей в приложении. I want to have a callback when user presses volume button twice on the home screen of the app to my library. Как я могу получить обратный вызов без расширения действия. onKeyDown работает только на активности.
Я пытался

    public class SettingsContentObserver extends ContentObserver
{
    int previousVolume;
    Context context;

    public SettingsContentObserver(Context c, Handler handler)
    {
        super(handler);
        context = c;

        AudioManager audio = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
        previousVolume = audio.getStreamVolume(AudioManager.RINGER_MODE_NORMAL);
        Log.i("myTag", "SettingsContentObserver previousVolume = " + previousVolume);
    }

    @Override
    public boolean deliverSelfNotifications()
    {
        return super.deliverSelfNotifications();
    }

    @Override
    public void onChange(boolean selfChange)
    {
        super.onChange(selfChange);

        AudioManager audio = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
        int currentVolume = audio.getStreamVolume(AudioManager.RINGER_MODE_NORMAL);

        Log.d("myTag", currentVolume + " currentVolume");

        int delta = previousVolume - currentVolume;

        if (delta > 0)
        {
            Log.i("myTag", delta + " Decreased");
            previousVolume = currentVolume;
        }
        else if (delta < 0)
        {
            Log.i("myTag", delta + " Increased");
            previousVolume = currentVolume;
        }
    }
}

Это не вызов onChange, когда нет изменения объема. Например, если объем заполнен, когда пользователь нажимает кнопку Увеличения громкости, он не вызывается. Аналогично, когда объем равен 0, и если пользователь нажимает volume down, он не будет вызван. Как получить обратный звонок?

1 ответ

  1. Я не знаю, как слушать ключевые события на главном экране, но есть способ, с помощью которого вы можете слушать изменение громкости, используя Content Observer . Это похоже на широковещательный приемник, который вызывается, когда изменения в содержимом, таком как объем, контакты, журналы вызовов и т.д. Но это не будет работать, когда телефон находится в спящем режиме.

    Вот код:

    public class Service_VolumeListener extends Service{ 
    AudioManager audioManager;
    Handler handler;
    
    private ContentObserver volumeObserver = new ContentObserver(handler) {
        @Override
        public void onChange(boolean selfChange) {
            super.onChange(selfChange);
            if (audioManager != null) {
    
                final int volume = audioManager.getStreamVolume(AudioManager.STREAM_RING);
                Log.d("VOL_STATS", "Volume Changed: " +volume);
            }
        }
    };
    
    @Override
    public void onCreate() {
        super.onCreate();
    
        audioManager = (AudioManager) getSystemService(AUDIO_SERVICE);
    
        Uri uri = Settings.System.getUriFor(Settings.System.VOLUME_SETTINGS[AudioManager.STREAM_RING]);
        getContentResolver().registerContentObserver(uri, true, volumeObserver);
    
        //Volume listener Registered
    }
    
    @Override
    public void onDestroy() {
        super.onDestroy();      
    
        getContentResolver().unregisterContentObserver(volumeObserver);
        //Volume service unregistered
    }
    
    @Override
    public IBinder onBind(Intent arg0) {
    
        return null;
    }
    }