Ошибка NullPointerException при попытке использовать WindowManager.LayoutParams

194
02 июля 2017, 13:17

Использую для управления яркостью экрана такой метод:

    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
Answer 1

Activity становится "живой" только когда создаётся и запускается системой, иначе она не имеет ни контекста, ни доступа к ресурсам и компонентам.
То есть у Вашего BrightnessControl onCreate не вызывается, а getWindow возвращает null и соответственно его наследование от AppCompatActivity в принципе бессмысленно.
Вы можете передать Window параметром в метод ChangeBrightness - другого способа его там добыть я не припомню.
Единственный вариант, когда Ваш код будет работать - если текущая запущенная активность наследуется от BrightnessControl и ChangeBrightness вызывается у её инстанса.

READ ALSO
Почему ВК не то время возвращает?

Почему ВК не то время возвращает?

В message я получаю время и беру час:

207
Не могу ничего понять в стилях

Не могу ничего понять в стилях

Не надеюсь, что кому-то будет не лень выполнять половину работы за меня, но сам я уже разобраться не в состоянииНужно сделать такую страничку:...

167
FrameworkElement не содержит определения для OnTransformDirty

FrameworkElement не содержит определения для OnTransformDirty

Пытаюсь зарегистрировать свойство зависимости

253
Лаги при управлении змейкой с экрана андроид(при работе в виртуалке unity лагов нет)

Лаги при управлении змейкой с экрана андроид(при работе в виртуалке unity лагов нет)

код скрипта который лежит на Panel в Canvas, при игре на телефоне часто нет реакции на движение пальцем или она некоректна(поворачивает не в ту сторо),...

231