Android-检测手机解锁事件,而不是屏幕打开

Android-检测手机解锁事件,而不是屏幕打开,android,Android,有没有办法检测用户何时解锁手机?我知道操作屏幕打开和操作屏幕关闭,但当按下电源按钮时屏幕打开/关闭时,这些似乎会触发,但实际上当按下菜单按钮时手机解锁时,它们不会触发 我正在尝试在活动运行时检测解锁/锁定,并希望在解锁后恢复该活动。没有测试它,但尝试以下操作: 等待操作屏幕打开 (屏幕打开后,)使用category_HOME(启动主屏幕)等待ACTION_MAIN(主屏幕)-这可能是手机解锁后发送的内容 第一步需要过滤掉常规的主按键。以下是操作: 假设您希望在手机解锁时检测解锁事件并在活动中

有没有办法检测用户何时解锁手机?我知道
操作屏幕打开
操作屏幕关闭
,但当按下电源按钮时屏幕打开/关闭时,这些似乎会触发,但实际上当按下菜单按钮时手机解锁时,它们不会触发


我正在尝试在活动运行时检测解锁/锁定,并希望在解锁后恢复该活动。

没有测试它,但尝试以下操作:

  • 等待
    操作屏幕打开
  • (屏幕打开后,)使用category_HOME(启动主屏幕)等待ACTION_MAIN(主屏幕)-这可能是手机解锁后发送的内容
第一步需要过滤掉常规的主按键。

以下是操作:

假设您希望在手机解锁时检测解锁事件并在活动中执行某些操作。为操作屏幕打开、操作屏幕关闭和操作用户在场配备广播接收器

启动操作屏幕时,将调用活动的onResume。创建处理程序并等待操作用户出现。当它被触发时,实现您想要的活动


Commonware的回答值得称赞:

经过一段时间的努力,我发现最好的方法是在“android.intent.action.USER\u PRESENT”操作上注册一个广播接收器

“广播操作:在设备唤醒后,当用户在场时发送(例如,当钥匙护卫消失时)。”

要区分用户在未锁定手机屏幕时打开手机屏幕和实际解锁手机屏幕的情况,请使用KeyguardManager检查安全设置

代码示例:

将此添加到您的活动中:

registerReceiver(new PhoneUnlockedReceiver(), new IntentFilter("android.intent.action.USER_PRESENT"));
public class PhoneUnlockedReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {

        KeyguardManager keyguardManager = (KeyguardManager)context.getSystemService(Context.KEYGUARD_SERVICE);
        if (keyguardManager.isKeyguardSecure()) {
            //phone was unlocked, do stuff here
        }
    }
}       
然后使用这个类:

registerReceiver(new PhoneUnlockedReceiver(), new IntentFilter("android.intent.action.USER_PRESENT"));
public class PhoneUnlockedReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {

        KeyguardManager keyguardManager = (KeyguardManager)context.getSystemService(Context.KEYGUARD_SERVICE);
        if (keyguardManager.isKeyguardSecure()) {
            //phone was unlocked, do stuff here
        }
    }
}       
按此语句注册接收者

receiver = new PhoneUnlockedReceiver();
        IntentFilter filter = new IntentFilter();
        filter.addAction(Intent.ACTION_USER_PRESENT);
        filter.addAction(Intent.ACTION_SCREEN_OFF);
        registerReceiver(receiver, filter);

但这对所有的手机都有效吗?例如,在myTouch上按Menu(菜单)按钮可解锁手机,其他一些手机要求您在手机上滑动。那么,有什么东西可以包罗万象吗?我相信,为了运行主屏幕(即启动器),肯定会调用category_HOME的所谓ACTION_MAIN。然而,有很多安卓手机,所以我不能100%肯定。最好试一试,看看它是否适合你。我想我忘了提到我正在运行一个活动,在它运行时,我想锁定/解锁屏幕,并在解锁后恢复活动。等待操作主目录和类别主目录只是在解锁时冻结我的活动。不确定冻结是什么意思。当您锁定手机时,您的活动将暂停,解锁后活动将恢复-因此在这种特定情况下(即在运行时锁定/解锁),您可能可以使用这些方法来检测您需要的内容。从Google“ACTION\u MAIN with category\u HOME--启动主屏幕”当你解锁手机时,它不会进入主屏幕,而是会显示上次使用的应用程序(resume)。在c/c++上,即在本机层,我是否可以得到回调。我想指出的是,这些事件的
广播接收器
只能动态注册(通过在
活动中调用
registerReceiver
)从Android O(API 26)开始。在
AndroidManifest.xml
中注册这些事件不再有效,因此应用程序不再能够接收这些事件(至少
操作屏幕打开
操作屏幕关闭
)当应用程序未运行时(之前已被Android杀死或被用户强制关闭)。请帮助我您不想检查
是否(!keyguardManager.isKeyguardLocked())
!isDeviceSecurity()
在SDK 23+设备上?这有点错误,因为它说您想检查
isDeviceLocked
以验证实际状态,而不仅仅是在设置中是否启用了安全锁。您还可以检查KeyguardManager的
inKeyguardRestrictedInputMode
以查看API<22。我尝试过这个,但Chromebook上不起作用,是吗Chromebook的任何其他解决方法。我大约六年前发布了此内容。我正在使用此cod及其工作性能,请检查您是否应用了任何图案/pin锁或使用任何第三方屏幕锁应用程序。它可能会干扰。请帮助我()