Изменение настройки яркости экрана на экране Android

Я пытаюсь изменить яркость экрана с помощью службы, например:

android.provider.Settings.System.putInt(getContentResolver(), android.provider.Settings.System.SCREEN_BRIGHTNESS, bright); 

Проблема в том, что это не работает. Ну, на самом деле это удается изменить настройку яркости, но яркость экрана практически не меняется, пока я не войду в настройки телефона, не посмотрю на новое значение и не нажму Ok.

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

У меня была такая же проблема с изменением яркости экрана внутри службы, и пару дней назад я успешно ее разрешил (и обновил свое приложение Phone Schedule с функцией яркости;)). Итак, это код, который вы вводите в свой сервис:

 // This is important. In the next line 'brightness' // should be a float number between 0.0 and 1.0 int brightnessInt = (int)(brightness*255); //Check that the brightness is not 0, which would effectively //switch off the screen, and we don't want that: if(brightnessInt<1) {brightnessInt=1;} // Set systemwide brightness setting. Settings.System.putInt(getContentResolver(), Settings.System.SCREEN_BRIGHTNESS_MODE, Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL); Settings.System.putInt(getContentResolver(), Settings.System.SCREEN_BRIGHTNESS, brightnessInt); // Apply brightness by creating a dummy activity Intent intent = new Intent(getBaseContext(), DummyBrightnessActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.putExtra("brightness value", brightness); getApplication().startActivity(intent); 

Обратите внимание, что в приведенном выше fragmentе кода я использую две переменные для яркости. Один из них - это brightness , которая представляет собой число с плавающей точкой от 0.0 до 1.0, а другое - значение brightnessInt , которое является целым числом от 0 до 255. Причина этого заключается в том, что для Settings.System требуется целое число, чтобы сохранить значение яркости всей системы, а lp.screenBrightness который вы увидите в следующем fragmentе кода, требует поплавка. Не спрашивайте меня, почему бы не использовать одно и то же значение, так оно и есть в Android SDK, поэтому нам просто придется жить с ним.

Это код для DummyBrightnessActivity:

 public class DummyBrightnessActivity extends Activity{ private static final int DELAYED_MESSAGE = 1; private Handler handler; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); handler = new Handler() { @Override public void handleMessage(Message msg) { if(msg.what == DELAYED_MESSAGE) { DummyBrightnessActivity.this.finish(); } super.handleMessage(msg); } }; Intent brightnessIntent = this.getIntent(); float brightness = brightnessIntent.getFloatExtra("brightness value", 0); WindowManager.LayoutParams lp = getWindow().getAttributes(); lp.screenBrightness = brightness; getWindow().setAttributes(lp); Message message = handler.obtainMessage(DELAYED_MESSAGE); //this next line is very important, you need to finish your activity with slight delay handler.sendMessageDelayed(message,1000); } } 

Вот как вы добавляете свою активность в AndroidManifest.xml, возможно, наиболее важную роль:

  

Небольшое объяснение о том, что к чему.

android:taskAffinity должны быть разными, чем ваше имя пакета! Это заставляет DummyBrightnessActivity начинаться не в вашем основном стеке действий, а в отдельном, что означает, что когда DummyBrightnessActivity закрыт, вы не увидите следующего действия, что бы это ни было. Пока я не включил эту строку, закрытие DummyBrightnessActivity вызовет мою основную деятельность.

android:excludeFromRecents="true" делает эту активность недоступной в списке недавно запущенных приложений, которые вы определенно хотите.

android:theme="@style/EmptyActivity" определяет способ, которым DummyBrightnessActivity выглядит для пользователя, и именно здесь вы делаете его невидимым. Так вы определяете этот стиль в файле styles.xml:

  

Таким образом, ваш DummyBrightnessActivity будет невидим для пользователя. Я не уверен, если все эти параметры стиля действительно необходимы, но это работает для меня таким образом.

Надеюсь, это объяснит, но если у вас есть какие-либо вопросы, просто сообщите мне.

Я только что проверил в JB. Для установки яркости из службы достаточно кода

  android.provider.Settings.System.putInt(mContext.getContentResolver(), android.provider.Settings.System.SCREEN_BRIGHTNESS_MODE, android.provider.Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL); android.provider.Settings.System.putInt(mContext.getContentResolver(), android.provider.Settings.System.SCREEN_BRIGHTNESS, brightnessInt); 

первая строка переопределяет автоматическую яркость.

Возможно, вам придется сделать это через объект Window .

Например,

 WindowManager.LayoutParams lp = getWindow().getAttributes(); lp.screenBrightness= lp.screenBrightness*1.25; getWindow().setAttributes(lp); 

Менее интрузивным способом (используя значительно меньше кода) является:

 android.provider.Settings.System.putInt(getContentResolver(), android.provider.Settings.System.SCREEN_BRIGHTNESS, bright); PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); pm.userActivity(SystemClock.uptimeMillis(), false); 
Interesting Posts
Давайте будем гением компьютера.