Android 系統設置中顯示設置之亮度調節篇


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     }
View Code

 

   步驟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         }

 


  以上就是對亮度調節的基本內容,希望大家能夠喜歡,您的支持是我不懈的動力,當然不喜勿噴,有錯請指正!

 


免責聲明!

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



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