以编程方式将锁屏设置为“无”?

18

我需要禁用锁屏并将锁屏类型设置为“无”。我的设备已经root(可以获得SU权限)+可以作为系统应用程序在系统权限下运行(位于/system/app下)。

我已经尝试了一些方法,但都没有成功。

尝试1:

这似乎已被废弃且不起作用。

KeyguardManager manager = (KeyguardManager) this.getSystemService(KEYGUARD_SERVICE);
KeyguardLock lock = manager.newKeyguardLock("abc");
lock.disableKeyguard(); 

尝试2

这个也没有起作用。

  1. 将系统分区挂载为可写
  2. 编辑/data/data/com.android.providers.settings/databases/settings.db
  3. 执行以下SQL语句。

    INSERT OR REPLACE INTO system (name, value) VALUES ('lockscreen.disabled', '1');
    INSERT OR REPLACE INTO secure (name, value) VALUES ('lockscreen.disabled', '1');

尝试3

重新启动了机器,但仍然没有运气。

android.provider.Settings.Secure.putLong(mContentResolver, Settings.Secure.LOCK_PATTERN_ENABLED, false);`
android.provider.Settings.Secure.putLong(mContentResolver, "lockscreen.password_type", DevicePolicyManager.PASSWORD_QUALITY_SOMETHING);`
android.provider.Settings.Secure.putLong(mContentResolver, "lockscreen.password_type_alternate", DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED);
android.provider.Settings.Secure.putLong(mContentResolver, "lockscreen.disabled", true);

还有其他什么我可以尝试的吗?

请注意,我不想在应用程序运行时禁用键盘锁。


哪个安卓版本? - exilit
我正在运行Android 4.1。 - Ranhiru Jude Cooray
希望这可以帮到你:https://dev59.com/HWkw5IYBdhLWcg3wrshS - Sanjeev
我想了解你的进展情况。到目前为止有什么解决方案吗? - exilit
嗨,你找到任何解决方案了吗? - Caner
@RanhiruCooray 有什么进展了吗? - Muhammed Refaat
9个回答

15

你可以尝试这个:

adb shell sqlite3 /data/system/locksettings.db "UPDATE locksettings SET value = '1' WHERE name = 'lockscreen.disabled'"

adb shell sqlite3 /data/system/locksettings.db "UPDATE locksettings SET value = '0' WHERE name = 'lockscreen.password_type'"

adb shell sqlite3 /data/system/locksettings.db "UPDATE locksettings SET value = '0' WHERE name = 'lockscreen.password_type_alternate'"

它在我root过的Nexus 4上运行良好。


运行第一个命令,然后重新启动手机对我有用。 - Caner
相关源代码:https://github.com/android/platform_frameworks_base/blob/3f453164ec884d26a556477027b430cb22a9b7e3/services/core/java/com/android/server/LockSettingsStorage.java - Zifei Tong
2
对于/data/data/com.android.providers.settings/databases/settings.db,最好使用adb shell settings put secure lockscreen.disabled 1来修改数据库。是否有类似的实用程序可以修改locksettings.db而不是直接使用sqlite调用? - farmir
@farmir 可以使用 adb pull 命令获取这些文件,详见此处 - musically_ut
1
这可以通过locksettings命令更轻松地完成:adb shell locksettings set-disabled true - Ber

4

在android 源代码 中搜索了一下,我现在停留在一个名为ChooseLockGeneric的类的onPreferenceTreeClick函数中,当选择解锁方法(在设置中)时似乎会调用该函数。

在那个函数中,会调用updateUnlockMethodAndFinish函数来设置解锁方法。因此,也许调用updateUnlockMethodAndFinish(DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED,true);可能正是你想要的。

我不知道这是否符合你的需求,也不知道这是否可行(可能存在可见性问题或安全机制)。我只是在猜测。

编辑: 这也可能有所帮助:{{link1:startFragment(this,"com.android.settings.ChooseLockGeneric$ChooseLockGenericFragment",SET_OR_CHANGE_LOCK_METHOD_REQUEST, null);}}


