Android 修改屏幕亮度方案


極力推薦Android 開發大總結文章:歡迎收藏
Android 開發技術文章大總結

本篇文章主要介紹 Android 開發中的部分知識點,通過閱讀本篇文章,您將收獲以下內容:

一、獲取系統Settings 中的亮度
二、修改APP界面屏幕亮度,不會影響其他APP
三、修改系統Settings 中屏幕亮度,影響所有APP
四、完整代碼實現

一、獲取系統Settings 中的亮度

系統屏幕亮度值在(0~255)之間,獲取方法很簡單,只需要調用以下方法即可。

/**
	 * 1.獲取系統默認屏幕亮度值 屏幕亮度值范圍(0-255)
	 * **/
	private int getScreenBrightness(Context context) {
		ContentResolver contentResolver = context.getContentResolver();
		int defVal = 125;
		return Settings.System.getInt(contentResolver,
				Settings.System.SCREEN_BRIGHTNESS, defVal);
	}

修改屏幕亮度包含兩種:
1.修改APP界面屏幕亮度,不會影響其他APP
2.修改系統 Settings 中屏幕亮度,影響所有APP.

二,修改APP界面屏幕亮度,不會影響其他APP

修改自身 APP 亮度很簡單,只需要在Activity OnCreate 方法調用如下代碼即可。

	/**
	 * 2.設置 APP界面屏幕亮度值方法
	 * **/
	private void setAppScreenBrightness(int birghtessValue) {
		Window window = getWindow();
		WindowManager.LayoutParams lp = window.getAttributes();
		lp.screenBrightness = birghtessValue / 255.0f;
		window.setAttributes(lp);
	}

三、修改系統Settings 中屏幕亮度,影響所有APP

修改系統 Settings 中的屏幕亮度,由於會影響到所有APP,需要申請修改Settings 的權限<uses-permission * android:name="android.permission.WRITE_SETTINGS"/>,同時需要取消光感自動調節屏幕亮度的功能,設置為手動調節模式,否則光感傳感器會隨着光照強度的變化修改系統屏幕亮度,並且非系統簽名的APP,需要用戶手動授權后才可以修改背光亮度。

關閉光感,設置手動調節背光模式實現方法如下:
	/**
	 * 3.關閉光感,設置手動調節背光模式
	 * 
	 * SCREEN_BRIGHTNESS_MODE_AUTOMATIC 自動調節屏幕亮度模式值為1
	 * 
	 * SCREEN_BRIGHTNESS_MODE_MANUAL 手動調節屏幕亮度模式值為0
	 * **/
	public void setScreenManualMode(Context context) {
		ContentResolver contentResolver = context.getContentResolver();
		try {
			int mode = Settings.System.getInt(contentResolver,
					Settings.System.SCREEN_BRIGHTNESS_MODE);
			if (mode == Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC) {
				Settings.System.putInt(contentResolver,
						Settings.System.SCREEN_BRIGHTNESS_MODE,
						Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL);
			}
		} catch (Settings.SettingNotFoundException e) {
			e.printStackTrace();
		}
	}
非系統簽名應用,引導用戶手動授權修改Settings 權限

