Android 系統設置中顯示設置之亮度調節篇
在上一篇博客中,我們學習了顯示設置中休眠設置和屏保設置的基本內容。在這一篇中我們來學習設備亮度的調節,首先還是學習在DisplaySettings.xml增加了一個叫做BrightnessPreference的preference的選項用來控制亮度調節。
步驟1:當用戶點擊BrightnessPreference的時候,由BrightnessPreference做對應的處理(注:其實是發送了一個廣播)
1 public class BrightnessPreference extends Preference { 2 3 public BrightnessPreference(Context context, AttributeSet attrs) { 4 super(context, attrs); 5 } 6 7 @Override 8 protected void onClick() { 9 //發送了一個顯示亮度調節對話框的廣播 10 Intent intent = new Intent(Intent.ACTION_SHOW_BRIGHTNESS_DIALOG); 11 getContext().sendBroadcastAsUser(intent, UserHandle.CURRENT_OR_SELF); 12 } 13 }
步驟2:對廣播的注冊並處理,有一個SettingsUI的類繼承自SystemUI,該類負責監聽上面的廣播並進行處理,詳見:
1 public class SettingsUI extends SystemUI { 2 private static final String TAG = "SettingsUI"; 3 private static final boolean DEBUG = false; 4 private final Handler mHandler = new Handler(); 5 private BrightnessDialog mBrightnessDialog; 6 private BroadcastReceiver mIntentReceiver = new BroadcastReceiver() { 7 @Override 8 public void onReceive(Context context, Intent intent) { 9 String action = intent.getAction(); 10 if (action.equals(Intent.ACTION_SHOW_BRIGHTNESS_DIALOG)) { 11 if (DEBUG) Log.d(TAG, "showing brightness dialog"); 12 if (mBrightnessDialog == null) { 13 mBrightnessDialog = new BrightnessDialog(mContext); 14 mBrightnessDialog.setOnDismissListener(new DialogInterface.OnDismissListener() { 15 @Override 16 public void onDismiss(DialogInterface dialog) { 17 mBrightnessDialog = null;}}); 18 } 19 if (!mBrightnessDialog.isShowing()) { 20 //顯示亮度調節的dialog 21 mBrightnessDialog.show(); } 22 } else { 23 Log.w(TAG, "unknown intent: " + intent);}}}; 24 25 public void start() { 26 //監聽ACTION_SHOW_BRIGHTNESS_DIALOG廣播 27 IntentFilter filter = new IntentFilter(); 28 filter.addAction(Intent.ACTION_SHOW_BRIGHTNESS_DIALOG); 29 mContext.registerReceiverAsUser(mIntentReceiver, UserHandle.ALL, filter, null, mHandler); 30 }
步驟3:上面是負責顯示亮度調節的對話框,具體的設置需要查看BrightnessDialog,詳見:

1 /** 2 * Create the brightness dialog and any resources that are used for the 3 * entire lifetime of the dialog. 4 */ 5 @Override 6 public void onCreate(Bundle savedInstanceState) { 7 super.onCreate(savedInstanceState); 8 9 Window window = getWindow(); 10 window.setType(WindowManager.LayoutParams.TYPE_VOLUME_OVERLAY); 11 window.getAttributes().privateFlags |= 12 WindowManager.LayoutParams.PRIVATE_FLAG_SHOW_FOR_ALL_USERS; 13 window.clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND); 14 window.requestFeature(Window.FEATURE_NO_TITLE); 15 //dialog顯示的內容quick_settings_brightness_dialog.xml 16 setContentView(R.layout.quick_settings_brightness_dialog); 17 setCanceledOnTouchOutside(true); 18 } 19 20 21 @Override 22 protected void onStart() { 23 super.onStart(); 24 //對亮度的調節主要是使用了BrightnessController類 25 mBrightnessController = new BrightnessController(getContext(), 26 (ImageView) findViewById(R.id.brightness_icon), 27 (ToggleSlider) findViewById(R.id.brightness_slider)); 28 dismissBrightnessDialog(mBrightnessDialogLongTimeout); 29 mBrightnessController.addStateChangedCallback(this); 30 }
步驟4: BrightnessController詳解:
我們這里主要還是學習下一些基本的內容,具體包括獲取設備最大的亮度和最低的亮度值、如果設置屏幕的亮度、當前的亮度值和亮度調節模式保存和獲取的位置。
-
-
- 獲取設備的最大和最低亮度值
-
1 //獲取PowerManager對象 2 PowerManager pm = (PowerManager)context.getSystemService(Context.POWER_SERVICE); 3 //鑾峰彇璁懼鐨勬渶澶т寒搴? 4 mMinimumBacklight = pm.getMinimumScreenBrightnessSetting(); 5 //鑾峰彇璁懼鐨勬渶浣庝寒搴? 6 mMaximumBacklight = pm.getMaximumScreenBrightnessSetting();
-
-
- 設置屏幕亮度
-
//首先獲取IPowerManager對象 mPower = IPowerManager.Stub.asInterface(ServiceManager.getService("power"));
private void setBrightness(int brightness) { try { mPower.setTemporaryScreenBrightnessSettingOverride(brightness); } catch (RemoteException ex) { } }
-
-
- 亮度值和亮度模式的讀取和存儲
-
1 //設置亮度的設置模式,mode=0表示為手動,mode=1表示自動調節 2 private void setMode(int mode) { 3 //存儲位置為Settings.system中 4 Settings.System.putIntForUser(mContext.getContentResolver(), 5 Settings.System.SCREEN_BRIGHTNESS_MODE, mode, 6 mUserTracker.getCurrentUserId()); 7 }
//以下的代碼是負責取出設置模式的
int automatic;
try {
automatic = Settings.System.getIntForUser(mContext.getContentResolver(),
Settings.System.SCREEN_BRIGHTNESS_MODE,
UserHandle.USER_CURRENT);
} catch (SettingNotFoundException snfe) {
automatic = 0;
}
//以下的代碼是將亮度值保存到Settings.system中
if (!tracking) { AsyncTask.execute(new Runnable() { public void run() { Settings.System.putIntForUser(mContext.getContentResolver(), Settings.System.SCREEN_BRIGHTNESS, val, UserHandle.USER_CURRENT); } }); }
/** Fetch the brightness from the system settings and update the slider */ private void updateSlider() { int value; try { //從Settings.System中獲取亮度值 value = Settings.System.getIntForUser(mContext.getContentResolver(), Settings.System.SCREEN_BRIGHTNESS, UserHandle.USER_CURRENT); } catch (SettingNotFoundException ex) { value = mMaximumBacklight; } mControl.setMax(mMaximumBacklight - mMinimumBacklight); mControl.setValue(value - mMinimumBacklight); }
雜談:
我們在BrightnessController中找到了一個內部類叫做BrightnessController,它繼承自ContentObserver。該過程使用了觀察者設計模式,主要是用來負責對ContentProvider中指定的URI進行監聽,如果該URI對應的數據發生了變化就可以及時得到監聽並處理。它的使用請參考:http://www.cnblogs.com/slider/archive/2012/02/14/2351702.html 。
BrightnessController主要是監聽了
private final Uri BRIGHTNESS_MODE_URI = Settings.System.getUriFor(Settings.System.SCREEN_BRIGHTNESS_MODE);//亮度調節模式 private final Uri BRIGHTNESS_URI = Settings.System.getUriFor(Settings.System.SCREEN_BRIGHTNESS);//亮度值
1 //當監聽的uri發生變化時,回調onChange函數 2 @Override 3 public void onChange(boolean selfChange, Uri uri) { 4 if (selfChange) return; 5 if (BRIGHTNESS_MODE_URI.equals(uri)) { 6 updateMode();//更新模式 7 } else if (BRIGHTNESS_URI.equals(uri)) { 8 updateSlider();//更新拖動條 9 } else { 10 updateMode(); 11 updateSlider(); 12 } 13 for (BrightnessStateChangeCallback cb : mChangeCallbacks) { 14 cb.onBrightnessLevelChanged(); 15 } 16 }
以上就是對亮度調節的基本內容,希望大家能夠喜歡,您的支持是我不懈的動力,當然不喜勿噴,有錯請指正!