【问题标题】:How to change the theme for an Android app based on the ambiental light?如何根据环境光更改 Android 应用的主题?
【发布时间】:2021-07-06 09:31:39
【问题描述】:

我正在尝试开发一个Android应用(这是一个学校项目,我没有经验,但我想学习),我需要根据环境光更改主题。

关于项目:我有一个应用程序,用于保存有关用户正在阅读的书籍的信息(打开的书籍、完成的书籍、废弃的书籍、阅读会话等)。这个想法是根据环境光改变主题。

这是用于使用环境光传感器检测光值的代码:

private Toast mToastToShow;
private SensorManager sensorManager;
private Sensor lightSensor;
private SensorEventListener lightSensorEventListener;
private float maxValue;


protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
    lightSensor = sensorManager.getDefaultSensor(TYPE_LIGHT);


    if(lightSensor == null){
        Toast.makeText(this,"Oh, snap... This device has not a light sensor", Toast.LENGTH_SHORT).show();
        finish();
    }

    maxValue = lightSensor.getMaximumRange();

    lightSensorEventListener = new SensorEventListener() {

        @Override
        public void onSensorChanged(SensorEvent event) {
            changeTheme(event);
        }

        @Override
        public void onAccuracyChanged(Sensor sensor, int accuracy) {
            Log.d(this.getClass().getName(), "The accuracy of the sensor has changed");
        }
    };
}

public void showToast(String message) {
    int toastDurationInMilliSeconds = 50000;
    mToastToShow = Toast.makeText(this, message, Toast.LENGTH_LONG);
    CountDownTimer toastCountDown;
    toastCountDown = new CountDownTimer(toastDurationInMilliSeconds, 1000 /*Tick duration*/) {
        public void onTick(long millisUntilFinished) {
            mToastToShow.show();
        }
        public void onFinish() {
            mToastToShow.cancel();
        }
    };
    mToastToShow.show();
    toastCountDown.start();
}

@Override
protected void onStart(){
    super.onStart();
    sensorManager.registerListener(lightSensorEventListener, lightSensor, SensorManager.SENSOR_DELAY_FASTEST);
}

@Override
protected void onResume(){
    super.onResume();
    sensorManager.registerListener(lightSensorEventListener, lightSensor, SensorManager.SENSOR_DELAY_FASTEST);
}

@Override
protected void onPause() {
    super.onPause();
    sensorManager.unregisterListener(lightSensorEventListener);
}


@Override
protected void onStop() {
    super.onStop();
    sensorManager.unregisterListener(lightSensorEventListener);
}

private void changeTheme(SensorEvent event){
    float value = event.values[0];
    if(value >= 14379) {
        AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);
    }else{
        AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
    }
}

我唯一无法解决的问题是,当应用程序启动时,我不知道如何在不改变环境光的情况下获取光值(使用模拟器中的虚拟传感器)。问题是只有在触发 on sensor changed 事件时才会获取光照值。

具体来说,场景如下:

  1. 当亮度值不大于或等于 14379 时,我需要开启深色主题
  2. 如果灯光值大于或等于 14379,则必须应用灯光主题。
  3. 当应用启动时,主题没有更新,因为传感器的 on change 事件没有被触发。
  4. 例如,应用启动时,如果 light 值小于限制,则必须应用深色主题,但由于未触发 on change 事件,则应用浅色主题。

您能否告诉我是否有解决此问题的方法或者我是否犯了错误(这是正常行为)?

感谢您的宝贵时间!

【问题讨论】:

    标签: android events sensors


    【解决方案1】:

    经过一番研究,事实证明您无法执行此操作,因为光传感器是硬件传感器,您无法尝试触发 on change 事件。但在物理设备上,它可以工作(因为环境光并不总是恒定的),唯一的问题是当您尝试在模拟器上模拟这种行为时。

    【讨论】:

      猜你喜欢
      • 2012-12-15
      • 1970-01-01
      • 2020-05-13
      • 1970-01-01
      • 1970-01-01
      • 2013-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多