2017-01-17 156 views
0

我正在製作一個庫,用於跟蹤應用中的用戶事件。當用戶在應用程序的主屏幕上向我的圖書館按兩次音量按鈕時,我想要回叫。如何在不擴展活動的情況下獲得回調。 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時,如果用戶按下音量,它將不會被調用。如何獲得回調?

+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

娜。它也沒有工作。 –