如何在USB调试期间保持屏幕解锁?

时间:2012-01-12 19:17:23

标签: android

Android OS2.2曾经在“设置/应用程序/开发”下有一个选项,可以在USB调试期间禁用屏幕锁定。将Samsung Galaxy S升级到OS2.3.3后,此选项消失了,在调试时保持解锁手机非常令人沮丧。

此选项是否已移动或是否有其他方法可以执行此操作? (我讨厌无缘无故地删除有用的选项!)

提前致谢...

19 个答案:

答案 0 :(得分:38)

有多种选择,其中很多都有可怕的(主观)副作用。我列出了我发现的内容以及我能想到的副作用。

我很懒,可能和其他许多人一样,我不想留意不必要的东西。这意味着"哦,我只是在我工作时打开它,然后在完成时关闭它"选项不可行。您 会忘记它, 会遇到最终下面列出的任何副作用。

TL; DR

拥有FLAG_KEEP_SCREEN_ON后卫FTW的{p> Debug.isDebuggerConnected()充电时保持清醒,如果您只是想调试,屏幕超时唤醒锁定是不可行的选项。
从API 1和wifi调试开始,这个解决方案也有优势!

设置>开发人员选项>充电时保持清醒

烧伤:任何人都应该有一个巨大的红旗。它说"充电时#34;不是"在调试时#34;。这意味着即使您的手机已插入主电源,它也会继续运行。如果你有一个烧焦的AMOLED屏幕(例如Galaxy S系列),这尤其糟糕。我有几个星期的选项,现在我有一个永久的肖像状态栏......

通知:即使您使用低亮度并且每次放下手机时都不要忘记关闭屏幕,如果只收到一个简单的通知,某些应用会唤醒您的屏幕这导致在插入时大部分时间保持它。

安全性:如果您只是在充电时让屏幕保持开启状态,并且您需要快速处理工作中的某些事情,那么第一件事就不会是#34;啊,让我先锁定手机"如果你不小心把它弄脏了,你可能会暴露你的脏话。 请注意,如果您在一个无法信任您的同事的环境中工作,我会重新考虑这种就业。

设置>显示>屏幕超时

如果你有很多应用程序可以提供通知,那么这是非常危险的。特别是如果你有一些垃圾邮件发送者(Facebook,Family Guy甚至GMail,如果你收到很多邮件)。

烧伤:此风险也很高。现在你甚至不会把它限制在线路上#34;因此,只要您忘记将其关闭或获得通知,它就会保持不变。

电池耗尽:如果您拿到一个,屏幕将在指定的时间内打开,耗尽电池电量。它将会启动,因为有时你会忘记关闭它,或者只是收到通知。

Hotpocket :如果您在手机放入口袋时收到通知,屏幕和密闭空间的照明会加热您的口袋,甚至可能会被烫伤。

袖珍拨号:如果您的屏幕在手机放入口袋时开启,则口袋拨盘的风险会随着每秒钟的增加而增加。现在这种情况不太可能,因为手机应用程序通常隐藏得很好,但我的口袋喜欢经常更改日期或阅读我的电子邮件。

安全性:想象一下,如果你在一个公共场所而且你的手机放在桌面上,如果你转过身足够长的时间与某人交谈,你的朋友很可能会滥用你未锁定的屏幕或者快点休息一下。特别是如果他们醉酒了。显然更短的超时会降低这种风险。

使用唤醒锁定

权限:您需要为您的应用添加可能不必要的android.permission.WAKE_LOCK权限(幸运的是,由于Gradle中的Manifest Merger,因此只需添加调试版本即可轻松添加插件)。

编码:您还需要自己管理释放锁定,并且可能需要为此创建一个服务。 我想在此处注意,我还没有在Android中使用此功能。

无用:它也无助于保持屏幕开启,因为它只会使CPU保持清醒状态。请参阅documentation

连接调试器时

FLAG_KEEP_SCREEN_ON

如果您阅读了此documentation,则会发现您的问题非常接近。

编码:我唯一能想到的就是你需要修改一些代码,但它非常简单(假设你有BaseActivity所有你的代码其他活动延伸):

@Override protected void onResume() {
    super.onResume();
    if (BuildConfig.DEBUG) { // don't even consider it otherwise
        if (Debug.isDebuggerConnected()) {
            Log.d("SCREEN", "Keeping screen on for debugging, detach debugger and force an onResume to turn it off.");
            getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
        } else {
            getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
            Log.d("SCREEN", "Keeping screen on for debugging is now deactivated.");
        }
    }
}

要使用它你需要做的只是附加一个调试器,然后离开应用程序(主页/任务按钮或关闭屏幕),然后返回它以触发onResume

根据您通常调试的内容,可能需要将上述内容放入onCreate以便它更早注册,并希望在调试onResume之前的活动生命周期时保持屏幕清醒。

一般情况下,我建议您在尝试使用代码时使用Run而不是Debug,并在发现内容时仅附加调试器:这会使您的应用更快十倍,此选项最佳有。。

答案 1 :(得分:22)

在adb shell中尝试这个,虽然它似乎不适用于某些设备:

svc power stayon usb

答案 2 :(得分:16)

我有Android版本2.3.6并且在settings下 - > applications - > development可以选择在插入充电时保持清醒状态(即屏幕永不休眠)。

答案 3 :(得分:9)

Jorge Cevallos是对的。

对于Android 4及更高版本:

  1. 转到设置>关于手机
  2. 触摸几次(约10次)" Build number"。
  3. 然后返回Sttings菜单,您将找到"开发者选项"
  4. 在"开发者选项"下,您将看到"保持清醒选项"。
  5. 玩得开心。

答案 4 :(得分:4)

我为此目的创建了app。你可以在google play" Keep Awake for Debugging" 。启用ADB调试后,它将保持手机解锁/屏幕显示 。它不仅限于USB,也适用于Wi-Fi。

答案 5 :(得分:4)

在控制台上

 while true; do adb shell input keyevent mouse ; sleep 1 ; done

答案 6 :(得分:2)

我遇到了同样的问题。我发现这个应用程序可以在手机连接时保持屏幕解锁状态。

https://play.google.com/store/apps/details?id=com.gmail.developer.runks.enji

答案 7 :(得分:1)

具有解锁和屏幕唤醒功能的完全自动化的解决方案

我通过组合两个答案然后将它们自动化来解决了这个问题。 因此,基本上,当您在物理设备上运行该应用程序时,它可能会被锁定,并且在您积极开发时可能会一直进入睡眠模式。

解决方案是编写一个脚本,该脚本在锁定时将设备解锁,然后将电源模式设置为在USB电源保持唤醒状态

unlock_keep_device_awake.sh

#!/bin/bash
#Check if device locked
if adb shell dumpsys window | grep  "mDreamingLockscreen=true"; then 
    echo "Locked"
    adb shell input keyevent KEYCODE_WAKEUP # activate 
    adb shell input touchscreen swipe 530 1420 530 1120 # swipe up
    adb shell input text 1234 # <Change to the device password> input password 
    #adb shell input keyevent 66 # press enter, if you keyguard requires it
else 
    echo "UnLocked"  
fi

# 2 = Stay awake on USB, 0 = reset
adb shell settings put global stay_on_while_plugged_in 2

要使其自动化,请将其添加到应用运行配置中以在启动前运行

步骤1: 运行->编辑配置

第2步:通过单击'+'-> Shell脚本

创建Shell脚本配置

enter image description here

第3步:在运行应用程序之前添加配置运行

enter image description here

就是这样,开发时不再需要解锁设备或将其唤醒。

一件小事,我主要通过交流电源为手机充电,因此我可能不需要重置stay_awake设置。但是,如果您不希望在通过USB电源充电时设备屏幕醒来,请在完成一天的开发后运行以下命令。

adb shell settings put global stay_on_while_plugged_in 0

答案 8 :(得分:1)

用解锁码替换12345。然后这个shell脚本解锁你的手机:

adb shell input keyevent KEYCODE_WAKEUP # activate 
adb shell input touchscreen swipe 530 1420 530 1120 # swipe up
adb shell input text 12345 # input password
adb shell input keyevent 66 # press enter

您不应该禁用手机上的安全功能(如上所述)。确保没人能读取该脚本文件。

答案 9 :(得分:1)

简单。 只需将以下代码添加到您的活动中,您的屏幕将仅在您调试时打开:

@Override
protected void onResume()
{
    Log.d( tag, "onResume()" );
    try
    {
        super.onResume();
        if( BuildConfig.DEBUG && Debug.isDebuggerConnected() )
        {
            Log.d("SCREEN", "Keeping screen on for debugging, detach debugger and force an onResume to turn it off.");
            getWindow().addFlags( WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED |
                                  WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD |
                                  WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON |
                                  WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON |
                                  WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON );
        }
        else
        {
            getWindow().clearFlags( WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED |
                                    WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD |
                                    WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON |
                                    WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON |
                                    WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON );
            Log.d( "SCREEN", "Keeping screen on for debugging is now deactivated.");
        }

    }
    catch( Throwable t )
    {
        Log.e( tag, "onResume() - Exception: " + t.getMessage(), t );
    }
}

答案 10 :(得分:0)

我为 macOS

创建了简单的shell脚本

文件名:cell-screen.sh

#!/bin/sh

echo '`cell-screen on` to keep the screen on during usb debugging'
echo '`cell-screen off` to reset'

echo ''
echo 'your parameter - ' $1

if [[ "$1" = "on" ]]; then
    ~/Library/Android/sdk/platform-tools/adb shell settings put global stay_on_while_plugged_in 2
elif [[ "$1" = "off" ]]; then
    ~/Library/Android/sdk/platform-tools/adb shell settings put global stay_on_while_plugged_in 0
else
    echo '\n[****]Bad Input.'
fi

echo '\nEnd'

步骤:

  1. 我将脚本保存到默认使用位置-/Users/[your username]
  2. 授予对文件的可执行访问权限-chmod +x ~/cell-screen.sh
  3. 每当我开始开发任务时,我只需在终端-~/cell-screen.sh on
  4. 中执行shell脚本
  5. 完成开发工作后,我只需执行-~/cell-screen.sh off

对于Windows用户:

更改adb位置的外壳脚本-%LOCALAPPDATA%\Android\sdk\platform-tools\adb

答案 11 :(得分:0)

改善最佳答案:

如果您现在不进行调试,那么

Debug.isDebuggerConnected()还不够,但是当设备通过ADB连接到Android Studio时,仍然可以与应用一起使用。然后,我们必须添加“启用ADB”检查。

Settings.Global.getInt(contentResolver,Settings.Global.ADB_EN​​ABLED,0)== 1其中1是启用ADB的时间

@Override protected void onResume() {
    super.onResume();
    if (BuildConfig.DEBUG) { // don't even consider it otherwise
        if (Debug.isDebuggerConnected() ||
            Settings.Global.getInt(getContentResolver(), Settings.Global.ADB_ENABLED, 0) == 1) {
            Log.d("SCREEN", "Keeping screen on for debugging, detach debugger and force an onResume to turn it off.");
            getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
        } else {
            getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
            Log.d("SCREEN", "Keeping screen on for debugging is now deactivated.");
        }
    }
}

答案 12 :(得分:0)

告诉PowerManager保持屏幕打开(它仍将变暗):

adb shell settings put global stay_on_while_plugged_in 3

3是以下两种类型或:

BatteryManager#BATTERY_PLUGGED_ACBatteryManager#BATTERY_PLUGGED_USB

使用adb shell dumpsys power | grep mStayOnWhilePluggedInSetting查看当前值。

要恢复正常行为,请将该值设置为零,如下所示:

adb shell settings put global stay_on_while_plugged_in 0

经过验证,可以在Android 4.4到9.0上运行。

答案 13 :(得分:0)

# find out if screen is on works on android 5.0+
screenOn=`adb shell dumpsys power | grep "Display Power" | grep ON`
if [ -z "$screenOn" ]; then
    echo "turning screen on"
    adb shell input keyevent KEYCODE_POWER
    # unlock by emulating slide up
    adb shell input touchscreen swipe 930 880 930 380
fi

答案 14 :(得分:-1)

我有两台装有Android 2.3.3的设备,他们在设置/应用程序/开发中都有这个选项,它叫做Stay Awake(屏幕在充电时永远不会睡觉)。其中一个是三星Galaxy S.

此外,我有一台安装了Android 2.2(HTC Desire)的设备,它在同一位置也具有相同的功能。

你不这样做很奇怪,你使用自定义ROM吗?

答案 15 :(得分:-1)

我想到了两个选择:

  1. 编写一个会强制屏幕超时的应用程序。使用SCREEN_OFF_TIMEOUTSTAY_ON_WHILE_PLUGGED_IN

  2. 如果您的手机已植根并且您在与正在开发的计算机相同的网络中连接到wifi,您可以享受这个带有屏幕超时选项的精彩应用程序:{{3} }。

答案 16 :(得分:-1)

您可以将屏幕超时设置为30分钟或将其关闭。 此选项位于:设置/显示/屏幕超时

希望它有所帮助。

答案 17 :(得分:-2)

您可以重新启用开发人员选项,现在隐藏了哪些配置:

1 - 转到设置&gt;关于&gt; <软件信息>更多...

2 - 然后触摸构建号码7次,这将使您倒计时,然后说“您现在是开发人员”。

开发者选项又回来了!

答案 18 :(得分:-4)

在你的Manifest中使用它:

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

并且您的屏幕不会关闭!