使用FLAG_SHOW_WHEN_LOCKED与disableKeyguard()在安全的Andro

2019-07-30 19:01发布

上下文

最近,我一直在寻找可靠的方法来控制一个固定的Android键盘锁。 主要显示自定义锁屏。 我知道,谷歌曾表示自定义锁屏没有正式平台支持,并应期待的东西打破,但是,与现有的API,我相信一定有办法做到这一点。 我已经做吨的研究为一个星期左右,但在这里和那里仍然有问题。 我已经实现,假设一个安全锁键被启用,至今都,

  • WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED允许在屏幕上显示的活动(窗口),把键盘锁的后面,并且防止所有不安全的行动。 通知面板被禁用,整理活动将弹出键盘锁。 我实现我的锁屏界面活性以下。

     @Override public void onAttachedToWindow() { window.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED); } 
  • KeyguardManagerKeyguardManager.KeyguardLock是过时的类,但他们仍然可以工作一直到果冻豆。 要做到这一点,我有一个Service ,处理两件事情,拿着静态KeyguardManager和相关对象,并将其持有BroadcastReceiver接收Intent.ACTION_SCREEN_ONIntent.ACTION_SCREEN_OFF 。 (所有的对象都正确初始化)


对于ScreenReceiver

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;
        }
}

对于BroadcastReceiver

@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();

问题

  • 事情的作品

    • ACTION_ONACTION_OFF被可靠地接收。
    • LockScreenActivity在键盘保护之前所示(没有电话状态处理尚未)
    • 通知不能被拉低,退出以任何方式将显示在锁屏的活动。
  • 事情不工作

    • 我禁用后, Keyguard ,并呼吁结束(),我的应用程序退出和主屏幕或最后一次活动前的画面去了显示。 但是,每当我按HOME键,键盘锁会闪烁到画面中,很快立即解雇本身,而普通家庭的关键函数/事件没有被处理(闪烁后不会回到主屏幕)。 当我迅速挖掘Home键多次发生此种情况。

我甚至看到Android源代码,找出HOME键处理,但除非该窗口的类型是它永远不会发送给第三方应用程序WindowManager.LayoutParams.TYPE_KEYGUARDWindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG ,这将抛出抛出:SecurityException上4.0+即使它的工作较早的平台。 而对于Keyguard ,我宣布DISABLE_KEYGUARD许可使用这不应该成为问题。 我的猜测是标志FLAG_SHOW_WHEN_LOCKED会告诉系统来处理,以Keyguard在将与其他禁用呼叫冲突某些方面。 由于该标志主要用于报警/ SMS类型的应用程序,这是显示有限的信息给用户,然后解雇自己和调出Keyguard 。 但在我的情况下,让用户打开我的锁屏解锁,然后简单地锁屏系统击败我的应用程序的目的。

所以,问题是为什么会在Keyguard时,我按Home键闪烁后,我禁用了吗? 是否有此问题的任何解决方法/解决方案?

PS感谢您阅读这么长的问题。 这是我第一次问一个问题在这里,如果有什么是我做错了,请告诉我(即格式,语法,代码约定,标签等)。 此外,我曾与任何编程知识没有经验,我开始使用Android之前,我知道Java是什么。 所以,我没有采取任何适当的课程/培训呢,这个社会是真棒,经常帮人喜欢我,即使他们是简单的问题,当然关注着谷歌I / O视频,阅读博客,阅读别人的代码,帮助我很多。 所以,请容忍任何愚蠢的错误/缺陷明显/愚蠢的问题。 我只有16 ^ _ ^”

Answer 1:

我已经取得了一些成功的两个姜饼和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);
}


Answer 2:

而解锁设备我有HOME键的点击同样的问题。 这可以通过正在重置密码为空(即“”)来解决:

DevicePolicyManager devicePolicyManager;
ComponentName demoDeviceAdmin;


devicePolicyManager.setPasswordQuality(demoDeviceAdmin,DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED);
devicePolicyManager.setPasswordMinimumLength(demoDeviceAdmin, 0);

devicePolicyManager.resetPassword("",DevicePolicyManager.RESET_PASSWORD_REQUIRE_ENTRY);

然后禁用keygaurd:

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

希望这会解决你的问题。 \ M /保持编码!



Answer 3:

WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED允许一个活动被显示(窗口)在屏幕上,把键盘保护背后

我试图让这一点,但我的活动总是由系统锁屏之前。 isOrderdBroadcast()说,ACTION_SCREEN_NO是一个有序的广播。

我加了标志的活动:

getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);

在onAttachedView()。 不过还是系统锁越过我的自定义锁屏活动的偏好。

你是如何在系统锁屏前,让您的活动?

编辑在一事后,我觉得我的锁屏概念的理解是错误的。 我的广播接收器首次获得广播。 但什么是之前显示为接收SCREEN_OFF时推出的系统锁屏。 修正了一个问题,因为现在。

但是,通过主页按钮的行为模糊难住了。 因为所有的硬按键都望而却步这会不会是在后ICS设备的问题。



Answer 4:

在你LockScreenActivity,终止验证代码finish(); 杀死LockscreenActivity从而对整个应用程序。 取而代之的是,你可以只启动回你的主要活动(或任何其他)是这样的:

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


Answer 5:

如果AOSP是在你的控制,那么你需要设置简单的标志和键盘锁()是走了。 下面是详细信息要做到这一点,进入文件“覆盖/框架/基/包/ SystemUI / RES /价值/ config.xml文件”,然后搜索“config_enableKeyguardService”,然后设置该标志为false。

NO MORE键盘锁,pheww



文章来源: Using FLAG_SHOW_WHEN_LOCKED with disableKeyguard() in secured Android lock screen