Постоянно проверяйте изменение громкости в сервисах Android

Я написал этот кусок кода, он явно ошибочен. Как мне создать службу, которая будет постоянно проверять изменения громкости? Key listeners нельзя использовать в сервисах, пожалуйста, не публикуйте ответ с прослушивателями громкости.

Мой код неверен, потому что я задал фиктивное условие для цикла while. Каким должно быть условие, чтобы моя служба проверяла изменение громкости и не вылетала? Этого не может быть isScreenOn(), потому что громкость можно изменить во время прослушивания музыки, а экран выключен.

КОД

AudioManager audio = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
    int currentVolume = audio.getStreamVolume(AudioManager.STREAM_RING);
    int newVolume=0;
    while(1==1)
    {
        newVolume = audio.getStreamVolume(AudioManager.STREAM_RING);
        if(currentVolume!=newVolume)
        {
            Toast.makeText(this, "Volume change detected!", Toast.LENGTH_LONG).show();
        }

    }

person Karthik Balakrishnan    schedule 08.01.2013    source источник
comment
Несколько решений для вашей проблемы можно найти здесь: stackoverflow.com/questions/3180279/   -  person Andrii Chernenko    schedule 08.01.2013
comment
О, и еще одно — никогда не делайте такие вещи в бесконечном цикле. Даже если это сработает, это, вероятно, худший способ, который вы можете себе представить.   -  person Andrii Chernenko    schedule 08.01.2013
comment
Они для деятельности, я предполагаю. Они не работают в сфере услуг. Пробовал их.   -  person Karthik Balakrishnan    schedule 08.01.2013
comment
@deville Согласен, бесконечные циклы - это кошмар.   -  person Karthik Balakrishnan    schedule 08.01.2013


Ответы (1)


Если вы хотите видеть, когда параметр изменяется, вы можете зарегистрировать ContentObserver у поставщика параметров, чтобы отслеживать его. Например, это наблюдатель в приложении настроек:

    private ContentObserver mVolumeObserver = new ContentObserver(mHandler) {
        @Override
        public void onChange(boolean selfChange) {
            super.onChange(selfChange);
            if (mSeekBar != null && mAudioManager != null) {
                int volume = mAudioManager.getStreamVolume(mStreamType);
                mSeekBar.setProgress(volume);
            }
        }
    };

И регистрируется обозреватель настроек вот так:

        import android.provider.Settings;
        import android.provider.Settings.System;

        mContext.getContentResolver().registerContentObserver(
                System.getUriFor(System.VOLUME_SETTINGS[mStreamType]),
                false, mVolumeObserver);
person hackbod    schedule 08.01.2013
comment
Что мы импортируем для ContentObserver? - person Ruchir Baronia; 07.02.2016