Использую для управления яркостью экрана такой метод:
public void ChangeBrightness (int Value) {
final WindowManager.LayoutParams params;
params = getWindow().getAttributes();
params.screenBrightness = 1;
params.screenBrightness = (float) ((float) Value / 10.0);
getWindow().setAttributes(params);
}
Соответственно, например, в при использовании с ползунком SeekBar для настройки яркости прописываю
onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
ChangeBrightness (progress);
}
Всё работает на ура.
Но я хочу разобраться с созданием внешней библиотеки и поэтому хочу вынести этот метод в неё.
Я создал библиотеку, сделал публичные переменные для передачи данных и публичный метод. В названии класса использую extends AppCompatActivity
Однако, при попытке запуска вылетает NullPoinerException. Судя по сообщению, есть проблема с WindowManager.LayoutParams.
Что я делаю не так?
Код библиотеки:
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.WindowManager;
public class BrightnessControl extends AppCompatActivity {
public static WindowManager.LayoutParams params;
public static String _text;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
final WindowManager.LayoutParams get_params = getWindow().getAttributes();
params = get_params;
params.screenBrightness = 1;
}
public void ChangeBrightness (int Value, String result) {
params.screenBrightness = (float) ((float) Value / 10.0);
getWindow().setAttributes(params);
getWindow().addFlags(WindowManager.LayoutParams.FLAGS_CHANGED);
_text = String.valueOf(Value);
result = _text;
}
}
Логи
java.lang.NullPointerException: Attempt to write to field 'float android.view.WindowManager$LayoutParams.screenBrightness' on a null object reference
at com.vrcorp.brightnessunitylib.BrightnessControl.ChangeBrightness(BrightnessControl.java:23)
at com.vrcorp.brightness.MainActivity$2.onProgressChanged(MainActivity.java:48)
at android.widget.SeekBar.onProgressRefresh(SeekBar.java:93)
at android.widget.ProgressBar.doRefreshProgress(ProgressBar.java:1303)
at android.widget.ProgressBar.refreshProgress(ProgressBar.java:1315)
at android.widget.ProgressBar.setProgress(ProgressBar.java:1361)
at android.widget.AbsSeekBar.trackTouchEvent(AbsSeekBar.java:666)
at android.widget.AbsSeekBar.onTouchEvent(AbsSeekBar.java:610)
at android.view.View.dispatchTouchEvent(View.java:9306)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2554)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2255)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2554)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2255)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2554)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2255)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2554)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2255)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2554)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2255)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2554)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2255)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2554)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2255)
at com.android.internal.policy.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:2403)
at com.android.internal.policy.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1737)
at android.app.Activity.dispatchTouchEvent(Activity.java:2820)
at android.support.v7.view.WindowCallbackWrapper.dispatchTouchEvent(WindowCallbackWrapper.java:63)
at android.support.v7.view.WindowCallbackWrapper.dispatchTouchEvent(WindowCallbackWrapper.java:63)
at com.android.internal.policy.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:2364)
at android.view.View.dispatchPointerEvent(View.java:9526)
at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:4267)
at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:4133)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3674)
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3727)
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3693)
at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3819)
at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3701)
at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:3876)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3674)
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3727)
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3693)
at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3701)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3674)
at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:5959)
at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:5933)
at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:5894)
at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:6062)
at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:185)
at android.os.MessageQueue.nativePollOnce(Native Method)
at android.os.MessageQueue.next(MessageQueue.java:323)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityT
Activity становится "живой" только когда создаётся и запускается системой, иначе она не имеет ни контекста, ни доступа к ресурсам и компонентам.
То есть у Вашего BrightnessControl onCreate не вызывается, а getWindow возвращает null и соответственно его наследование от AppCompatActivity в принципе бессмысленно.
Вы можете передать Window параметром в метод ChangeBrightness - другого способа его там добыть я не припомню.
Единственный вариант, когда Ваш код будет работать - если текущая запущенная активность наследуется от BrightnessControl и ChangeBrightness вызывается у её инстанса.
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости