唤醒锁在 android 棒棒糖 (API 21) 5.0.2 中不起作用

Wake Lock not working in android lollipop (API 21) 5.0.2

我正在使用 "Call" 应用程序。

我在 API 21 中发布 'wake lock' 时遇到问题。(它与 > Kitkat API 但 API 21 一起工作正常)。

我开始调用 activity 的代码是:

Intent callIntent = new Intent(context, CallActivity.class);
                    callIntent.putExtra(QBServiceConsts.EXTRA_OPPONENTS, (Serializable) qbUsersList);
                    callIntent.putExtra(QBServiceConsts.EXTRA_START_CONVERSATION_REASON_TYPE,
                            StartConversationReason.INCOME_CALL_FOR_ACCEPTION);
                    callIntent.putExtra(QBServiceConsts.EXTRA_CONFERENCE_TYPE, qbConferenceType);
                    callIntent.putExtra(QBServiceConsts.EXTRA_SESSION_DESCRIPTION, qbRtcSessionDescription);
                    callIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                    context.getApplicationContext().startActivity(callIntent);

这是解锁设备。

  km = (KeyguardManager) context .getSystemService(Context.KEYGUARD_SERVICE);
                kl = km .newKeyguardLock("MyKeyguardLock");
                kl.disableKeyguard();
                PowerManager pm = (PowerManager) context .getSystemService(Context.POWER_SERVICE);
                wakeLock = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP | PowerManager.ON_AFTER_RELEASE, "MyWakeLock");
                wakeLock.acquire();

我在调用 activity.

中尝试了这段代码
 Window window = getWindow();
        window.addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD
                | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
                | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
                | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

我的清单是:

<activity
            android:name=".ui.activities.call.CallActivity"
            android:configChanges="keyboardHidden|orientation|screenSize"
            android:launchMode="singleTask"
            android:screenOrientation="portrait" />

我发现使用创建一个 activity 并在其中设置标志 keyguard_dismiss 的解决方案。

public class KeyGuardDismissActivity extends Activity {

    private ScreenOnReceiver receiver;
    public static final String TAG = KeyGuardDismissActivity.class.getSimpleName();
    private static List<QBUser> qbUsersList;
    private static QBRTCTypes.QBConferenceType qbConferenceType;
    private static QBRTCSessionDescription qbRtcSessionDescription;

    public static KeyGuardDismissActivity instance;

    @Override
    public void onAttachedToWindow() {
        super.onAttachedToWindow();
        Window window = getWindow();
        window.addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD
                | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
                | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
                | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        Log.e(TAG,"Start keyguard dismisser!");
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
            startActivity(new Intent(getApplicationContext(),CallActivity.class));
            finish();
            return;
        }

        qbUsersList = (ArrayList<QBUser>)getIntent().getSerializableExtra(QBServiceConsts.EXTRA_OPPONENTS);
        qbConferenceType = (QBRTCTypes.QBConferenceType) getIntent().getExtras().getSerializable(QBServiceConsts.EXTRA_CONFERENCE_TYPE);
        qbRtcSessionDescription = (QBRTCSessionDescription) getIntent().getExtras().getSerializable(QBServiceConsts.EXTRA_SESSION_DESCRIPTION);

        instance = this;
        receiver = new ScreenOnReceiver();
//        registerReceiver(receiver, receiver.getFilter());

        Intent broadcast = new Intent(KeyGuardDismissActivity.this, ScreenOnReceiver.class);
        sendBroadcast(broadcast);

    }

    @Override
    protected void onStart() {
        super.onStart();
        instance = this;
    }

    public void dismissingKeyguard() {
        Log.e(TAG, "Dismissing keyguard!");

        Handler handler = new Handler();
        handler.postDelayed(new Runnable() {
            @Override
            public void run() {
                Intent yourRealActivity = new Intent(getApplicationContext(), CallActivity.class);
                yourRealActivity.putExtra(QBServiceConsts.EXTRA_OPPONENTS, (Serializable) qbUsersList);
                yourRealActivity.putExtra(QBServiceConsts.EXTRA_START_CONVERSATION_REASON_TYPE,
                        StartConversationReason.INCOME_CALL_FOR_ACCEPTION);
                yourRealActivity.putExtra(QBServiceConsts.EXTRA_CONFERENCE_TYPE, qbConferenceType);
                yourRealActivity.putExtra(QBServiceConsts.EXTRA_SESSION_DESCRIPTION, qbRtcSessionDescription);
                yourRealActivity.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                startActivity(yourRealActivity);
//                if (receiver != null) {
//                    unregisterReceiver(receiver);
//                }
            }
        }, 1000);

        finish();

    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        getWindow().clearFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD
                | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
                | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
                | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

    }

    public static class ScreenOnReceiver extends BroadcastReceiver {

        @Override
        public void onReceive(Context context, Intent intent) {
            Log.e(TAG,"Screen on, yay!");
            KeyGuardDismissActivity.instance.dismissingKeyguard();
        }

        public IntentFilter getFilter() {
            IntentFilter filter = new IntentFilter();
            filter.addAction(Intent.ACTION_SCREEN_ON);
            return filter;
        }
    }
}

并且还在调用 activity 中设置标志。