Controle Programático do Brilho de Tela no Android

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" />

Tags: android java Settings-API ui-design Permissions

Publicado em 7-31 21:00