屏幕锁定,但仍在执行工作和收听 ACTION_MEDIA_BUTTON
Screen lock, but still perform work and listen to ACTION_MEDIA_BUTTON
我有一个 mainActivity,它可以通过 BroadcastReciever class 检测来自我的耳机的点击,但仅当我的应用程序处于前台时。当我的应用程序处于后台时,我希望能够做同样的事情,或者更具体地说,当我的屏幕被锁定时。现在在屏幕锁定时单击耳机上的按钮可打开 spotify。
在我的 onCreate 和等效的 onDestroy 中,我尝试使用:
powerMngr = (PowerManager)context.getSystemService(Context.POWER_SERVICE);
wakeLock = powerMngr.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "MyWakeLock");
wakeLock.acquire();
然而,这并不符合我的要求。我需要采取哪些步骤才能实现这一目标?需要什么 classes?锁屏后如何工作?
编辑:经过进一步研究,我至少知道为什么当我点击耳机按钮时 Spotify 正在启动。就是最后一个运行MediaSession
。如果我解释正确,我的应用似乎需要最新的 MediaSession 和 mediaButtonReciever
。仍然不确定如何实现这个:
https://developer.android.com/guide/topics/media-apps/mediabuttons.html
这是我当前用于捕获耳机点击的服务:
public class HeadsetActionButtonReceiver extends BroadcastReceiver {
public static Delegate delegate;
private static AudioManager mAudioManager;
private static ComponentName mRemoteControlResponder;
private static int doublePressSpeed = 300; // double keypressed in ms
private static Timer doublePressTimer;
private static int counter;
public interface Delegate {
void onMediaButtonSingleClick();
void onMediaButtonDoubleClick();
}
@Override
public void onReceive(Context context, Intent intent) {
if (intent == null || delegate == null || !Intent.ACTION_MEDIA_BUTTON.equals(intent.getAction()))
return;
KeyEvent keyEvent = (KeyEvent) intent.getExtras().get(Intent.EXTRA_KEY_EVENT);
if (keyEvent == null || keyEvent.getAction() != KeyEvent.ACTION_DOWN) return;
counter++;
if (doublePressTimer != null) {
doublePressTimer.cancel();
}
doublePressTimer = new Timer();
doublePressTimer.schedule(new TimerTask() {
@Override
public void run() {
if (counter == 1) {
delegate.onMediaButtonSingleClick();
} else {
delegate.onMediaButtonDoubleClick();
}
counter = 0;
}
}, doublePressSpeed);
}
public static void register(final Context context) {
mAudioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
mRemoteControlResponder = new ComponentName(context, HeadsetActionButtonReceiver.class);
mAudioManager.registerMediaButtonEventReceiver(mRemoteControlResponder);
}
public static void unregister(final Context context) {
mAudioManager.unregisterMediaButtonEventReceiver(mRemoteControlResponder);
if (doublePressTimer != null) {
doublePressTimer.cancel();
doublePressTimer = null;
}
}
}
我设法让它工作了。为了捕获耳机按钮点击甚至蓝牙按钮点击,您将需要 MediaSession
。您还需要定义一个 MediaSessionCompat
。您设置 MediaSession.setActive(true)
的位置,这是捕获后台点击所必需的。此外创建一个 MediaSessionCompat.Callback()
,其中您的覆盖 onMediaButtonEvent
.
按照我在此处编写的所有内容的 google 开发人员指南获取更多信息,您应该能够完成此操作。此外,服务通常 运行 在后台进行,只要它们不被破坏就能够执行工作。
我有一个 mainActivity,它可以通过 BroadcastReciever class 检测来自我的耳机的点击,但仅当我的应用程序处于前台时。当我的应用程序处于后台时,我希望能够做同样的事情,或者更具体地说,当我的屏幕被锁定时。现在在屏幕锁定时单击耳机上的按钮可打开 spotify。
在我的 onCreate 和等效的 onDestroy 中,我尝试使用:
powerMngr = (PowerManager)context.getSystemService(Context.POWER_SERVICE);
wakeLock = powerMngr.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "MyWakeLock");
wakeLock.acquire();
然而,这并不符合我的要求。我需要采取哪些步骤才能实现这一目标?需要什么 classes?锁屏后如何工作?
编辑:经过进一步研究,我至少知道为什么当我点击耳机按钮时 Spotify 正在启动。就是最后一个运行MediaSession
。如果我解释正确,我的应用似乎需要最新的 MediaSession 和 mediaButtonReciever
。仍然不确定如何实现这个:
https://developer.android.com/guide/topics/media-apps/mediabuttons.html
这是我当前用于捕获耳机点击的服务:
public class HeadsetActionButtonReceiver extends BroadcastReceiver {
public static Delegate delegate;
private static AudioManager mAudioManager;
private static ComponentName mRemoteControlResponder;
private static int doublePressSpeed = 300; // double keypressed in ms
private static Timer doublePressTimer;
private static int counter;
public interface Delegate {
void onMediaButtonSingleClick();
void onMediaButtonDoubleClick();
}
@Override
public void onReceive(Context context, Intent intent) {
if (intent == null || delegate == null || !Intent.ACTION_MEDIA_BUTTON.equals(intent.getAction()))
return;
KeyEvent keyEvent = (KeyEvent) intent.getExtras().get(Intent.EXTRA_KEY_EVENT);
if (keyEvent == null || keyEvent.getAction() != KeyEvent.ACTION_DOWN) return;
counter++;
if (doublePressTimer != null) {
doublePressTimer.cancel();
}
doublePressTimer = new Timer();
doublePressTimer.schedule(new TimerTask() {
@Override
public void run() {
if (counter == 1) {
delegate.onMediaButtonSingleClick();
} else {
delegate.onMediaButtonDoubleClick();
}
counter = 0;
}
}, doublePressSpeed);
}
public static void register(final Context context) {
mAudioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
mRemoteControlResponder = new ComponentName(context, HeadsetActionButtonReceiver.class);
mAudioManager.registerMediaButtonEventReceiver(mRemoteControlResponder);
}
public static void unregister(final Context context) {
mAudioManager.unregisterMediaButtonEventReceiver(mRemoteControlResponder);
if (doublePressTimer != null) {
doublePressTimer.cancel();
doublePressTimer = null;
}
}
}
我设法让它工作了。为了捕获耳机按钮点击甚至蓝牙按钮点击,您将需要 MediaSession
。您还需要定义一个 MediaSessionCompat
。您设置 MediaSession.setActive(true)
的位置,这是捕获后台点击所必需的。此外创建一个 MediaSessionCompat.Callback()
,其中您的覆盖 onMediaButtonEvent
.
按照我在此处编写的所有内容的 google 开发人员指南获取更多信息,您应该能够完成此操作。此外,服务通常 运行 在后台进行,只要它们不被破坏就能够执行工作。