【问题标题】:Unlock android device not working while call ACTION_CALL intent调用 ACTION_CALL 意图时解锁 android 设备不工作
【发布时间】:2020-04-27 10:52:41
【问题描述】:

我正在收到一个推送通知,在那个通知中,正在调用前台服务。

从服务中,我正在调用一个 Activity。

在这里,我有 2 个功能。

1.紧急声音警报

2。使用 ACTION_CALL 调用。

如果设备解锁,两者都可以正常工作。

但是,如果设备被锁定密码或模式,它在推送接收时不起作用。

以下代码可解锁设备。此方法从 onStart 调用。

private void unlockDevice() {

    KeyguardManager loKeyguardManager = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE);
    Window loWindow = this.getWindow();

    if (Common.isAboveAPI27()) {
        setShowWhenLocked(true);
        setTurnScreenOn(true);
    } else if (Common.isAboveAPI26()) {
        loWindow.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
        loWindow.addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
        dismissKeyguard(loKeyguardManager);
    } else {
        if (loKeyguardManager != null) {
            KeyguardManager.KeyguardLock loKeyguardLock = loKeyguardManager.newKeyguardLock("FullWakeUps");
            loKeyguardLock.disableKeyguard();
        }
        loWindow.addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD); // Deprecated in 26
        loWindow.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED); // Deprecated in 27
        loWindow.addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON); // Deprecated in 27
    }

    //Keep screen on
    loWindow.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
}

@RequiresApi(api = Build.VERSION_CODES.O)
private void dismissKeyguard(KeyguardManager loKeyguardManager) {
    if (loKeyguardManager != null) {
        loKeyguardManager.requestDismissKeyguard(SOSCallAndAlarmActivity.this, new KeyguardManager.KeyguardDismissCallback() {
            @Override
            public void onDismissError() {
                super.onDismissError();
                Log.i(TAG, Build.VERSION.SDK_INT + " : onDismissError");
            }

            @Override
            public void onDismissSucceeded() {
                super.onDismissSucceeded();
                Log.i(TAG, Build.VERSION.SDK_INT + " : onDismissSucceeded");
            }

            @Override
            public void onDismissCancelled() {
                super.onDismissCancelled();
                Log.i(TAG, Build.VERSION.SDK_INT + " : onDismissCancelled");
            }
        });
    }
}

下面的方法是调用 onDestroy 来重新启用锁:

private void reEnabledKeyguard() {
    KeyguardManager loKeyguardManager = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE);
    if (loKeyguardManager != null) {
        KeyguardManager.KeyguardLock loKeyguardLock = loKeyguardManager.newKeyguardLock("FullWakeUps");
        loKeyguardLock.reenableKeyguard();
    }
    Window loWindow = this.getWindow();
    loWindow.addFlags(WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON);
}

发起呼叫的代码。

public void callOnNumbers(String fsPhoneNumber) {
    Intent loCallIntent = new Intent(Intent.ACTION_CALL);
    loCallIntent.setData(Uri.parse("tel:" + fsPhoneNumber));
    //callIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // tried this but not helped.
    if (ActivityCompat.checkSelfPermission(CallAndAlarmActivity.this,
            android.Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
        Log.i(TAG, "call phone permission not granted");
        return;
    }
    startActivity(loCallIntent);
}

奇怪的是,当这种方法打开通话屏幕闪烁并再次在锁定屏幕上显示密码屏幕时,只需按返回按钮我就可以看到通话屏幕。

我还需要知道一件事,即使我设置了所有应用程序终止选项并禁用了电池优化。推送接收时未执行相同的代码。

当设备处于非活动状态半小时,如果收到推送,上面的代码甚至没有打开灯。当我单击锁定/解锁按钮时,我可以正确看到我的屏幕。即使我在 30 秒的推送接收时间后按下它。

android N 面临的问题。

附加 当 ACTION_CALL 意图调用它来执行我的活动 onPause 并且我没有在 onPause 中添加任何代码时,我可以在 logcate 中看到一个错误

2020-04-27 16:23:47.400 25826-25826/app.safety E/ActivityThread: Performing stop of activity that is already stopped: {app.safety/app.safety.CallAndAlarmActivity}
java.lang.RuntimeException: Performing stop of activity that is already stopped: {app.safety/app.safety.CallAndAlarmActivity}
    at android.app.ActivityThread.performStopActivityInner(ActivityThread.java:4089)
    at android.app.ActivityThread.handleStopActivity(ActivityThread.java:4177)
    at android.app.ActivityThread.-wrap24(Unknown Source:0)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1648)
    at android.os.Handler.dispatchMessage(Handler.java:106)
    at android.os.Looper.loop(Looper.java:164)
    at android.app.ActivityThread.main(ActivityThread.java:6687)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:810)
2020-04-27 16:23:47.400 25826-25826/app.safety E/ActivityThread: ActivityClientRecord{paused=true, stopped=true, hideForNow=false, startsNotResumed=false, isForward=false, pendingConfigChanges=0, onlyLocalRequest=false, preserveWindow=false, Activity{resumed=false, stopped=true, finished=false, destroyed=false, startedActivity=false, temporaryPause=false, changingConfigurations=false}}

谢谢

【问题讨论】:

标签: android android-doze keyguard


【解决方案1】:

我想知道它是否与Android中的Background Execution Limit.有关。我会推荐看看这篇文章。

https://medium.com/exploring-android/exploring-background-execution-limits-on-android-oreo-ab384762a66c

希望对你有帮助。

【讨论】:

  • 感谢您的意见,但我已将我的应用从设置中列入白名单。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-19
  • 1970-01-01
  • 2011-03-28
相关资源
最近更新 更多