Sug*_*uge 5 c java service android
我想检测后台服务或Android中的本机环境中的音量按钮单击事件.我希望它可以随时检测到该事件.
我尝试了下面的代码ContentObserver,但这只能检测到AUDIO_SERVICE更改的事件,如果前台应用程序正在运行音乐,这种方法无法检测到它,我想因为它STREAM_MUSIC不是.AUDIO_SERVICE我想要的是随时检测音量按钮点击和任何音量按钮单击.
有谁知道怎么做?我可以用本机代码中的C实现它吗?
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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
然后在我的服务onCreate注册它:
mSettingsContentObserver = new SettingsContentObserver(this,new Handler());
getApplicationContext().getContentResolver().registerContentObserver(android.provider.Settings.System.CONTENT_URI, true, mSettingsContentObserver );
Run Code Online (Sandbox Code Playgroud)
然后在onDestroy中取消注册:
getApplicationContext().getContentResolver().unregisterContentObserver(mSettingsContentObserver);
Run Code Online (Sandbox Code Playgroud)
Ced*_*ndo -1
你试过这个吗?
\n\nimport android.provider.Settings;\nimport android.provider.Settings.System;\nmContext.getContentResolver().registerContentObserver(Settings.System.getUriFor(Settings.System.VOLUME_SETTINGS[AudioManager.STREAM_M\xe2\x80\x8c\xe2\x80\x8bUSIC]), true, mVolumeObserver);\nRun Code Online (Sandbox Code Playgroud)\n\n在本机代码上实现相同的方法可能不起作用,因为您需要将 ContentObserver 中的每个方法绑定到本机调用,如下所示:
\n\npublic class NativeContentObserver extends ContentObserver {\n public static final String TAG = "NativeContentObserver";\n\n private native boolean natDeliverSelfNotifications();\n private native void natDispatchChange(boolean selfChange, Uri uri);\n private native void natDispatchChange(boolean selfChange);\n private native void natOnChange(boolean selfChange, Uri uri);\n private native void natOnChange(boolean selfChange);\n\n /// ... Delegate work from here ... ///\n\n static {\n System.loadLibrary("NativeContentObserver");\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n\n因此,在进入本机代码之前,您需要先让 ContentObserver 工作。
\n