2017-01-17 8 views
0

Я делаю библиотеку для отслеживания пользовательских событий в приложении. Я хочу иметь обратный вызов, когда пользователь дважды нажимает кнопку уровня громкости на главном экране приложения в моей библиотеке. Как я могу получить обратный вызов без расширения активности. onKeyDown работает только с Activity.
Я попыталсяСлушатель для событий клавиши клавиши громкости

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, и если пользователь нажимает громкость, он не будет вызван. Как получить обратный вызов?

+0

вы можете использовать dispatchKeyEvent в этом классе? –

+0

Нет, мы не можем. Так же, как onKeyDown –

ответ

0

Я не знаю, как слушать ключевые события на главном экране, но есть способ, которым вы можете слушать изменение громкости, используя 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; 
} 
} 
+0

Settings.System.VOLUME_SETTINGS больше не поддерживается –

+0

Затем попробуйте заменить эту строку на этот код «Uri uri = Settings.System.getUriFor (« VOLUME_RING »); и дайте мне знать, если это работает –

+0

Na. он также не работает. –