我的Android进阶之旅------>自己写个Activity来调节Android系统背光亮度Brightness

来源:互联网 发布:唐大少爷网络象棋学校 编辑:程序博客网 时间:2024/04/30 13:00

     

      今天终于算初步写好了一个调节系统背光亮度Brightness的代码,本来不看Android源代码以为可以直接调用某个Action来启动系统的那个调节Brightness的对话框,但是看了代码后发现系统调节Brightness的自定义组件BrightnessPreference继承了SeekBarDialogPreference,但是最终父类还是Preference,因此不能够单独启动,必须得将这个自定义的BrightnessPreference用某个Activity才能加载过来,毕竟最终还是一个组件。因此,将系统的BrightnessPreference改写成Activity的形式,然后将Activity的主题设置为对话框的主题即可。

     下图是系统自带的对话框,我的Activity就是仿造这个界面做的。

    

      下面是我改写完后的代码,可以和系统设置的背光设置进行同步,即数据同步,无论是使用自己的Activity还是系统自带的调节背光的亮度,都是一样的效果。代码在Eclipse中运行可能会报错,但是别怕,使用Android编译能通过,然后push到Android设备中去运行没有错误。


 代码如下:BrightnessDialogActivity.java


import android.app.Activity;import android.content.ContentResolver;import android.database.ContentObserver;import android.os.Bundle;import android.os.Handler;import android.os.IPowerManager;import android.os.RemoteException;import android.os.ServiceManager;import android.provider.Settings;import android.provider.Settings.SettingNotFoundException;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.CheckBox;import android.widget.CompoundButton;import android.widget.SeekBar;import com.android.settings.R;import com.canplay.systemui.QuickSettings;import com.canplay.util.DLog;/** * @author ouyangpeng */public class BrightnessDialogActivity extends Activity implementsSeekBar.OnSeekBarChangeListener, OnClickListener {private static String TAG="@@@@@@@@@@@@Brightness---->";private SeekBar mSeekBar;private CheckBox mCheckBox;private Button btnCancel;private Button btnSure;private int mOldBrightness;private int mOldAutomatic;private boolean mAutomaticAvailable;private boolean mAutomaticMode;private int mCurBrightness = -1;private boolean mRestoredOldState;// Backlight range is from 0 - 255. Need to make sure that user// doesn't set the backlight to 0 and get stuckprivate int mScreenBrightnessDim = android.os.PowerManager.BRIGHTNESS_DIM + 10;private static final int MAXIMUM_BACKLIGHT = android.os.PowerManager.BRIGHTNESS_ON;private static final int SEEK_BAR_RANGE = 10000;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.brightness_dialog_activity);getContentResolver().registerContentObserver(Settings.System.getUriFor(Settings.System.SCREEN_BRIGHTNESS),true, mBrightnessObserver);getContentResolver().registerContentObserver(Settings.System.getUriFor(Settings.System.SCREEN_BRIGHTNESS_MODE),true, mBrightnessModeObserver);mRestoredOldState = false;mAutomaticAvailable = true;/* * mAutomaticAvailable = getResources() .getBoolean( * com.android.internal.R.bool.config_automatic_brightness_available); */// mAutomaticAvailable=getBrightnessMode(0)==Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC;mSeekBar = (SeekBar) findViewById(R.id.brightnessSeekbar);mSeekBar.setMax(SEEK_BAR_RANGE);mOldBrightness = getBrightness();mSeekBar.setProgress(mOldBrightness);mCheckBox = (CheckBox) findViewById(R.id.brightness_automatic_mode);// 重新读取配置信息// onBrightnessChanged();// onBrightnessModeChanged();if (mAutomaticAvailable) {mCheckBox.setOnCheckedChangeListener(new CheckBox.OnCheckedChangeListener() {@Overridepublic void onCheckedChanged(CompoundButton buttonView,boolean isChecked) {setMode(isChecked ? Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC: Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL);mSeekBar.setProgress(getBrightness());mSeekBar.setEnabled(!mAutomaticMode);setBrightness(mSeekBar.getProgress(), false);}});mOldAutomatic = getBrightnessMode(0);mAutomaticMode = mOldAutomatic == Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC;mCheckBox.setChecked(mAutomaticMode);mSeekBar.setEnabled(!mAutomaticMode);} else {mSeekBar.setEnabled(true);}mSeekBar.setOnSeekBarChangeListener(this);btnSure = (Button) findViewById(R.id.btnSure);btnSure.setOnClickListener(this);btnCancel = (Button) findViewById(R.id.btnCancel);btnCancel.setOnClickListener(this);}private ContentObserver mBrightnessObserver = new ContentObserver(new Handler()) {@Overridepublic void onChange(boolean selfChange) {mCurBrightness = -1;onBrightnessChanged();}};private ContentObserver mBrightnessModeObserver = new ContentObserver(new Handler()) {@Overridepublic void onChange(boolean selfChange) {onBrightnessModeChanged();}};private void onBrightnessChanged() {mSeekBar.setProgress(getBrightness());}private void onBrightnessModeChanged() {boolean checked = getBrightnessMode(0) == Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC;mCheckBox.setChecked(checked);mSeekBar.setProgress(getBrightness());mSeekBar.setEnabled(!checked);}private int getBrightnessMode(int defaultValue) {int brightnessMode = defaultValue;try {brightnessMode = Settings.System.getInt(getContentResolver(),Settings.System.SCREEN_BRIGHTNESS_MODE);} catch (SettingNotFoundException snfe) {}return brightnessMode;}private int getBrightness() {int mode = getBrightnessMode(0);float brightness = 0;if (mode == Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC) {brightness = Settings.System.getFloat(getContentResolver(),Settings.System.SCREEN_AUTO_BRIGHTNESS_ADJ, 0);brightness = (brightness + 1) / 2;} else {if (mCurBrightness < 0) {brightness = Settings.System.getInt(getContentResolver(),Settings.System.SCREEN_BRIGHTNESS, 100);} else {brightness = mCurBrightness;}brightness = (brightness - mScreenBrightnessDim)/ (MAXIMUM_BACKLIGHT - mScreenBrightnessDim);}return (int) (brightness * SEEK_BAR_RANGE);}@Overridepublic void onProgressChanged(SeekBar seekBar, int progress,boolean fromUser) {setBrightness(progress, false);}@Overridepublic void onStartTrackingTouch(SeekBar seekBar) {}@Overridepublic void onStopTrackingTouch(SeekBar seekBar) {}private void setMode(int mode) {mAutomaticMode = mode == Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC;Settings.System.putInt(getContentResolver(),Settings.System.SCREEN_BRIGHTNESS_MODE, mode);}private void setBrightness(int brightness, boolean write) {if (mAutomaticMode) {float valf = (((float) brightness * 2) / SEEK_BAR_RANGE) - 1.0f;try {IPowerManager power = IPowerManager.Stub.asInterface(ServiceManager.getService("power"));if (power != null) {power.setAutoBrightnessAdjustment(valf);}if (write) {final ContentResolver resolver = getContentResolver();Settings.System.putFloat(resolver,Settings.System.SCREEN_AUTO_BRIGHTNESS_ADJ,valf);}} catch (RemoteException doe) {}} else {int range = (MAXIMUM_BACKLIGHT - mScreenBrightnessDim);brightness = (brightness * range) / SEEK_BAR_RANGE+ mScreenBrightnessDim;try {IPowerManager power = IPowerManager.Stub.asInterface(ServiceManager.getService("power"));if (power != null) {power.setBacklightBrightness(brightness);}if (write) {mCurBrightness = -1;final ContentResolver resolver = getContentResolver();Settings.System.putInt(resolver,Settings.System.SCREEN_BRIGHTNESS, brightness);} else {mCurBrightness = brightness;}} catch (RemoteException doe) {}}}private void restoreOldState() {if (mRestoredOldState)return;if (mAutomaticAvailable) {setMode(mOldAutomatic);}setBrightness(mOldBrightness, false);mRestoredOldState = true;mCurBrightness = -1;}@Overridepublic void onClick(View v) {final ContentResolver resolver = getContentResolver();if (v == findViewById(R.id.btnSure)) {setBrightness(mSeekBar.getProgress(), true);this.finish();} else if (v == findViewById(R.id.btnCancel)) {restoreOldState();this.finish();}resolver.unregisterContentObserver(mBrightnessObserver);resolver.unregisterContentObserver(mBrightnessModeObserver);}}


相应的布局文件如下:brightness_dialog_activity.xml

<?xml version="1.0" encoding="utf-8"?><ScrollView xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent" >    <LinearLayout        xmlns:android="http://schemas.android.com/apk/res/android"        android:layout_width="match_parent"        android:layout_height="match_parent"        android:gravity="center_horizontal"        android:orientation="vertical"        android:paddingBottom="20dip" >        <ImageView            android:id="@android:id/icon"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:contentDescription="@null"            android:paddingTop="20dip"            android:visibility="gone" />        <CheckBox            android:id="@+id/brightness_automatic_mode"            android:layout_width="match_parent"            android:layout_height="wrap_content"            android:layout_marginLeft="20dip"            android:layout_marginRight="20dip"            android:layout_marginTop="6dip"            android:text="@string/automatic_brightness"            android:textAppearance="?android:attr/textAppearanceSmall" />        <SeekBar            android:id="@+id/brightness_seekbar"            android:layout_width="match_parent"            android:layout_height="wrap_content"            android:padding="20dip" />        <LinearLayout            xmlns:android="http://schemas.android.com/apk/res/android"            android:layout_width="match_parent"            android:layout_height="match_parent"            android:orientation="horizontal" >            <Button                android:id="@+id/btn_cancel"                android:layout_width="match_parent"                android:layout_height="wrap_content"                android:layout_weight="1"                android:text="@string/cancel"                android:layout_gravity="center" />            <Button                  android:id="@+id/btn_sure"                android:layout_width="match_parent"                android:layout_height="wrap_content"                android:layout_weight="1"                android:text="@string/sure"                android:layout_gravity="center" />        </LinearLayout>    </LinearLayout></ScrollView>


注册Activity的时候使用下面的主题

 android:theme="@android:style/Theme.Holo.Dialog"


但是有个bug,即调用系统的应用调节背光的时候,Seekbar的值和复选框是否被勾中在我的自定义Activity中的Seekbar的值和复选框是否被勾中同步,但是反过来就不行了。

再次读取系统的BrightnessPreference发现是因为没有去进行更新操作。因此得修改Android的源代码,重新编译后才能达到两边数据随便那边修改后,两边的数据都同步。

修改如下所示,修改前BrightnessPreference.showDialog(Bundle state)

   @Override    protected void showDialog(Bundle state) {        super.showDialog(state);        getContext().getContentResolver().registerContentObserver(                Settings.System.getUriFor(Settings.System.SCREEN_BRIGHTNESS), true,                mBrightnessObserver);        getContext().getContentResolver().registerContentObserver(                Settings.System.getUriFor(Settings.System.SCREEN_BRIGHTNESS_MODE), true,                mBrightnessModeObserver);        mRestoredOldState = false;    }

修改后BrightnessPreference.showDialog(Bundle state),即打开对话框的时候重新去读取数据库里面的Brightness的值和复选框是否被选中的值。


    @Override    protected void showDialog(Bundle state) {        super.showDialog(state);        getContext().getContentResolver().registerContentObserver(                Settings.System.getUriFor(Settings.System.SCREEN_BRIGHTNESS), true,                mBrightnessObserver);        getContext().getContentResolver().registerContentObserver(                Settings.System.getUriFor(Settings.System.SCREEN_BRIGHTNESS_MODE), true,                mBrightnessModeObserver);        onBrightnessChanged();        onBrightnessModeChanged();        mRestoredOldState = false;    }

====================================================================================

  作者:欧阳鹏  欢迎转载,与人分享是进步的源泉!

  转载请保留原文地址:http://blog.csdn.net/ouyang_peng

===================================================================================


最后附上系统调节Brightness的代码

/* * Copyright (C) 2008 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * *      http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */package com.android.settings;import android.content.ContentResolver;import android.content.Context;import android.database.ContentObserver;import android.os.Bundle;import android.os.Handler;import android.os.IPowerManager;import android.os.Parcel;import android.os.Parcelable;import android.os.RemoteException;import android.os.ServiceManager;import android.preference.SeekBarDialogPreference;import android.provider.Settings;import android.provider.Settings.SettingNotFoundException;import android.util.AttributeSet;import android.view.View;import android.widget.CheckBox;import android.widget.CompoundButton;import android.widget.SeekBar;public class BrightnessPreference extends SeekBarDialogPreference implements        SeekBar.OnSeekBarChangeListener, CheckBox.OnCheckedChangeListener {    private SeekBar mSeekBar;    private CheckBox mCheckBox;    private int mOldBrightness;    private int mOldAutomatic;    private boolean mAutomaticAvailable;    private boolean mAutomaticMode;    private int mCurBrightness = -1;    private boolean mRestoredOldState;    // Backlight range is from 0 - 255. Need to make sure that user    // doesn't set the backlight to 0 and get stuck    private int mScreenBrightnessDim =    getContext().getResources().getInteger(com.android.internal.R.integer.config_screenBrightnessDim);    private static final int MAXIMUM_BACKLIGHT = android.os.PowerManager.BRIGHTNESS_ON;    private static final int SEEK_BAR_RANGE = 10000;    private ContentObserver mBrightnessObserver = new ContentObserver(new Handler()) {        @Override        public void onChange(boolean selfChange) {            mCurBrightness = -1;            onBrightnessChanged();        }    };    private ContentObserver mBrightnessModeObserver = new ContentObserver(new Handler()) {        @Override        public void onChange(boolean selfChange) {            onBrightnessModeChanged();        }    };    public BrightnessPreference(Context context, AttributeSet attrs) {        super(context, attrs);        mAutomaticAvailable = context.getResources().getBoolean(                com.android.internal.R.bool.config_automatic_brightness_available);        setDialogLayoutResource(R.layout.preference_dialog_brightness);        setDialogIcon(R.drawable.ic_settings_display);    }    @Override    protected void showDialog(Bundle state) {        super.showDialog(state);        getContext().getContentResolver().registerContentObserver(                Settings.System.getUriFor(Settings.System.SCREEN_BRIGHTNESS), true,                mBrightnessObserver);        getContext().getContentResolver().registerContentObserver(                Settings.System.getUriFor(Settings.System.SCREEN_BRIGHTNESS_MODE), true,                mBrightnessModeObserver);        onBrightnessChanged();        onBrightnessModeChanged();        mRestoredOldState = false;    }    @Override    protected void onBindDialogView(View view) {        super.onBindDialogView(view);        mSeekBar = getSeekBar(view);        mSeekBar.setMax(SEEK_BAR_RANGE);        mOldBrightness = getBrightness();        mSeekBar.setProgress(mOldBrightness);        mCheckBox = (CheckBox)view.findViewById(R.id.automatic_mode);        if (mAutomaticAvailable) {            mCheckBox.setOnCheckedChangeListener(this);            mOldAutomatic = getBrightnessMode(0);            mAutomaticMode = mOldAutomatic == Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC;            mCheckBox.setChecked(mAutomaticMode);            mSeekBar.setEnabled(!mAutomaticMode);        } else {            mSeekBar.setEnabled(true);        }        mSeekBar.setOnSeekBarChangeListener(this);    }    public void onProgressChanged(SeekBar seekBar, int progress,            boolean fromTouch) {        setBrightness(progress, false);    }    public void onStartTrackingTouch(SeekBar seekBar) {        // NA    }    public void onStopTrackingTouch(SeekBar seekBar) {        // NA    }    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {        setMode(isChecked ? Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC                : Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL);        mSeekBar.setProgress(getBrightness());        mSeekBar.setEnabled(!mAutomaticMode);        setBrightness(mSeekBar.getProgress(), false);    }    private int getBrightness() {        int mode = getBrightnessMode(0);        float brightness = 0;        if (false && mode == Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC) {            brightness = Settings.System.getFloat(getContext().getContentResolver(),                    Settings.System.SCREEN_AUTO_BRIGHTNESS_ADJ, 0);            brightness = (brightness+1)/2;        } else {            if (mCurBrightness < 0) {                brightness = Settings.System.getInt(getContext().getContentResolver(),                        Settings.System.SCREEN_BRIGHTNESS, 100);            } else {                brightness = mCurBrightness;            }            brightness = (brightness - mScreenBrightnessDim)                    / (MAXIMUM_BACKLIGHT - mScreenBrightnessDim);        }        return (int)(brightness*SEEK_BAR_RANGE);    }    private int getBrightnessMode(int defaultValue) {        int brightnessMode = defaultValue;        try {            brightnessMode = Settings.System.getInt(getContext().getContentResolver(),                    Settings.System.SCREEN_BRIGHTNESS_MODE);        } catch (SettingNotFoundException snfe) {        }        return brightnessMode;    }    private void onBrightnessChanged() {        mSeekBar.setProgress(getBrightness());    }    private void onBrightnessModeChanged() {        boolean checked = getBrightnessMode(0)                == Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC;        mCheckBox.setChecked(checked);        mSeekBar.setProgress(getBrightness());        mSeekBar.setEnabled(!checked);    }    @Override    protected void onDialogClosed(boolean positiveResult) {        super.onDialogClosed(positiveResult);        final ContentResolver resolver = getContext().getContentResolver();        if (positiveResult) {            setBrightness(mSeekBar.getProgress(), true);        } else {            restoreOldState();        }        resolver.unregisterContentObserver(mBrightnessObserver);        resolver.unregisterContentObserver(mBrightnessModeObserver);    }    private void restoreOldState() {        if (mRestoredOldState) return;        if (mAutomaticAvailable) {            setMode(mOldAutomatic);        }        setBrightness(mOldBrightness, false);        mRestoredOldState = true;        mCurBrightness = -1;    }    private void setBrightness(int brightness, boolean write) {        if (mAutomaticMode) {            if (false) {                float valf = (((float)brightness*2)/SEEK_BAR_RANGE) - 1.0f;                try {                    IPowerManager power = IPowerManager.Stub.asInterface(                            ServiceManager.getService("power"));                    if (power != null) {                        power.setAutoBrightnessAdjustment(valf);                    }                    if (write) {                        final ContentResolver resolver = getContext().getContentResolver();                        Settings.System.putFloat(resolver,                                Settings.System.SCREEN_AUTO_BRIGHTNESS_ADJ, valf);                    }                } catch (RemoteException doe) {                }            }        } else {            int range = (MAXIMUM_BACKLIGHT - mScreenBrightnessDim);            brightness = (brightness*range)/SEEK_BAR_RANGE + mScreenBrightnessDim;            try {                IPowerManager power = IPowerManager.Stub.asInterface(                        ServiceManager.getService("power"));                if (power != null) {                    power.setBacklightBrightness(brightness);                }                if (write) {                    mCurBrightness = -1;                    final ContentResolver resolver = getContext().getContentResolver();                    Settings.System.putInt(resolver,                            Settings.System.SCREEN_BRIGHTNESS, brightness);                } else {                    mCurBrightness = brightness;                }            } catch (RemoteException doe) {            }        }    }    private void setMode(int mode) {        mAutomaticMode = mode == Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC;        Settings.System.putInt(getContext().getContentResolver(),                Settings.System.SCREEN_BRIGHTNESS_MODE, mode);    }    @Override    protected Parcelable onSaveInstanceState() {        final Parcelable superState = super.onSaveInstanceState();        if (getDialog() == null || !getDialog().isShowing()) return superState;        // Save the dialog state        final SavedState myState = new SavedState(superState);        myState.automatic = mCheckBox.isChecked();        myState.progress = mSeekBar.getProgress();        myState.oldAutomatic = mOldAutomatic == 1;        myState.oldProgress = mOldBrightness;        myState.curBrightness = mCurBrightness;        // Restore the old state when the activity or dialog is being paused        restoreOldState();        return myState;    }    @Override    protected void onRestoreInstanceState(Parcelable state) {        if (state == null || !state.getClass().equals(SavedState.class)) {            // Didn't save state for us in onSaveInstanceState            super.onRestoreInstanceState(state);            return;        }        SavedState myState = (SavedState) state;        super.onRestoreInstanceState(myState.getSuperState());        mOldBrightness = myState.oldProgress;        mOldAutomatic = myState.oldAutomatic ? 1 : 0;        setMode(myState.automatic ? 1 : 0);        setBrightness(myState.progress, false);        mCurBrightness = myState.curBrightness;    }    private static class SavedState extends BaseSavedState {        boolean automatic;        boolean oldAutomatic;        int progress;        int oldProgress;        int curBrightness;        public SavedState(Parcel source) {            super(source);            automatic = source.readInt() == 1;            progress = source.readInt();            oldAutomatic = source.readInt() == 1;            oldProgress = source.readInt();            curBrightness = source.readInt();        }        @Override        public void writeToParcel(Parcel dest, int flags) {            super.writeToParcel(dest, flags);            dest.writeInt(automatic ? 1 : 0);            dest.writeInt(progress);            dest.writeInt(oldAutomatic ? 1 : 0);            dest.writeInt(oldProgress);            dest.writeInt(curBrightness);        }        public SavedState(Parcelable superState) {            super(superState);        }        public static final Parcelable.Creator<SavedState> CREATOR =                new Parcelable.Creator<SavedState>() {            public SavedState createFromParcel(Parcel in) {                return new SavedState(in);            }            public SavedState[] newArray(int size) {                return new SavedState[size];            }        };    }}


10 0
原创粉丝点击