잠들기 전 사용하는 독서 앱의 화면이 너무 밝아 사용자의 눈을 피로하게 만든다면 어떨까요?
이처럼 앱의 기능과 사용 환경에 따라 화면 밝기를 적절하게 조절하는 것은 사용자 경험(UX)을 극대화하는 중요한 디테일이 될 수 있습니다. 오늘은 안드로이드 앱에서 화면 밝기를 제어하는 두 가지 방법과 각각의 상황에 맞는 올바른 사용법에 대해 알아보겠습니다.
안드로이드 화면 밝기 제어의 두 가지 접근법
안드로이드에서 화면 밝기를 제어하는 방법은 크게 두 가지로 나눌 수 있으며, 어떤 것을 선택하느냐에 따라 사용자 경험에 큰 차이를 만듭니다.
- 현재 액티비티의 밝기만 조절하기: 가장 일반적이고 안전한 방법입니다. 현재 실행 중인 내 앱의 특정 화면에서만 밝기가 변경되며, 사용자가 앱을 벗어나면 원래 시스템 설정으로 즉시 돌아갑니다.
- 시스템 전체 밝기를 조절하기: 기기 자체의 밝기 설정을 직접 변경하는 방법입니다. 앱이 종료되어도 변경된 밝기가 그대로 유지됩니다. 이 방법은 사용자의 설정을 임의로 바꾸는 것이므로, 시스템 유틸리티나 접근성 앱과 같은 매우 특별한 목적이 아니라면 사용하지 않는 것이 좋습니다.
현재 화면의 밝기만 조절하기
이 방법은 현재 활성화된 액티비티의 윈도우(Window) 속성을 변경하여 밝기를 조절합니다. 별도의 권한이 필요 없으며, 가장 사용자 친화적인 방식입니다. QR 코드 스캐너, 동영상 플레이어, 이미지 뷰어, 전자책 리더 등 특정 화면에서 최적의 밝기가 필요할 때 사용합니다.
Kotlin 코드 예시
import android.os.Bundle
import android.view.WindowManager
import androidx.appcompat.app.AppCompatActivity
class BrightnessControlActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_brightness_control)
// 화면 밝기를 최대로 설정 (예: QR 코드 스캔 화면)
setScreenBrightness(1.0f)
}
/**
* 현재 액티비티의 화면 밝기를 조절하는 함수
* @param brightness 밝기 값 (0.0f ~ 1.0f 사이의 float)
*/
private fun setScreenBrightness(brightness: Float) {
val layoutParams: WindowManager.LayoutParams = window.attributes
layoutParams.screenBrightness = brightness // 0.0f (어둡게) ~ 1.0f (밝게)
window.attributes = layoutParams
}
// 이 액티비티를 벗어나면 화면 밝기는 자동으로 시스템 설정으로 돌아갑니다.
// 따라서 별도의 복구 코드는 대부분의 경우 필수는 아니지만,
// 명시적으로 복구하고 싶다면 onPause() 등에서 아래 코드를 호출할 수 있습니다.
/*
private fun resetScreenBrightness() {
val layoutParams: WindowManager.LayoutParams = window.attributes
layoutParams.screenBrightness = WindowManager.LayoutParams.BRIGHTNESS_OVERRIDE_NONE // 시스템 기본값으로 복귀
window.attributes = layoutParams
}
*/
}
Java 코드 예시
import android.os.Bundle;
import android.view.WindowManager;
import androidx.appcompat.app.AppCompatActivity;
public class BrightnessControlActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_brightness_control);
// 화면 밝기를 50%로 설정
setScreenBrightness(0.5f);
}
/**
* 현재 액티비티의 화면 밝기를 조절하는 메서드
* @param brightness 밝기 값 (0.0f ~ 1.0f 사이의 float)
*/
private void setScreenBrightness(float brightness) {
WindowManager.LayoutParams layoutParams = getWindow().getAttributes();
layoutParams.screenBrightness = brightness; // 0.0f (어둡게) ~ 1.0f (밝게)
getWindow().setAttributes(layoutParams);
}
}
window.attributes
: 현재 윈도우의 다양한 속성(밝기, 투명도 등)을 담고 있는 객체입니다.layoutParams.screenBrightness
: 이 값을 조절하여 밝기를 변경합니다. 범위는0.0f
(가장 어두움) ~1.0f
(가장 밝음) 사이의float
값입니다. 시스템 기본 밝기로 되돌리려면WindowManager.LayoutParams.BRIGHTNESS_OVERRIDE_NONE
(-1.0f) 값을 사용합니다.
시스템 전체 밝기 조절하기
이 방법은 기기 전체의 밝기 설정을 변경하며, 앱을 종료해도 그 값이 유지됩니다. 사용자의 기기 설정을 직접 건드리는 것이므로 매우 신중하게 접근해야 하며, 반드시 WRITE_SETTINGS
이라는 민감한 권한이 필요합니다.
매니페스트에 권한 추가
AndroidManifest.xml
파일에 아래 권한을 추가합니다.
<uses-permission android:name="android.permission.WRITE_SETTINGS"
tools:ignore="ProtectedPermissions" />
tools:ignore="ProtectedPermissions"
는 이 권한이 시스템 앱에 주로 사용되는 민감한 권한임을 인지하고 사용한다는 의미입니다.
사용자에게 권한 요청 및 설정
WRITE_SETTINGS
권한은 일반적인 런타임 권한 요청 방식과 달리, 사용자가 직접 시스템 설정 화면에 들어가서 수동으로 허용해주어야 합니다. 따라서 개발자는 사용자에게 권한이 필요한 이유를 친절하게 설명하고 설정 화면으로 안내해야 합니다.
Kotlin 코드 예시:
import android.content.ContentResolver
import android.content.Intent
import android.net.Uri
import android.os.Build
import android.provider.Settings
import android.widget.Toast
// ... Activity 클래스 내부 ...
// 시스템 쓰기 권한이 있는지 확인하고, 없으면 설정 화면으로 안내하는 함수
private fun checkSystemWritePermission(): Boolean {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (!Settings.System.canWrite(this)) {
Toast.makeText(this, "화면 밝기 조절을 위해 권한을 허용해주세요.", Toast.LENGTH_LONG).show()
val intent = Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS)
intent.data = Uri.parse("package:$packageName")
startActivity(intent)
return false
}
}
return true
}
// 시스템 밝기 설정 함수
private fun setSystemBrightness(brightness: Int) { // brightness: 0 ~ 255
if (checkSystemWritePermission()) {
val contentResolver: ContentResolver = contentResolver
try {
// 자동 밝기 모드를 수동으로 변경
Settings.System.putInt(contentResolver, Settings.System.SCREEN_BRIGHTNESS_MODE, Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL)
// 밝기 값 설정 (0 ~ 255)
Settings.System.putInt(contentResolver, Settings.System.SCREEN_BRIGHTNESS, brightness)
} catch (e: Exception) {
e.printStackTrace()
}
}
}
코드 핵심:
Settings.System.canWrite(this)
: 현재 앱이 시스템 설정을 변경할 권한이 있는지 확인합니다.Settings.ACTION_MANAGE_WRITE_SETTINGS
: 시스템 설정 변경 권한을 관리하는 화면으로 사용자를 안내하는 인텐트 액션입니다.Settings.System.putInt(...)
: 시스템 설정 값을 직접 변경합니다. 밝기 값의 범위는0
~255
사이의Int
값입니다.
언제 어떤 방법을 써야 할까?
상황 | 추천 방법 | 이유 |
QR 코드 스캔, 동영상 재생, 이미지 보기 등 내 앱의 특정 화면에서만 밝기를 조절하고 싶을 때 | 방법 1 (Activity 밝기 조절) | 사용자 경험을 해치지 않고, 별도 권한 없이 가장 안전하게 구현 가능 |
시스템 설정 자체를 변경하는 기기 관리/유틸리티/접근성 앱을 만들 때 | 방법 2 (시스템 밝기 조절) | 사용 목적이 명확하고, 사용자에게 충분한 설명과 동의를 얻은 경우에만 제한적으로 사용 |
마치며
화면 밝기 조절 기능의 핵심은 사용자의 편의성을 높이고, 앱의 특정 기능이 더 효과적으로 작동하도록 돕는 것입니다. 불필요하게 밝기를 조절하거나, 사용자의 시스템 설정을 임의로 변경하는 것은 오히려 나쁜 인상을 줄 수 있습니다.
항상 사용자를 최우선으로 생각하고, 꼭 필요한 경우에만 가장 덜 침해적인 방법으로 신중하게 기능을 구현하는 것이 좋은 앱을 만드는 지름길입니다.
읽어주셔서 감사합니다. 🙂
"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."