A manipulação do brilho da tela em dispositivos Android exige a interação com as configurações do sistema através da classe Settings.System. Para que uma aplicação possa alterar essas definições, é necessário obter permissões especciais do usuário, uma vez que isso afeta a experiência global do sistema opercaional.
Gerenciamento de Permissões
Desde o Android 6.0 (Marshmallow), a permissão WRITE_SETTINGS é considerada de alto risco e não pode ser concedida apenas via Manifesto. O código abaixo demonstra como verificar se a aplicação possui permissão para gravar nas configurações do sistema e, caso contrário, redirecionar o usuário para a tela de autorização:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (!Settings.System.canWrite(context)) {
Intent intentPermissao = new Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS);
intentPermissao.setData(Uri.parse("package:" + context.getPackageName()));
intentPermissao.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intentPermissao);
}
}
Implementação da Activity de Ajuste
A lógica central consiste em ler o valor atual do brilho, aplicar um incremento ou decremento e persistir o novo valor. É fundamental também definir o modo de brilho para "Manual", garantindo que o ajuste automático não sobrescreva as alterações do usuário.
public class AtividadeAjusteBrilho extends AppCompatActivity {
private ContentResolver cResolver;
private int nivelBrilho;
private final int MAX_BRILHO = 255; // Padrão Android para Settings.System
private final int PASSO_AJUSTE = 51; // Incremento de 20% (255/5)
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.layout_brilho);
cResolver = getContentResolver();
Button btnAumentar = findViewById(R.id.btn_mais_brilho);
Button btnDiminuir = findViewById(R.id.btn_menos_brilho);
try {
nivelBrilho = Settings.System.getInt(cResolver, Settings.System.SCREEN_BRIGHTNESS);
} catch (Settings.SettingNotFoundException e) {
nivelBrilho = 128; // Valor padrão em caso de erro
}
btnAumentar.setOnClickListener(v -> atualizarNivel(true));
btnDiminuir.setOnClickListener(v -> atualizarNivel(false));
}
private void atualizarNivel(boolean incrementar) {
if (incrementar) {
nivelBrilho = Math.min(nivelBrilho + PASSO_AJUSTE, MAX_BRILHO);
} else {
nivelBrilho = Math.max(nivelBrilho - PASSO_AJUSTE, 0);
}
persistirBrilho(nivelBrilho);
}
private void persistirBrilho(int valor) {
// Desativa o brilho automático para aplicar o manual
Settings.System.putInt(cResolver,
Settings.System.SCREEN_BRIGHTNESS_MODE,
Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL);
// Aplica o novo valor de brilho
Settings.System.putInt(cResolver, Settings.System.SCREEN_BRIGHTNESS, valor);
}
}
Interface de Usuário (XML)
O layout abaixo utiliza botões customizados que reagem ao toque, fornecando feedback visual através de seletores de estado.
<!-- layout_brilho.xml -->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:gravity="center">
<ImageView
android:id="@+id/img_status_brilho"
android:layout_width="120dp"
android:layout_height="120dp"
android:src="@drawable/ic_brilho_padrao" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="30dp"
android:orientation="horizontal">
<Button
android:id="@+id/btn_menos_brilho"
android:layout_width="80dp"
android:layout_height="80dp"
android:background="@drawable/seletor_botao_diminuir" />
<Button
android:id="@+id/btn_mais_brilho"
android:layout_width="80dp"
android:layout_height="80dp"
android:layout_marginStart="40dp"
android:background="@drawable/seletor_botao_aumentar" />
</LinearLayout>
</LinearLayout>
Feedback Visual com StateListDrawable
Para melhorar a experiência do usuário, utilizamos arquivos de selector para alterar a aparência dos botões quando pressionados. Este exemplo aplica-se ao botão de incremento:
<!-- seletor_botao_aumentar.xml -->
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true">
<bitmap android:src="@drawable/ic_mais_pressionado" />
</item>
<item>
<bitmap android:src="@drawable/ic_mais_normal" />
</item>
</selector>
Ao implementar esta funcionalidade, certifique-se de que o arquivo AndroidManifest.xml contenha a declaração da permissão:
<uses-permission android:name="android.permission.WRITE_SETTINGS" tools:ignore="ProtectedPermissions" />