【问题标题】:Android: remove or disable programmatically the Lock Screen on Samsung Galaxy S2 deviceAndroid:以编程方式删除或禁用三星 Galaxy S2 设备上的锁定屏幕
【发布时间】:2013-09-19 08:49:47
【问题描述】:

问题我的 Android 自动化测试不可靠,因为测试的 Activity 有时会运行,有时会暂停。

原因如果我的安卓设备(三星 Galaxy S2)开启了锁屏,所有活动都会立即进入暂停模式。

如何在测试运行时以编程方式禁用锁定屏幕?

这是我尝试过的,但根本没有产生任何结果(即,锁定屏幕仍处于活动状态并暂停我的活动)。

  • 添加android.permission.DISABLE_KEYGUARD 权限并使用KeyguardLock.disableKeyguard(),如android doc 中所述。

  • 设置窗口标志:FLAG_SHOW_WHEN_LOCKED、FLAG_TURN_SCREEN_ON、FLAG_DISMISS_KEYGUARD。

  • WakeLock.acquire()PowerManager.FULL_WAKE_LOCKPowerManager.ACQUIRE_CAUSES_WAKEUPPowerManager.ON_AFTER_RELEASEPowerManager.SCREEN_BRIGHT_WAKE_LOCK 参数一起使用。

  • adb shell input keyevent 82

【问题讨论】:

标签: android android-activity


【解决方案1】:

您可以使用以下代码禁用锁屏。将此代码包含在您的活动的 oncreate 中。

PowerManager pm = (PowerManager) getSystemService(POWER_SERVICE);
        wl = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK
                | PowerManager.ACQUIRE_CAUSES_WAKEUP
                | PowerManager.ON_AFTER_RELEASE, "INFO");
        wl.acquire();

KeyguardManager km = (KeyguardManager) getSystemService(KEYGUARD_SERVICE);
        kl = km.newKeyguardLock("name");
        kl.disableKeyguard();

在清单中包含权限:

<uses-permission android:name="android.permission.WAKE_LOCK" />
 <uses-permission android:name="android.permission.DISABLE_KEYGUARD" />

【讨论】:

  • 您所描述的对应于我尝试的第三个和第一个解决方案(分别)。它们对我的三星 Galaxy S2 的锁定屏幕完全没有影响。
【解决方案2】:
android:keepScreenOn='true'

像这样在rootView中使用这个属性

<LinearLayout 
xmlns:android=`http://schemas.android.com/apk/res/android`
    xmlns:app=`http://schemas.android.com/apk/res-auto`
    android:layout_width=`match_parent`
    android:layout_height=`match_parent`
    android:keepScreenOn="true">

【讨论】:

  • 虽然这可以防止屏幕关闭,但这根本不能回答问题
【解决方案3】:

在 Kotlin 中,

API 级别 28 或以下,您只需在需要打开的 Activity 中添加以下方法:

override fun onAttachedToWindow() {
    super.onAttachedToWindow()
    toBeShownOnLockScreen()
}

private fun toBeShownOnLockScreen() {
    window.addFlags(
        WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD
                or WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
    )
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1) {
        setTurnScreenOn(true)
        setShowWhenLocked(true)
    } else {
        window.addFlags(
            WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
                    or WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
        )
    }
}

为了让它在Android Pie及以上版本上运行,除了上述步骤,我们还需要在AndroidManifest中设置:

<activity
    android:name=".view.activity.LockScreenActivity"
    android:showOnLockScreen="true"
    android:showWhenLocked="true"
    android:turnScreenOn="true" />

我已经从 Api 级别 21 到 29 测试了这段代码,并且像魅力一样工作!

更新:如果在 onAttachedToWindow() 内部调用 toBeShownOnLockScreen(),某些三星设备(在我的情况下是三星 Galaxy S7 edge)可能无法工作。因此,您只需在 Activity 的 onCreate() 内调用 toBeShownOnLockScreen()。就是这样。

【讨论】:

  • 我注意到在第一次锁定和解锁后 UI 开始出现奇怪的行为 - 例如,Messenger buble 消失了,而在第二次锁定后 UI 冻结。下面发生了一些事情但我看不到它 - 所以我单击按钮,发生了一些事情但我看不到结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-13
相关资源
最近更新 更多