代码之家  ›  专栏  ›  技术社区  ›  thelastchief

屏幕锁定,但仍执行工作并收听ACTION\u MEDIA\u按钮

  •  0
  • thelastchief  · 技术社区  · 7 年前

    我有一个mainActivity,可以通过BroadcastReceiver类检测耳机中的点击,但只有当我的应用程序在前台时才可以。我希望在我的应用程序处于后台时也能做到同样的事情,或者在屏幕锁定时更具体一些。屏幕锁定后,立即单击耳机上的按钮可打开spotify。

    在onCreate和等效onDestroy中,我尝试使用:

        powerMngr = (PowerManager)context.getSystemService(Context.POWER_SERVICE);
        wakeLock = powerMngr.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "MyWakeLock");
        wakeLock.acquire();
    

    然而,这并不是我想要的。为了实现这一目标,我需要采取哪些步骤?需要什么课程?当屏幕锁定时,如何执行工作?

    编辑:经过进一步的研究,当我点击Headset按钮时,我至少知道为什么Spotify会启动。这是最后一次跑步 MediaSession . 如果我解释正确,我的应用程序似乎需要有最新的MediaSession和 mediaButtonReciever . 仍然不确定如何实现此tho: https://developer.android.com/guide/topics/media-apps/mediabuttons.html

    这是im当前用于捕获耳机点击的服务:

    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;
        }
    }
    

    }

    1 回复  |  直到 7 年前
        1
  •  0
  •   thelastchief    7 年前

    我设法让它工作起来了。要捕获耳机按钮的点击,甚至蓝牙按钮的点击,您需要 MediaSession . 您还需要定义 MediaSessionCompat . 您设置的位置 MediaSession.setActive(true) ,这是在后台捕获点击的必要条件。此外,创建 MediaSessionCompat.Callback() 您的覆盖 onMediaButtonEvent .

    按照我在这里写的所有东西的googles开发者指南来获取更多信息,你应该能够做到这一点。此外,服务通常在后台运行,只要不被破坏,就可以执行工作。