非系統簽名應用,無法直接修改Settings,需要引導用戶手動授權。
引導用戶手動授權


	/**
	 * 4.非系統簽名應用,引導用戶手動授權修改Settings 權限
	 * **/
	private static final int REQUEST_CODE_WRITE_SETTINGS = 1000;

	private void allowModifySettings() {
		// Settings.System.canWrite(MainActivity.this)
		// 檢測是否擁有寫入系統 Settings 的權限
		if (!Settings.System.canWrite(MainActivity.this)) {
			AlertDialog.Builder builder = new AlertDialog.Builder(this,
					android.R.style.Theme_Material_Light_Dialog_Alert);
			builder.setTitle("請開啟修改屏幕亮度權限");
			builder.setMessage("請點擊允許開啟");
			// 拒絕, 無法修改
			builder.setNegativeButton("拒絕",
					new DialogInterface.OnClickListener() {
						@Override
						public void onClick(DialogInterface dialog, int which) {
							Toast.makeText(MainActivity.this,
									"您已拒絕修系統Setting的屏幕亮度權限", Toast.LENGTH_SHORT)
									.show();
						}
					});
			builder.setPositiveButton("去開啟",
					new DialogInterface.OnClickListener() {
						@Override
						public void onClick(DialogInterface dialog, int which) {
							// 打開允許修改Setting 權限的界面
							Intent intent = new Intent(
									Settings.ACTION_MANAGE_WRITE_SETTINGS, Uri
											.parse("package:"
													+ getPackageName()));
							startActivityForResult(intent,
									REQUEST_CODE_WRITE_SETTINGS);
						}
					});
			builder.setCancelable(false);
			builder.show();
		}
	}

	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		// TODO Auto-generated method stub
		super.onActivityResult(requestCode, resultCode, data);
		if (requestCode == REQUEST_CODE_WRITE_SETTINGS) {
			if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
				// Settings.System.canWrite方法檢測授權結果
				if (Settings.System.canWrite(getApplicationContext())) {
					// 5.調用修改Settings屏幕亮度的方法 屏幕亮度值 200
					ModifySettingsScreenBrightness(MainActivity.this, 200);
					Toast.makeText(this, "系統屏幕亮度值" + getScreenBrightness(this),
							Toast.LENGTH_SHORT).show();
				} else {
					Toast.makeText(MainActivity.this, "您已拒絕修系統Setting的屏幕亮度權限",
							Toast.LENGTH_SHORT).show();
				}
			}
		}
	}

修改Setting 中屏幕亮度值 實現

擁有系統簽名的應用可以直接調用此方法修改系統屏幕亮度,非系統簽名應用,只有用戶授權后才可以修改。

/**
	 * 5.修改Setting 中屏幕亮度值
	 * 
	 * 修改Setting的值需要動態申請權限 <uses-permission
	 * android:name="android.permission.WRITE_SETTINGS"/>
	 * **/
	private void ModifySettingsScreenBrightness(Context context,
			int birghtessValue) {
		// 首先需要設置為手動調節屏幕亮度模式
		setScreenManualMode(context);

		ContentResolver contentResolver = context.getContentResolver();
		Settings.System.putInt(contentResolver,
				Settings.System.SCREEN_BRIGHTNESS, birghtessValue);
	}

四、完整代碼實現

完整代碼實現如下:

package com.example.test;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.ContentResolver;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.provider.Settings;
import android.view.Window;
import android.view.WindowManager;
import android.widget.Toast;