3
使用 adb shell locksettings clear --old xxxx 命令可以立即删除锁屏锁定(即使手机处于锁定状态)。 xxxx 是图像下方的图案编号。 示例:locksettings clear --old 1236 要再次设置图案,请使用:locksettings set-pattern 1236 enter image description here 用法:
   locksettings set-pattern [--old OLD_CREDENTIAL] NEW_PATTERN
   locksettings set-pin [--old OLD_CREDENTIAL] NEW_PIN
   locksettings set-password [--old OLD_CREDENTIAL] NEW_PASSWORD
   locksettings clear [--old OLD_CREDENTIAL]
   locksettings verify [--old OLD_CREDENTIAL]
   locksettings set-disabled DISABLED
   locksettings get-disabled

3

我知道这个回答有点晚了,但你可以尝试使用命令行“locksettings set-disabled true”。
这对我来说完美地工作。


2
我尝试按照 @ByteHamster 的建议修改 /data/system/locksettings.db,但没有成功。
adb shell sqlite3 /data/system/locksettings.db "UPDATE locksettings SET value = '1' WHERE name = 'lockscreen.disabled'"

我随后将locksettings.db重命名为locksettings.db.old并重新启动。锁屏界面消失了,Android自行重建了locksettings.db文件。

我在三星Galaxy S4上使用TWRP恢复模式


3
将以下文本翻译成中文:adb shell settings put secure lockscreen.disabled 1将锁屏禁用状态设置为启用。 - Benny
这需要一个已经root的设备或者其他什么吗? - Joshua Pinter

2
你需要在 AndroidManifest 中声明此 uses-permission:
<uses-permission android:name="android.permission.WAKE_LOCK" />

在你的代码中:

PowerManager powerManager = (PowerManager)context.getSystemService(Context.POWER_SERVICE);
WakeLock wakeLock = powerManager.newWakeLock(PowerManager.FULL_WAKE_LOCK, "My Lock");
wakeLock.acquire();

当您的应用程序被销毁或暂停时,请使用以下方法释放此锁定:
wakeLock.release();

我建议在你的活动的onResume()中调用acquire,并在onPause()中调用release


谢谢,但这仅适用于应用程序运行时。这不会禁用设备的锁屏。 - Ranhiru Jude Cooray

1

我想探索 exilit的答案。从源代码中,我们最终得到了这个:

mChooseLockSettingsHelper.utils().clearLock(false);
mChooseLockSettingsHelper.utils().setLockScreenDisabled(disabled);

utils是com.android.internal.widget.LockPatternUtils对象,我们可以通过反射机制获取它。 以下是代码:

    try{
            Class lockPatternUtilsCls = Class.forName("com.android.internal.widget.LockPatternUtils");
            Constructor lockPatternUtilsConstructor = 
                lockPatternUtilsCls.getConstructor(new Class[]{Context.class});
            Object lockPatternUtils = lockPatternUtilsConstructor.newInstance(MyActivity.this);

            Method clearLockMethod = lockPatternUtils.getClass().getMethod("clearLock", boolean.class);
            Method setLockScreenDisabledMethod = lockPatternUtils.getClass().getMethod("setLockScreenDisabled", boolean.class);

            clearLockMethod.invoke(lockPatternUtils, false);
            setLockScreenDisabledMethod.invoke(lockPatternUtils, true);                 
            Log.d(TAG, "set lock screen to NONE SUC");
    }catch(Exception e){
            Log.e(TAG, "set lock screen to NONE failed", e);
    }

我测试的应用程序已经使用平台密钥签名,并且是系统应用程序。我认为这将是必须的。

更新: 注意到在Android 6上方法的参数已经发生了变化。


1
我已经在 root 平板电脑上实现了以下操作:
adb push sqlite3 /sdcard/sqlite3
adb shell
su
mount -o remount,rw /system
cp /sdcard/sqlite3 /system/xbin/sqlite3
chmod 755 /system/xbin/sqlite3
mount -o remount,ro /system
adb shell sqlite3 /data/system/locksettings.db
UPDATE locksettings SET value = '1' WHERE name = 'lockscreen.disabled'
您可以从http://www.digitechhub.com/sqlite3下载文件。

0
在已经root的Nexus 5上, 通过TWRP恢复模式下的终端, 只需输入以下命令: rm /data/system/locksettings.db 然后重启即可。

1
你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心中找到有关如何编写良好答案的更多信息。 - Community

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接