2017-01-17 3 views
0

Ich mache eine Bibliothek zum Verfolgen von Benutzerereignissen in App. Ich möchte einen Rückruf erhalten, wenn der Benutzer die Lautstärketaste zweimal auf dem Startbildschirm der App in meine Bibliothek drückt. Wie kann ich den Rückruf erhalten, ohne die Aktivität zu verlängern? onKeyDown funktioniert nur für die Aktivität.
Ich versuchteListener für Lautstärke Tastenereignisse

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; 
     } 
    } 
} 

Diese nicht onChange ruft, wenn keine Änderung des Volumens ist. Wenn die Lautstärke beispielsweise voll ist, wenn der Benutzer die Lauter-Taste drückt, wird er nicht angerufen. Wenn die Lautstärke gleich 0 ist und der Benutzer die Lautstärke herunterdrückt, wird er nicht aufgerufen. Wie kann ich den Rückruf erhalten?

+0

können Sie dispatchKeyEvent in dieser Klasse verwenden? –

+0

Nein, wir können nicht. Das gleiche wie onKeyDown –

Antwort

0

Ich weiß nicht, wie Sie auf dem Startbildschirm wichtige Ereignisse abhören, aber es gibt eine Möglichkeit, mit der Sie die Lautstärke ändern können, indem Sie Content Observer verwenden. Es ist wie ein Broadcast-Empfänger, der bei Inhaltsänderungen wie Lautstärke, Kontakten, Anruflisten usw. aufgerufen wird. Dies funktioniert jedoch nicht, wenn sich das Telefon im Ruhezustand befindet.

Hier ist der Code:

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 wird nicht mehr unterstützt –

+0

Dann versuchen Sie, diese Zeile mit diesem Code zu ersetzen "Uri uri = Settings.System.getUriFor (" VOLUME_RING ");" und lass es mich wissen, wenn es funktioniert –

+0

Na. es funktioniert auch nicht. –