Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在屏幕关闭且手机锁定的情况下,通过intent启动第三方应用程序_Android_Android Intent_Android Wake Lock - Fatal编程技术网

Android 在屏幕关闭且手机锁定的情况下,通过intent启动第三方应用程序

Android 在屏幕关闭且手机锁定的情况下,通过intent启动第三方应用程序,android,android-intent,android-wake-lock,Android,Android Intent,Android Wake Lock,我的应用程序需要在屏幕关闭且手机锁定时启动第三方应用程序(Google Now)。目前,我正在使用KeyGuardManager和Wakelocks的组合来实现这一点,但它似乎非常不可靠,只有50%的手机在50%的时间内工作。有更好的方法吗?我当前的代码有问题吗?提前谢谢 public void activateGoogleNow() { stopListening(); if (myAudioManager != null) { myAudioManager.s

我的应用程序需要在屏幕关闭且手机锁定时启动第三方应用程序(Google Now)。目前,我正在使用KeyGuardManager和Wakelocks的组合来实现这一点,但它似乎非常不可靠,只有50%的手机在50%的时间内工作。有更好的方法吗?我当前的代码有问题吗?提前谢谢

public void activateGoogleNow() {
    stopListening();
    if (myAudioManager != null) {
        myAudioManager.startListening();
    }
    if (PreferenceManager.getDefaultSharedPreferences(context).getBoolean(
        "listen_screen_off", false)) {
        final KeyguardManager keyguardManager = (KeyguardManager) context
                .getSystemService(Context.KEYGUARD_SERVICE);
        final PowerManager powerManager = (PowerManager) context
                .getSystemService(Context.POWER_SERVICE);
        if (!powerManager.isScreenOn()) {
            WakelockManager.turnOnScreen(context);
            final Handler waitForUnlock = new Handler(
                    new Handler.Callback() {

                        @Override
                        public boolean handleMessage(Message msg) {
                            startGoogleNow();
                            return true;
                        }
                    });
            new Thread(new Runnable() {

                @Override
                public void run() {
                    while (!powerManager.isScreenOn()) {
                        try {
                            Thread.sleep(500);
                        } catch (InterruptedException e) {}
                    }
                    myAudioManager.lockscreenDeactivated = true;
                    KeyguardLock mLock = keyguardManager
                            .newKeyguardLock("OpenMic");
                    mLock.disableKeyguard();
                    waitForUnlock.sendEmptyMessage(0);
                }
            }).start();
        } else {
            startGoogleNow();
        }
    } else {
        startGoogleNow();
    }
}

private void startGoogleNow() {
    final Intent intent = new Intent("android.intent.action.MAIN");
    intent.setComponent(new ComponentName(
            "com.google.android.googlequicksearchbox",
            "com.google.android.googlequicksearchbox.VoiceSearchActivity"));
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
        | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED
        | Intent.FLAG_FROM_BACKGROUND);
    context.startActivity(intent);
}

public static void turnOnScreen(Context context) {
    PowerManager pm = (PowerManager) context
            .getSystemService(Context.POWER_SERVICE);
    PowerManager.WakeLock wl = pm.newWakeLock(
        PowerManager.SCREEN_BRIGHT_WAKE_LOCK | PowerManager.FULL_WAKE_LOCK
            | PowerManager.ACQUIRE_CAUSES_WAKEUP, "Open Mic screen");
    wl.acquire(1000);
}

唯一不同的是,我还添加了PowerManager.FULL_WAKE_LOCK标志(至少在2.3和4.0手机上,它似乎工作得很好):


屏幕似乎很好地唤醒了,这更多的是锁屏被禁用的问题,我猜如果我在屏幕打开之前禁用键盘防护,它就不工作了?正确,我这样做的方式是唤醒手机,然后禁用键盘防护。好的,我试着更改了这个代码,仍然不可靠。。。还有其他想法吗?你在哪里使用这个代码?如果手机处于休眠状态,您可能需要AlarmManager在具有唤醒锁的服务中唤醒它。您是否检查该服务是否真的获得了唤醒锁?@Mr_and_Mrs_D嗯,我是这样做的,而(!powerManager.isScreenOn()){sleep}这就足够了吗?
pm.newWakeLock((PowerManager.SCREEN_BRIGHT_WAKE_LOCK | PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP)