【发布时间】: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 事件时才会获取光照值。
具体来说,场景如下:
- 当亮度值不大于或等于 14379 时,我需要开启深色主题
- 如果灯光值大于或等于 14379,则必须应用灯光主题。
- 当应用启动时,主题没有更新,因为传感器的 on change 事件没有被触发。
- 例如,应用启动时,如果 light 值小于限制,则必须应用深色主题,但由于未触发 on change 事件,则应用浅色主题。
您能否告诉我是否有解决此问题的方法或者我是否犯了错误(这是正常行为)?
感谢您的宝贵时间!
【问题讨论】: