Android SDK功能未实现

时间:2013-08-08 20:37:13

标签: android

如果这有点模糊,我道歉,所以如果你建议我改写或关闭这个问题,请告诉我。

我正在运行Android设备,其中没有实现其中一个SDK功能。我试图通过记录的SDK调用来调暗屏幕。此调用在其他设备上按预期工作,但在此调用上没有任何操作,这表明该功能未在此手机上正确实现。更令人困惑的是,我可以通过直接操作从ADB写入/ sys / class / backlight / ...文件来调暗亮度(据我所知,尽可能接近我可以获得此系统的驱动程序) )。

调用的java代码如下(亮度是一些整数),这是Android 4.2.2的目标。

Settings.System.putInt(getContentResolver(), Settings.System.SCREEN_BRIGHTNESS_MODE, Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL);
Settings.System.putInt(getContentResolver(), Settings.System.SCREEN_BRIGHTNESS, brightness);

基本上,某处存在断开连接,我不确定最有可能出现这种情况。

由于这是一个Dalvik应用程序并且正在执行Dalvik字节代码,我的第一个想法是,“好吧,也许Dalvik没有使用适当的参考显示驱动程序进行编译”。这表明每个Android手机都有自己独特编译的Dalvik版本,这看起来很傻。我目前最好的猜测是Dalvik通过硬件抽象层,而HAL不知道亮度驱动程序句柄,而ADB文件直接控制亮度。这听起来像是这种问题的合理原因吗?有没有人有这种类型的bug的任何其他可能的原因?谢谢你的帮助。

1 个答案:

答案 0 :(得分:1)

某些手机,尤其是较旧或较慢的手机,已经剥离了一些设置ContentObserver功能,以便保留资源(如电池)。如果我记得正确,这是旧API中的默认行为。解决方法是通过非ui活动手动触发亮度新设置,如下所示:

public class act_brightnesshelper extends Activity {
  //----- Private Static Members -----
  private static final String   TAG = "act_brightnesshelper";
  //----- Private Static Members END -----



  //----- Private Members -----
  private int brightnessLevel;
  //----- Private Members END ----- 



  //----- Activity Overrides -----
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    Log.d(TAG, "onCreate");
    super.onCreate(savedInstanceState);

    brightnessLevel = this.getIntent().getExtras().getInt("brightnessLevel");
  }

  @Override
  public void onAttachedToWindow() {
    Log.d(TAG, "onAttachedToWindow brightnessLevel = " + brightnessLevel);
    super.onAttachedToWindow();

    WindowManager.LayoutParams lp = getWindow().getAttributes();

    try {
      lp.screenBrightness = brightnessLevel / 255f;
      getWindow().setAttributes(lp);
    } catch(Exception ex) {
      //Do Nothing...
    }

    //Finish the Activity after 500ms...
    Thread WaitThread = new Thread(){
        @Override  
      public void run() {
          try {Thread.sleep(500);} catch (InterruptedException e) {}
          finish();
        }     
    };
    WaitThread.start();   
  }
  //----- Activity Overrides END----- 
}

并在更改亮度设置后通过在意图额外传递所需的亮度级别来调用它,如下所示:

Settings.System.putInt(<cnt resolver>, Settings.System.SCREEN_BRIGHTNESS_MODE, Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL);
Settings.System.putInt(<cnt resolver>, Settings.System.SCREEN_BRIGHTNESS, <your level>);
Intent iBriHelper = new Intent(cx, act_brightnesshelper.class).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
iBriHelper.putExtra("brightnessLevel", <your level>);
context.startActivity(iBriHelper);

为了正确,您必须在清单中声明活动,如下所示:

<activity android:name=".act_brightnesshelper"
        android:theme="@style/Theme.Transparent"
        android:configChanges="orientation"
        android:noHistory="true"
    android:excludeFromRecents="true">
</activity>

如果要更改活动内部的亮度,则可以直接在其中执行此操作。我提供的代码用于在活动的上下文之外更改亮度,即app-widget。

基于OP评论编辑

让我们看一下来自android源代码here的BrightnessController.java,你可以在第164行看到的是每当用户更改系统设置ui中的亮度滑块时调用的函数。在第174行中,亮度设置通过Settings.system类更新,就像我和我们的代码一样。但是在第170行之前,有一个函数setBrightness的调用(在第193行中声明)。

setBrightness通过调用setTemporaryScreenBrightnessSettingOverride来设置亮度级别,这是对IPowerManager.Stub.asInterface(ServiceManager.getService(“power”))的调用。实际上android本身正在做我提出的建议。它通过系统调用设置亮度级别,它似乎等同于:

lp.screenBrightness = brightnessLevel / 255f;
getWindow().setAttributes(lp);

在一个活动中调用,然后它在数据库中设置实际设置。所以实际上我建议的不是解决方法,而是系统如何做到这一点。我不认为你提到的设备中存在实现错误,而是它与硬件本身有关,因为android不直接与硬件通信(see here)它可能在如何在这款手机中设计硬件或驱动程序。

希望这会有所帮助......