【问题标题】:Checking for Power Saver Mode programmatically以编程方式检查省电模式
【发布时间】:2014-09-23 19:05:46
【问题描述】:

我已经编写了一个应用程序 (AutoWifiSwitch),并且我计划添加的功能之一是如果启用了省电模式,则自动禁用我的应用程序中的 wifi 扫描服务。

我知道 Android L 应该实现了省电功能(以前 HTC 和三星会将这些功能自己添加到软件中)。现在大概这意味着谷歌将为其添加某种 API。理想情况下,会添加一个新动作,以便我可以听。

我还想知道 HTC/Samsung API 是否可以实现上述操作,如果可以,我该如何使用它们。

我一直在到处寻找上述问题,但绝对没有运气,应用程序 SecureSettings(Tasker 的插件)能够连接到 HTC/Samsung API 以启用节电程序,我不太懂确定他们是如何做到的。

编辑:节电值可以从Android L中的PowerManager获取,但不确定是否有Action。

【问题讨论】:

    标签: java android api sdk


    【解决方案1】:

    “省电模式”不是官方 AOSP 功能,无法通过官方 SDK 检测到。它是制造商特定的。 check this link

    【讨论】:

    • 它包含在 Android L 中,但我的主要问题是如何使用 HTC 和三星 API 获取是否启用了省电功能?
    【解决方案2】:

    我最终想出了如何用 HTC 和三星设备做到这一点。两者都将其电源管理器设置存储在 Settings.System 中。

    HTC (Sense) 使用密钥 user_powersaver_enable。 三星(Touchwiz)使用密钥psm_switch

    两者都将布尔值存储为字符串,“0”为假,“1”为真。然后,您可以像这样使用 ContentObserver 监听更改(需要 API 级别 16 或更高):

    getContentResolver().registerContentObserver(Settings.System.CONTENT_URI, true, new ContentObserver(){
      @Override
      public void onChange(boolean selfChange, Uri uri){
        super.onChange(selfChange, uri);
        String key = uri.getPath();
        key = key.substring(key.lastIndexOf("/") + 1, key.length());
    
        if (key.equals("user_powersaver_enable") || key.equals("psm_switch")){
          boolean batterySaverEnabled = Settings.System.getString(getContentResolver(), key).equals("1");
          // do something
        }
      }
    });
    

    但这仅适用于 Android L 发布之前,当 L 发布时,HTC 和三星可能会转移到 AOSP 省电模式,这意味着您将能够在 L 中使用新的省电模式 api。

    【讨论】:

      【解决方案3】:

      此答案仅适用于三星节电模式,因为三星仍然像往常一样选择与标准 API 混淆。

      iKeirNez 发布了一个很好的答案,证实了我的怀疑。这仍然发生在您可以购买的具有 5.1.1 的低端设备上。我有一个列表,其中列出了我知道在省电模式下会遭受相机崩溃的设备,但我尚未检查与省电模式相关的所有可能键。

      到目前为止,我知道这些:

      content://settings/system/powersaving_switch

      content://settings/system/psm_switch

      您可以注册一个 ContentResolver 并监听更改您可以在必要时检查它:

      final String result = Settings.System.getString(getContentResolver(), "psm_switch");
      Log.v("Debug", "Powersaving active: " + TextUtils.equals(result, "1"));
      

      【讨论】:

        【解决方案4】:
        PowerManager powerManager = (PowerManager)getSystemService(Context.POWER_SERVICE);
        boolean powerSaveMode = powerManager.isPowerSaveMode();
        

        文档:developer.android.com/.../PowerManager#isPowerSaveMode()

        API level 21 (Android 5.0) 中添加

        【讨论】:

          【解决方案5】:

          它在我的三星 S8、Android 9 上对我不起作用,而是我使用:

          • 设置:$adb shell settings put global low_power 1
          • 获取:$adb shell settings get global low_power

          ...它成功了!

          把它翻译成 java 是这样的:

          final String result = Settings.Global.getString(getContentResolver(),"low_power");
          

          【讨论】:

          • 这在三星设备上运行良好,当我使用 ACTION_POWER_SAVE_MODE_CHANGED 注册 BC 时,它会在此值更新时触发。但不会发生更改亮度等其他一些操作。
          猜你喜欢
          • 2013-09-07
          • 1970-01-01
          • 2019-01-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-03-10
          • 1970-01-01
          相关资源
          最近更新 更多