1

画面がオフで電話がロックされているときに、アプリでサードパーティ アプリ (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);
}
4

1 に答える 1

2

私が違うことをしている唯一のことは、PowerManager.FULL_WAKE_LOCK フラグも追加することです (これは、少なくとも 2.3 および 4.0 の電話ではうまくいくようです):

pm.newWakeLock((PowerManager.SCREEN_BRIGHT_WAKE_LOCK | PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP)
于 2013-08-04T19:25:55.187 に答える