如何在Android后台服务或本机环境中检测音量按钮点击?

时间:2013-09-14 15:59:58

标签: java android c service

我想检测后台服务或Android中的原生环境中的音量按钮点击事件。我希望它可以随时检测到该事件。

我使用ContentObserver尝试了下面的代码,但这只能检测到AUDIO_SERVICE更改的事件,如果前台应用程序正在运行音乐,则此方法无法检测到它,我认为因为它是{ {1}}但不是STREAM_MUSIC。我想要的是随时检测音量按钮点击并点击任何音量按钮。

有谁知道怎么做? 我可以在本机代码中使用C实现它吗?

AUDIO_SERVICE

然后在我的服务onCreate中注册:

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.AUDIO_SERVICE);
    }

    @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.AUDIO_SERVICE);

        int delta=previousVolume-currentVolume;

        if(delta>0)
        {
            Logger.d("Volume Up!");
            previousVolume=currentVolume;
        }
        else if(delta<0)
        {
            Logger.d("Volume Down!");
            previousVolume=currentVolume;
        }
    }
}

然后在onDestroy中取消注册:

mSettingsContentObserver = new SettingsContentObserver(this,new Handler());
getApplicationContext().getContentResolver().registerContentObserver(android.provider.Settings.System.CONTENT_URI, true, mSettingsContentObserver );

1 个答案:

答案 0 :(得分:0)

您是否尝试过this

import android.provider.Settings;
import android.provider.Settings.System;
mContext.getContentResolver().registerContentObserver(Settings.System.getUriFor(Settings.System.VOLUME_SETTINGS[AudioManager.STREAM_M‌​USIC]), true, mVolumeObserver);

在本机代码上实现相同可能不会起作用,因为您需要将每个方法从ContentObserver绑定到本机调用,如下所示:

public class NativeContentObserver extends ContentObserver {
    public static final String TAG = "NativeContentObserver";

    private native boolean natDeliverSelfNotifications();
    private native void natDispatchChange(boolean selfChange, Uri uri);
    private native void natDispatchChange(boolean selfChange);
    private native void natOnChange(boolean selfChange, Uri uri);
    private native void natOnChange(boolean selfChange);

     /// ... Delegate work from here ... ///

    static {
        System.loadLibrary("NativeContentObserver");
    }
}

因此,在转到本机代码之前,您需要首先使用ContentObserver。