Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/210.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 在安卓安全锁屏中使用disableKeyguard()锁定时使用标志\u SHOW \u 上下文_Android_Android Intent - Fatal编程技术网

Android 在安卓安全锁屏中使用disableKeyguard()锁定时使用标志\u SHOW \u 上下文

Android 在安卓安全锁屏中使用disableKeyguard()锁定时使用标志\u SHOW \u 上下文,android,android-intent,Android,Android Intent,最近,我一直在寻找可靠的方法来控制安全的安卓键盘。主要用于显示自定义锁屏。我知道谷歌已经声明定制锁屏并没有得到该平台的正式支持,应该预计会出现问题,但是,对于现有的API,我相信一定有办法做到这一点。我已经做了一周的大量研究,但仍有一些问题。我所实现的,假设启用了安全键盘保护,到目前为止 WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED允许在屏幕上显示活动(窗口),将键盘防护装置放在后面,并防止所有不安全的操作。通知面板被禁用,完成活动将打开键盘

最近,我一直在寻找可靠的方法来控制安全的安卓键盘。主要用于显示自定义锁屏。我知道谷歌已经声明定制锁屏并没有得到该平台的正式支持,应该预计会出现问题,但是,对于现有的API,我相信一定有办法做到这一点。我已经做了一周的大量研究,但仍有一些问题。我所实现的,假设启用了安全键盘保护,到目前为止

  • WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED允许在屏幕上显示活动(窗口),将键盘防护装置放在后面,并防止所有不安全的操作。通知面板被禁用,完成活动将打开键盘。我在锁屏活动中实现了以下功能

    @Override
    public void onAttachedToWindow() {
        window.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
    }
    
  • KeyguardManager
    KeyguardManager.KeyguardLock
    是不推荐使用的类,但它们仍然可以一直工作到Jelly Bean。要做到这一点,我有一个
    服务
    ,它处理两件事,一个是固定的
    键盘管理器
    和相关对象,另一个是固定的
    广播接收器
    接收
    意图。动作屏幕打开
    意图。动作屏幕关闭
    。(所有对象都已正确初始化)


对于
屏幕接收器

public static synchronized void disableKeyguard() {
    if ( isLocked ) {
        if ( keyguardLock == null ) {
            keyguardLock = keyguardManager.newKeyguardLock(LOG_TAG);
        }
        keyguardLock.disableKeyguard();
        isLocked = false;
    }
}

public static synchronized void reenableKeyguard() {
    if ( !isLocked ) {
        if ( keyguardLock == null ) {
            keyguardLock = keyguardManager.newKeyguardLock(LOG_TAG);
        }
        keyguardLock.reenableKeyguard();
        keyguardLock = null;
        isLocked = true;
        }
}
@Override
public void onReceive( Context context, Intent intent ) {
    if ( intent.getAction().equals(Intent.ACTION_SCREEN_ON) ) {
        Intent start = new Intent(context, LockScreen.class);
        start.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
        context.startActivity(start);
    } else if ( intent.getAction().equals(Intent.ACTION_SCREEN_OFF) ) {
        ScreenReceiverService.reenableKeyguard();
    }
}

对于
BroadcastReceiver

public static synchronized void disableKeyguard() {
    if ( isLocked ) {
        if ( keyguardLock == null ) {
            keyguardLock = keyguardManager.newKeyguardLock(LOG_TAG);
        }
        keyguardLock.disableKeyguard();
        isLocked = false;
    }
}

public static synchronized void reenableKeyguard() {
    if ( !isLocked ) {
        if ( keyguardLock == null ) {
            keyguardLock = keyguardManager.newKeyguardLock(LOG_TAG);
        }
        keyguardLock.reenableKeyguard();
        keyguardLock = null;
        isLocked = true;
        }
}
@Override
public void onReceive( Context context, Intent intent ) {
    if ( intent.getAction().equals(Intent.ACTION_SCREEN_ON) ) {
        Intent start = new Intent(context, LockScreen.class);
        start.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
        context.startActivity(start);
    } else if ( intent.getAction().equals(Intent.ACTION_SCREEN_OFF) ) {
        ScreenReceiverService.reenableKeyguard();
    }
}

对于
LockScreenActivity
,当用户输入正确的密码时

