在Android手机处于深度睡眠模式时抓住按键

问题描述

我正在尝试编写一个应用程序,该应用程序将捕获音量提高/降低以及应用程序处于待机状态时按下的蓝牙耳机button

  • 背景
  • 前景
  • 背景和手机处于睡眠模式(按下电源button)
  • 前台和手机处于睡眠模式(按下电源button)

前两点我写了一些testing应用程序,一切工作在我的情况下,我发送应用程序的背景和按音量上/下,我的应用程序捕捉这个事件。 按下电源button后,手机进入睡眠模式。 然后,我按音量上/下button手机不反应的事件,我看不到任何logcat的爱,就像一切停止工作。

在睡眠模式下检测按键的应用程序。

我认为这个问题不能解决,但是我记得当音乐播放的时候按下音量上/下button,Android标准的媒体播放器会捕获这个事件。 我认为这个应用程序可以做到这一点,因为它是系统应用程序,但是我下载Winpm播放器,并以相同的方式工作。 当手机处于睡眠模式时,Winapm捕捉音量增大/减小事件。 音乐播放器应用程序可以做到

我想了解如何做到这一点? 我怎么能写一个简单的应用程序,将捕捉音量上/下button。 那个时候我需要演奏一些音乐,还​​是我可以做到这一点? 我的意思是也许Winamp和其他应用程序捕捉该事件的主要原因是当时播放音乐。 或者,也许这个问题不能解决,如果不能解决,我想知道为什么? 我需要一些为什么不能解决的争论。

源代码

我已经testing了一些应用程序,这里是结果,我已经写了一个简单的应用程序,在后台和前台捕捉音量上下键,以及应用程序处于睡眠模式时。 当应用程序在后台和forground,一切工作正常,我的testing应用程序捕获事件,但是当我按下电源button,它停止这样做,然后我按媒体pleyer开始,它开始播放一些音乐,按下电源button后然后按音量和doun和我的应用程序统计捕捉音量上下按键 。 这意味着音乐播放后,我的应用程序可以捕捉到这些事件,所以我的下一个问题是如何模拟我的手机播放音乐? 可能是这个解决scheme吗?

的Manifest.xml

<receiver android:name="com.vito.backgroundworker.VolumeBroadcast" android:enabled="true"> <intent-filter> <action android:name="android.media.VOLUME_CHANGED_ACTION" /> </intent-filter> </receiver> <receiver android:name="RemoteControlReceiver"> <intent-filter> <action android:name="android.intent.action.MEDIA_BUTTON" /> </intent-filter> </receiver> 

MainActivity.java

 public class MainActivity extends Activity { private PowerManager.WakeLock wl; //private BroadcastReceiver vol = new VolumeBroadcast(); private AudioManager mAudioManager; private ComponentName mRemoteControlResponder; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); wl = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK, "DoNjfdhotDimScreen"); mAudioManager = (AudioManager)getSystemService(Context.AUDIO_SERVICE); mRemoteControlResponder = new ComponentName(getPackageName(), RemoteControlReceiver.class.getName()); } @Override protected void onPause() { super.onPause(); mAudioManager.registerMediaButtonEventReceiver( mRemoteControlResponder); wl.release(); }//End of onPause @Override protected void onResume() { super.onResume(); wl.acquire(); }//End of onResume @Override public void onDestroy() { super.onDestroy(); mAudioManager.unregisterMediaButtonEventReceiver( mRemoteControlResponder); } } 

Solutions Collecting From Web of "在Android手机处于深度睡眠模式时抓住按键"

看看registerMediaButtonEventReceiver() 。 你必须注册你的应用程序作为这些事件的接收者才能够接收它们。

这里有一些你应该看的链接:

根据我的经验,即使设备处于前台服务状态(媒体button不会唤醒),设备仍处于睡眠状态时,应用程序无法收到媒体button广播。 保持部分唤醒锁可以防止它睡觉,从而检测到button按下。 我怀疑你的音乐播放应用程序持有唤醒锁,这就是为什么它的作品。 我想被certificate是错的,不需要唤醒锁虽然…

我发现一个开源应用程序,实际上是通过按音量button将手机从睡眠中唤醒。 https://github.com/praslnx8/volume_Screen_Lock

这个应用程序使用服务播放媒体。

在播放媒体时,即使手机屏幕被locking,音量button动作也会始终发送到相应的接收器。