2012-07-03 6 views
8

Gibt es eine Möglichkeit, das Ereignis der Lautstärkeänderung auf Android zu hören, ohne nur die Lautstärke-Tasten übernehmen?Hören Sie Lautstärke Änderungen Ereignisse auf Android

Das einzige, was ich gefunden habe, funktioniert funktioniert here, aber es funktioniert erst, nachdem die Lautstärkeregelung verschwunden ist.

Nicht alle Geräte verfügen über Lautstärketasten, und ich muss die Lautstärkeänderungen erfassen, sobald sie auftreten, und nicht, nachdem der Lautstärkedialog nicht mehr angezeigt wird.

+0

Verwenden Sie ContentObserver und die Datenträger von Audiomanager abrufen. Ich habe es kürzlich benutzt und es funktioniert super. [Überprüfen Sie diese Lösung in stackoverflow] (http://stackoverflow.com/questions/6896746/android-is-there-a-broadcast-action-for-volume-changes) – user2503849

+0

it's s ein älterer Beitrag, aber es ist dürftig, dass es bis jetzt in Android keine Broadcat-Implementierung gibt .... 5 Jahre später, noch keine Sendung ... – Opiatefuchs

+1

@Opiatefuchs Vielleicht erstellen Sie eine Anfrage dafür, hier: https://issuetracker.google.com/issues. Ich werde es Sterne :) –

Antwort

0

Sie verwenden können: registerMediaButtonEventReceiver (Componenteventreceiver) , die eine Komponente registriert der einzige Empfänger von MEDIA_BUTTON Absichten sein.

// in your activity. 
MediaButtonReceiver receiver = new MediaButtonReceiver(); 

// in onCreate put 
registerMediaButtonEventReceiver(receiver); 

class MediaButtonReceiver implements BroadcastReceiver { 
    void onReceive(Intent intent) { 
      KeyEvent ke = (KeyEvent)intent.getExtra(Intent.EXTRA_KEY_EVENT); 
      if (ke .getKeyCode() == KeyEvent.KEYCODE_VOLUME_DOWN) { 
      //action when volume goes down 
      } 
      if (ke .getKeyCode() == KeyEvent.KEYCODE_VOLUME_UP) { 
       //action when volume goes up 
      } 
    } 
} 

    //In both onStop and onPause put : 
    unregisterMediaButtonEventReceiver(receiver); 

was wir tun, hier ist die Definition einer BroadcastReceiver, die mit ACTION_MEDIA_BUTTON beschäftigt. und verwenden Sie EXTRA_KEY_EVENT, das das Schlüsselereignis enthält, das verursacht hat, dass die Übertragung das erhält, was gedrückt wurde, und danach handelt.

+2

aber ist es nicht nur das Erfassen der Lautstärketasten? Was würde für Geräte auftreten, die sie nicht haben? auch, was ist mit Geräten, die sie haben, aber der Benutzer hat die Lautstärke Suchleiste berührt, nachdem es gezeigt wurde? In solchen Fällen kann ich die Ereignisse nicht erfassen ... –

+1

registerMediaButtonEventReceiver funktioniert für Headset-Tasten, aber nicht für die Hardware-Tasten des Telefons. Ich habe es gerade ausprobiert. – uTubeFan

3

ok, für jetzt, was ich tue ist, die Lautstärketasten mit onKeyDown zu hören (und nach KEYCODE_VOLUME_DOWN, KEYCODE_VOLUME_MUTE, KEYCODE_VOLUME_UP), und mit einem Handler habe ich eine neue Runnable, die die Lautstärke überprüft überprüft.

auch, da einige Geräte einen Lautstärke-Dialog haben, habe ich einen Listener hinzugefügt, wenn es verschwunden ist, nach this link.

+1

Da [android.media.VOLUME_CHANGED_ACTION] (http://stackoverflow.com/a/8974510/725417) keine praktikable Option ist und da registerMediaButtonEventReceiver nicht einmal funktioniert, scheint Ihr Ansatz der einzige Weg zu sein (bisher). Danke +1. – uTubeFan

1

Verwenden Sie den Broadcast-Empfänger VOLUME_CHANGED_ACTION und verwenden Sie den AudioManager, um das aktuelle Volume zu erhalten.

<receiver android:name="VolumeChangeReceiver" > 
    <intent-filter> 
     <action android:name="android.media.VOLUME_CHANGED_ACTION" /> 
    </intent-filter> 
</receiver> 
+0

Sind Sie sicher, dass es funktioniert? hast du das gelesen: http://stackoverflow.com/a/8974510/878126? –

+0

@androiddeveloper funktioniert es in vielen Fällen, es gibt einfach keine Garantie, da es system-private ist und daher ohne Ankündigung geändert/entfernt werden kann. – CCJ

+0

Funktioniert nicht auf Android O sicher –

15

Besser können Sie eine ContentObserver registrieren Sie wie folgt vor:

getApplicationContext().getContentResolver().registerContentObserver(android.provider.Settings.System.CONTENT_URI, true, new ContentObserver(){...}); 

Ihre ContentObserver könnte wie folgt aussehen:

public class SettingsContentObserver extends ContentObserver { 
    private AudioManager audioManager; 

    public SettingsContentObserver(Context context, Handler handler) { 
     super(handler); 
     audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE); 
    } 

    @Override 
    public boolean deliverSelfNotifications() { 
     return false; 
    } 

    @Override 
    public void onChange(boolean selfChange) { 
     int currentVolume = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC); 

     Log.d(TAG, "Volume now " + currentVolume); 
    } 
} 

Wenn Sie fertig sind:

getApplicationContext().getContentResolver().unregisterContentObserver(mContentObserver); 

Eine Vorsicht , thoug h - manchmal scheinen sich die Benachrichtigungen zu verzögern, wenn schnell viele Tasten gedrückt werden.

+0

Wie kann ich für die Lautstärke-Taste lange drücken? –

+0

Danke seine Arbeit für mich. –

+0

sollte als akzeptierte Antwort markiert sein .. – Opiatefuchs