public class MainActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		//獲取屏幕亮度
		getScreenBrightness(this);
		Toast.makeText(this, "系統屏幕亮度值" + getScreenBrightness(this),
				Toast.LENGTH_SHORT).show();
		// 設置APP 屏幕亮度后,系統Setting亮度將對此app 不生效
		setAppScreenBrightness(100);
		allowModifySettings();
		setContentView(R.layout.activity_main);

	}

	/**
	 * 1.獲取系統默認屏幕亮度值 屏幕亮度值范圍(0-255)
	 * **/
	private int getScreenBrightness(Context context) {
		ContentResolver contentResolver = context.getContentResolver();
		int defVal = 125;
		return Settings.System.getInt(contentResolver,
				Settings.System.SCREEN_BRIGHTNESS, defVal);
	}

	/**
	 * 2.設置 APP界面屏幕亮度值方法
	 * **/
	private void setAppScreenBrightness(int birghtessValue) {
		Window window = getWindow();
		WindowManager.LayoutParams lp = window.getAttributes();
		lp.screenBrightness = birghtessValue / 255.0f;
		window.setAttributes(lp);
	}

	/**
	 * 3.關閉光感,設置手動調節背光模式
	 * 
	 * SCREEN_BRIGHTNESS_MODE_AUTOMATIC 自動調節屏幕亮度模式值為1
	 * 
	 * SCREEN_BRIGHTNESS_MODE_MANUAL 手動調節屏幕亮度模式值為0
	 * **/
	public void setScreenManualMode(Context context) {
		ContentResolver contentResolver = context.getContentResolver();
		try {
			int mode = Settings.System.getInt(contentResolver,
					Settings.System.SCREEN_BRIGHTNESS_MODE);
			if (mode == Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC) {
				Settings.System.putInt(contentResolver,
						Settings.System.SCREEN_BRIGHTNESS_MODE,
						Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL);
			}
		} catch (Settings.SettingNotFoundException e) {
			e.printStackTrace();
		}
	}

	/**
	 * 4.非系統簽名應用,引導用戶手動授權修改Settings 權限
	 * **/
	private static final int REQUEST_CODE_WRITE_SETTINGS = 1000;

	private void allowModifySettings() {
		// Settings.System.canWrite(MainActivity.this)
		// 檢測是否擁有寫入系統 Settings 的權限
		if (!Settings.System.canWrite(MainActivity.this)) {
			AlertDialog.Builder builder = new AlertDialog.Builder(this,
					android.R.style.Theme_Material_Light_Dialog_Alert);
			builder.setTitle("請開啟修改屏幕亮度權限");
			builder.setMessage("請點擊允許開啟");
			// 拒絕, 無法修改
			builder.setNegativeButton("拒絕",
					new DialogInterface.OnClickListener() {
						@Override
						public void onClick(DialogInterface dialog, int which) {
							Toast.makeText(MainActivity.this,
									"您已拒絕修系統Setting的屏幕亮度權限", Toast.LENGTH_SHORT)
									.show();
						}
					});
			builder.setPositiveButton("去開啟",
					new DialogInterface.OnClickListener() {
						@Override
						public void onClick(DialogInterface dialog, int which) {
							// 打開允許修改Setting 權限的界面
							Intent intent = new Intent(
									Settings.ACTION_MANAGE_WRITE_SETTINGS, Uri
											.parse("package:"
													+ getPackageName()));
							startActivityForResult(intent,
									REQUEST_CODE_WRITE_SETTINGS);
						}
					});
			builder.setCancelable(false);
			builder.show();
		}
	}

	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		// TODO Auto-generated method stub
		super.onActivityResult(requestCode, resultCode, data);
		if (requestCode == REQUEST_CODE_WRITE_SETTINGS) {
			if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
				// Settings.System.canWrite方法檢測授權結果
				if (Settings.System.canWrite(getApplicationContext())) {
					// 5.調用修改Settings屏幕亮度的方法 屏幕亮度值 200
					ModifySettingsScreenBrightness(MainActivity.this, 200);
					Toast.makeText(this, "系統屏幕亮度值" + getScreenBrightness(this),
							Toast.LENGTH_SHORT).show();
				} else {
					Toast.makeText(MainActivity.this, "您已拒絕修系統Setting的屏幕亮度權限",
							Toast.LENGTH_SHORT).show();
				}
			}
		}
	}

	/**
	 * 5.修改Setting 中屏幕亮度值
	 * 
	 * 修改Setting的值需要動態申請權限 <uses-permission
	 * android:name="android.permission.WRITE_SETTINGS"/>
	 * **/
	private void ModifySettingsScreenBrightness(Context context,
			int birghtessValue) {
		// 首先需要設置為手動調節屏幕亮度模式
		setScreenManualMode(context);

		ContentResolver contentResolver = context.getContentResolver();
		Settings.System.putInt(contentResolver,
				Settings.System.SCREEN_BRIGHTNESS, birghtessValue);
	}
}

至此,本篇已結束,如有不對的地方,歡迎您的建議與指正。同時期待您的關注,感謝您的閱讀,謝謝!

微信關注公眾號:  程序員Android,領福利


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM