以编程方式将锁屏设置为“无”?
Posted
技术标签:
【中文标题】以编程方式将锁屏设置为“无”?【英文标题】:Set lockscreen to "None" programmatically? 【发布时间】:2014-04-04 06:36:42 【问题描述】:我需要禁用锁定屏幕并将锁定屏幕类型设置为“无”。我的设备已root(可以在SU权限下运行)+可以作为具有系统权限的系统应用程序运行(在/system/app下)。
我尝试了一些方法无济于事。
试试 1
这似乎已被弃用且不起作用。
KeyguardManager manager = (KeyguardManager) this.getSystemService(KEYGUARD_SERVICE);
KeyguardLock lock = manager.newKeyguardLock("abc");
lock.disableKeyguard();
试试 2
这也没有用。
-
将系统分区挂载为可写
编辑
/data/data/com.android.providers.settings/databases/settings.db
执行以下 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);
还有什么我可以尝试的吗?
请注意,我不想仅在应用程序运行时禁用键盘保护。
【问题讨论】:
哪个安卓版本? 我在 Android 4.1 上运行 ***.com/questions/9724428/… - 希望对您有所帮助 我想听听你的进展。到目前为止有什么解决方案吗? 嗨,你找到解决办法了吗? 【参考方案1】:你可以试试这个:
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'"
它适用于我扎根的 Nexus 4。
【讨论】:
运行第一个命令然后重新启动手机对我有用。 相关源码:github.com/android/platform_frameworks_base/blob/… 对于/data/data/com.android.providers.settings/databases/settings.db
据说最好使用adb shell settings put secure lockscreen.disabled 1
修改数据库。有没有类似的工具来修改locksettings.db
而不是直接调用sqlite?
@farmir 可以adb pull
那些文件,详细here。
这可以通过locksettings
命令更轻松地完成:adb shell locksettings set-disabled true
【参考方案2】:
在 android source 中搜索了一下之后,我现在坚持使用 onPreferenceTreeClick
类的 onPreferenceTreeClick
函数,该函数似乎在选择解锁方法时调用(在首选项中)。
在该方法中调用updateUnlockMethodAndFinish
来设置解锁方法。所以也许调用updateUnlockMethodAndFinish(DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED,true);
可能正是你想要的。
我不知道这是否符合您的需求,也不知道这是否有效(可能存在任何可见性问题或安全机制)。我只是猜测。
编辑:
这也有帮助: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
用法:
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
【讨论】:
【参考方案4】:我尝试按照@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 recovery。
【讨论】:
adb shell settings put secure lockscreen.disabled 1
这需要root设备吗?【参考方案5】:
您必须在 AndroidManifest 上声明此使用权限:
<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强>。
【讨论】:
谢谢,但这仅适用于应用程序运行时。这不会禁用设备的锁定屏幕。【参考方案6】:我已经在root tablet中实现了,
以下是我的完整过程
adb push sqlite3 /sdcard/sqlite3
adb 外壳
苏
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下载文件
【讨论】:
【参考方案7】:我想探索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 上发生了变化。
【讨论】:
【参考方案8】:我知道这是一个迟到的答案,但您可以尝试命令行“locksettings set-disabled true”。 它非常适合我。
【讨论】:
【参考方案9】:在根节点 5 上, 在终端通过 twrp 恢复我只是 rm /data/system/locksettings.db 并重启
【讨论】:
您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center。以上是关于以编程方式将锁屏设置为“无”?的主要内容,如果未能解决你的问题,请参考以下文章