`

如何控制Android不锁屏

阅读更多

锁定屏幕对于移动终端来说是非常有必要的,但是对于机顶盒产品就没有这个必要了。所以本文介绍一下怎样让Android设备永不锁屏。

Android系统的锁屏时间存放在Setting数据库中,字段为Settings.System.SCREEN_OFF_TIMEOUT。查看SettingsProvider源码,查看如下文件的源码:

frameworks/base/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java

查看loadSystemSettings()函数的代码如下:

private void loadSystemSettings(SQLiteDatabase db) {
        SQLiteStatement stmt = db.compileStatement("INSERT OR IGNORE INTO system(name,value)"
                + " VALUES(?,?);");

        Resources r = mContext.getResources();

        loadBooleanSetting(stmt, Settings.System.DIM_SCREEN,
                R.bool.def_dim_screen);
        loadSetting(stmt, Settings.System.STAY_ON_WHILE_PLUGGED_IN,
                "1".equals(SystemProperties.get("ro.kernel.qemu")) ? 1 : 0);
        loadIntegerSetting(stmt, Settings.System.SCREEN_OFF_TIMEOUT,
                R.integer.def_screen_off_timeout);

        // Set default cdma emergency tone
        loadSetting(stmt, Settings.System.EMERGENCY_TONE, 0);

        // Set default cdma call auto retry
        loadSetting(stmt, Settings.System.CALL_AUTO_RETRY, 0);

        // Set default cdma DTMF type
        loadSetting(stmt, Settings.System.DTMF_TONE_TYPE_WHEN_DIALING, 0);

        // Set default hearing aid
        loadSetting(stmt, Settings.System.HEARING_AID, 0);

        // Set default tty mode
        loadSetting(stmt, Settings.System.TTY_MODE, 0);

        loadBooleanSetting(stmt, Settings.System.AIRPLANE_MODE_ON,
                R.bool.def_airplane_mode_on);

        loadStringSetting(stmt, Settings.System.AIRPLANE_MODE_RADIOS,
                R.string.def_airplane_mode_radios);

        loadStringSetting(stmt, Settings.System.AIRPLANE_MODE_TOGGLEABLE_RADIOS,
                R.string.airplane_mode_toggleable_radios);

        loadBooleanSetting(stmt, Settings.System.AUTO_TIME,
                R.bool.def_auto_time); // Sync time to NITZ

        loadIntegerSetting(stmt, Settings.System.SCREEN_BRIGHTNESS,
                R.integer.def_screen_brightness);

        loadBooleanSetting(stmt, Settings.System.SCREEN_BRIGHTNESS_MODE,
                R.bool.def_screen_brightness_automatic_mode);

        loadDefaultAnimationSettings(stmt);

        loadBooleanSetting(stmt, Settings.System.ACCELEROMETER_ROTATION,
                R.bool.def_accelerometer_rotation);

        loadDefaultHapticSettings(stmt);

        stmt.close();
    }

从代码中我们可以看出,假如Settings.System.SCREEN_OFF_TIMEOUT没有初始化的话(系统首次启动,这个字段肯定是没有初始化的),将会利用资源中的R.integer.def_screen_off_timeout来初始化。我们为了让系统永不锁屏,只需要把资源 R.integer.def_screen_off_timeout设为-1即可。查看文件

frameworks/base/packages/SettingsProvider/res/values/defaults.xml

可以找到R.integer.def_screen_off_timeout的定义。

<integer name="def_screen_off_timeout">60000</integer>

发现默认值为60000ms,也就是60s。我们只需要把这个参数改为-1。然后重新编译SettingsProvider模块,就OK了。

另外为了防止用户进入系统后,修改锁屏时间,在Setting模块中删除对锁屏时间的设置。这样Android设备就永不锁屏了。

后来发现我的Android设备烧录好之后第一次启动永远不会锁屏,但是设备重启之后开机就进入锁屏状态,解锁之后就再也不会锁屏了(因为永远不超时)。看来“革命尚未成功,同志仍需努力”啊。

那么为什么启动之后没有进入锁屏状态呢?是不会系统有把超时锁屏的值给修改了呢?我通过sqlite3去查看settings.db的内容,发现超时锁屏的值仍然是-1。说明启动之后,系统并没有去数据库中查看屏幕超时锁屏的值,就直接锁屏了。

但是怎样才能开机之后不进入锁屏状态呢?这个是个非常费思量的问题。经过go,我知道锁屏的代码在LockScreen.java中,然后顺藤摸瓜,终于找到了可以设置锁屏功能开关的位置。代码位于:

frameworks/policies/base/phone/com/android/internal/policy/impl/KeyguardViewMediator.java

该文件中有一个变量定义如下:

    /**
     * External apps (like the phone app) can tell us to disable the keygaurd.
     */
    private boolean mExternallyEnabled = true;

mExternallyEnabled是用来管理是否开启屏幕锁的关键。默认值是打开屏锁,根据注释可以知道他是希望应用程序来修改这个值。但是经过加打印信息发现开机的时候没有任何应用程序会修改它。修改这个值调用如下函数:

   /**
     * Same semantics as {@link WindowManagerPolicy#enableKeyguard}; provide
     * a way for external stuff to override normal keyguard behavior.  For instance
     * the phone app disables the keyguard when it receives incoming calls.
     */
    public void setKeyguardEnabled(boolean enabled) {
        synchronized (this) {
            if (DEBUG) Log.d(TAG, "setKeyguardEnabled(" + enabled + ")");

            mExternallyEnabled = enabled;

            if (!enabled && mShowing) {
                if (mExitSecureCallback != null) {
                    if (DEBUG) Log.d(TAG, "in process of verifyUnlock request, ignoring");
                    // we're in the process of handling a request to verify the user
                    // can get past the keyguard. ignore extraneous requests to disable / reenable
                    return;
                }

                // hiding keyguard that is showing, remember to reshow later
                if (DEBUG) Log.d(TAG, "remembering to reshow, hiding keyguard, "
                        + "disabling status bar expansion");
                mNeedToReshowWhenReenabled = true;
                hideLocked();
            } else if (enabled && mNeedToReshowWhenReenabled) {
                // reenabled after previously hidden, reshow
                if (DEBUG) Log.d(TAG, "previously hidden, reshowing, reenabling "
                        + "status bar expansion");
                mNeedToReshowWhenReenabled = false;

                if (mExitSecureCallback != null) {
                    if (DEBUG) Log.d(TAG, "onKeyguardExitResult(false), resetting");
                    mExitSecureCallback.onKeyguardExitResult(false);
                    mExitSecureCallback = null;
                    resetStateLocked();
                } else {
                    showLocked();

                    // block until we know the keygaurd is done drawing (and post a message
                    // to unblock us after a timeout so we don't risk blocking too long
                    // and causing an ANR).
                    mWaitingUntilKeyguardVisible = true;
                    mHandler.sendEmptyMessageDelayed(KEYGUARD_DONE_DRAWING, KEYGUARD_DONE_DRAWING_TIMEOUT_MS);
                    if (DEBUG) Log.d(TAG, "waiting until mWaitingUntilKeyguardVisible is false");
                    while (mWaitingUntilKeyguardVisible) {
                        try {
                            wait();
                        } catch (InterruptedException e) {
                            Thread.currentThread().interrupt();
                        }
                    }
                    if (DEBUG) Log.d(TAG, "done waiting for mWaitingUntilKeyguardVisible");
                }
            }
        }
    }

经过上面的讨论我们可以发现我们有两个解决方法:

1、定义变量的时候,给其初始化为false。

2、在launcher模块启动的时候,调用setKeyguardEnabled方法,关闭锁屏功能。

我懒得修改Laucher模块,我的解决方法就是在定义mExternallyEnabled时修改其初始值为false。各位朋友可以根据自己的实际情况选择解决方案。我的代码如下:

   /**
     * External apps (like the phone app) can tell us to disable the keygaurd.
     */
    private boolean mExternallyEnabled = false;

这样修改之后,Android设备开机之后,默认不会进入锁屏状态,除非你在应用程序中调用setKeyguardEnabled方法显示打开这个功能。因为设置的超时时间为-1,则永远也不会进入锁屏界面。完全满足了我的需求,终于大功告成了。开心啊~!!

分享到:
评论

相关推荐

    Android 10.0 锁屏讲解

    通过分析锁屏启动流程,开发者可以更好地理解如何在不同场景下控制锁屏的显示和行为,从而实现自定义的锁屏功能。此外,熟悉这一过程还能帮助解决与锁屏相关的问题,提高用户体验。 总的来说,Android 10.0的锁屏...

    Android修改源代码控制永不锁屏

    Android修改源代码控制永不锁屏

    android一键锁屏源码

    在Android平台上,开发一款一键锁屏应用可以帮助用户快速便捷地锁定屏幕,节省电量,保护隐私。本文将深入探讨“android一键锁屏源码”的相关知识点,包括其工作原理、实现方式以及可能遇到的问题。 首先,我们需要...

    Android 一键锁屏Demo

    在Android中,为了访问特定功能,如控制电源或执行设备操作,应用程序必须声明所需的权限。对于锁屏应用,你需要在`AndroidManifest.xml`文件中声明`android.permission.DEVICE_ADMIN_ADMIN`权限,因为只有设备管理...

    android 自定义锁屏凌驾于系统锁屏之上

    此外,可能还需要访问`KeyguardManager`和`PowerManager`等系统服务,以便获取和控制锁屏状态。 2. **创建锁屏Activity**: 创建一个新的Activity作为自定义锁屏界面,需要设置其主题为`Theme.DeviceDefault....

    android 一键锁屏 OneKeyLock 源码

    【Android 一键锁屏 OneKeyLock 源码解析】 在Android系统中,开发者可以通过编程方式实现各种定制化的功能,其中一键锁屏就是一个常见的需求。OneKeyLock项目就是这样一个实现,它提供了一种简单快捷的方式来锁定...

    Android锁屏状态下显示Activity

    下面将详细介绍如何在Android锁屏状态下显示Activity。 1. **电源管理与唤醒权限** 在Android中,为了实现锁屏状态下显示Activity,首先需要处理的是电源管理。应用需要获取到相应的唤醒权限,以确保在锁屏时能够...

    Android锁屏

    一、Android锁屏机制 Android锁屏的基本功能包括密码锁、图案锁、指纹锁等,它们都是通过Android的安全框架实现的。安全框架提供了多种接口供开发者使用,如KeyguardManager和KeyguardLock,来控制设备的锁屏状态和...

    android 一键锁屏例程

    2. 锁屏操作可能会受到系统的限制,比如在某些设备上,非系统应用可能无法直接控制屏幕的开关。因此,实际开发时需考虑兼容性和设备差异。 3. 对于权限敏感的操作,一定要遵循最佳实践,确保用户隐私不被侵犯。 ...

    android锁屏界面显示,仿播放器。

    首先,理解Android锁屏界面的工作原理至关重要。Android系统允许开发者通过服务(Service)和广播接收器(BroadcastReceiver)来监听和控制锁屏状态。在我们的案例中,我们需要创建一个媒体服务,负责播放音频或视频...

    安卓Android源码——Android自定义锁屏实现----仿正点闹钟.zip

    首先,Android锁屏界面通常是系统的核心部分,涉及到用户的安全和隐私。默认的锁屏方式包括滑动、PIN码、图案和密码等。自定义锁屏需要对Android的窗口管理器(Window Manager)服务有深入理解,特别是如何创建并...

    android锁屏源码

    本文将深入探讨"android锁屏源码"的相关知识点,以帮助开发者理解其工作原理并进行定制。 一、Android锁屏机制概述 Android锁屏分为多种类型,如图案解锁、PIN码解锁、密码解锁等。这些解锁方式的实现基于Android...

    Android 不休眠 不锁屏

    "Android 不休眠 不锁屏"是一个针对这类需求的实用Demo,它展示了如何编程实现让Android设备保持屏幕常亮且不解锁。 首先,我们要理解Android系统中的两个关键概念:`Keyguard`和`PowerManager`。`Keyguard`是...

    Android中如何禁止屏幕休眠和锁屏

    Android 中如何禁止屏幕休眠和锁屏 Android 中禁止屏幕休眠和锁屏是一种常见的需求,特别是在开发一些需要长时间运行的程序时,例如 NowTV 或 XXX 播放器等。这些程序需要长时间保持屏幕常亮,以便用户可以无间断地...

    Android源码下修改后使机器不锁屏

    在Android系统中,锁屏时间是由Setting数据库中的一个字段控制的,具体字段名为`Setting.System.SCREEN_OFF_TIMEOUT`。这个字段决定了屏幕在无操作后多久自动熄灭。当我们想要实现让Android设备永不锁屏,我们需要...

    Android自定义锁屏实现----仿正点闹钟滑屏解锁

    8. **唤醒与屏幕亮度控制**:为了确保锁屏界面在设备休眠状态下也能正常工作,你需要使用`WakeLock`来保持CPU运行。同时,可能需要调整屏幕亮度,确保在任何光照条件下都能清晰可见。 9. **权限管理**:在Android ...

    Android 锁屏页面避免被杀掉,解锁会自动关闭页面。防止后台运行时被关闭。

    在Android开发中,保持应用程序在锁屏状态下不被系统优化机制清理,并且在用户解锁后能够自动关闭特定页面,是一项常见的需求。这涉及到Android系统的进程管理、权限控制以及活动生命周期管理等多个方面。以下是对这...

    android开机启动锁屏分析

    此外,它还通过提供一系列API来支持锁屏状态的改变,这些API包括但不限于: - `pokeWakelock()`:用于唤醒锁屏。 - `keyguardDone(boolean)`:处理解锁操作。 - `onSimStateChanged()`:响应SIM卡状态变化。 - `...

    Android代码-一键锁屏

    3. **PowerManager**: `PowerManager`类是Android提供的接口,可以用来控制设备的电源状态。通过它的`goToSleep()`方法,可以模拟电源键的操作,使设备进入休眠状态,达到锁屏效果。 4. **Service**: 在某些情况下...

Global site tag (gtag.js) - Google Analytics