我正在尝试制作一个可检测何时全局按下音量按钮的应用程序。我不需要更改音量,我只想知道何时更改。我已经可以做到这一点,问题是我不能以足够的时间精度做到这一点。
当前,如果我按下按钮的速度过快(例如1秒钟之内),例如上下,那么它只会检测到一半的按下。如果我在两次按下之间进行了短暂(半秒钟)的暂停,那么它将检测到每个单独的按钮按下都很好。
问题是我不希望用户必须学会在按钮按下之间等待键入正确的图案。
这是我的服务代码:
public class VolumeService extends Service {
private AudioManager mAudioManager;
private Handler mHandler = null;
private SettingsObserver mVolumeObserver;
private final IBinder mIBinder = new LocalBinder();
class SettingsObserver extends ContentObserver {
Context context;
int currentVolume;
SettingsObserver(Context c, Handler handler) {
super(handler);
context = c;
mAudioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
currentVolume = mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
}
@Override
public void onChange(boolean selfChange) {
super.onChange(selfChange);
int volumeChange = mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC) - currentVolume;
currentVolume = mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
int volumeCode = -1;
if (volumeChange < 0) {
volumeCode = 0;
} else if (volumeChange > 0) {
volumeCode = 1;
}
MainActivity.getInstance().updatePattern(volumeCode);
}
}
@Override
public void onCreate() {
super.onCreate();
mAudioManager = (AudioManager) getSystemService(AUDIO_SERVICE);
mVolumeObserver = new SettingsObserver(this, new Handler());
getApplicationContext().getContentResolver().registerContentObserver(Settings.System.CONTENT_URI, true, mVolumeObserver);
}
主要活动只是获取一个包含内容观察者注册的按钮按下的数组,并将其打印出来。