window.clearFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
ScreenReceiverService.disableKeyguard();
finish();

问题
  • 有效的东西

    • 操作打开
      操作关闭
      被可靠地接收
    • 锁屏活动显示在键盘护卫前(尚未进行电话状态处理)
    • 无法下拉通知,以任何方式退出活动都会显示锁屏
  • 不起作用的事情

    • 禁用
      Keyguard
      并调用finish()后,我的应用程序退出并显示主屏幕或屏幕关闭前的最后一个活动。但是,每当我按下Home键时,键盘护卫将闪烁进入屏幕,并立即自动关闭,并且正常的Home键功能/事件未被处理(闪烁后不会返回主屏幕)。当我快速地反复敲击Home键时,可以观察到这一点
我甚至查看了Android源代码以了解主密钥处理,但除非窗口类型为
WindowManager.LayoutParams.type_KEYGUARD
WindowManager.LayoutParams.type_KEYGUARD_DIALOG
,否则它永远不会发送给第三方应用程序,这将在4.0+上引发SecurityException,即使它在早期的平台上工作。对于
Keyguard
,我已经声明
DISABLE\u Keyguard
权限使用这不应该是问题所在。我猜当锁定时,
flag\u SHOW\u将告诉系统以与其他禁用调用冲突的方式处理
Keyguard
。由于此标志主要用于报警/SMS类型的应用程序,即向用户显示有限的信息,然后自行关闭并打开
键盘。但在我的情况下,让用户解锁我的锁屏,然后解锁系统锁屏,这完全违背了我应用程序的目的

那么问题是,为什么禁用了
键盘锁后,每当我按Home键时,
键盘锁就会闪烁?是否有解决此问题的方法/解决方案?

另外,谢谢你阅读这么长的问题。这是我第一次在这里问问题,如果我做错了什么,请告诉我(即格式、语法、代码约定、标记等)。我也没有任何编程知识的经验,我在知道Java是什么之前就开始使用Android。所以我还没有参加过任何适当的课程/培训,这个社区非常棒,经常帮助像我这样的人,即使他们只是简单的问题,当然,观看谷歌I/O视频、阅读博客、阅读别人的代码对我帮助很大。所以请容忍任何愚蠢的错误/明显的错误/愚蠢的问题。我只有16岁^_^"

WindowManager.LayoutParams.FLAG_在锁定时显示允许活动(a 窗口)显示在屏幕上,将键盘防护装置放在后面

我试图获取此信息,但我的活动之前总是有系统锁定屏幕。isOrderdBroadcast()表示操作屏幕是一个有序的广播

我在活动中添加了标志:

getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
在onAttachedView()中,但系统锁仍然优先于我的自定义屏幕锁活动

在系统锁定屏幕之前,您是如何进行活动的

编辑 事后来看,我认为我对锁屏概念的理解是错误的。我的广播接收器首先接收广播。但在此之前显示的是收到screen_OFF时启动的系统锁屏。目前已修复该问题


但由于主页按钮行为的模糊性,这在post ICS设备中不会成为问题,因为所有硬按钮都不受欢迎。

我在姜饼和ICS中都成功地使用了它来打开我的活动(通过启动它的后台服务)。在正在启动的活动中:

@Override
public void onAttachedToWindow() {
    this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN | 
            WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD | 
            WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | 
            WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON,
            WindowManager.LayoutParams.FLAG_FULLSCREEN | 
            WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD | 
            WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | 
            WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
}

在LockScreenActivity中,通过
finish();
结束验证代码将终止LockScreenActivity,从而终止整个应用程序。相反,您可以像这样重新启动主活动(或任何其他活动):

startActivity(new Intent(LockScreenActivity.this, MainActivity.class));

我在解锁设备时单击HOME(主页)按钮时遇到了同样的问题。这可以通过将密码重置为空白(即“”)来解决:

然后禁用键盘:

this.keyGuardLock = ((KeyguardManager)getSystemService("keyguard")).newKeyguardLock("keyguard");
keyGuardLock.disableKeyguard();

希望这能解决您的问题。\m/继续编码!

如果AOSP在您的控制下,那么您需要设置简单标志,keyguard()将永远消失。 下面是做这件事的细节,进入文件 “覆盖