博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
我的Android进阶之旅------>自己写个Activity来调节Android系统背光亮度Brightness
阅读量:5875 次
发布时间:2019-06-19

本文共 21598 字,大约阅读时间需要 71 分钟。

     

      今天终于算初步写好了一个调节系统背光亮度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 implements		SeekBar.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 stuck	private 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;	@Override	protected 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() {						@Override						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);						}					});			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()) {		@Override		public void onChange(boolean selfChange) {			mCurBrightness = -1;			onBrightnessChanged();		}	};	private ContentObserver mBrightnessModeObserver = new ContentObserver(			new Handler()) {		@Override		public 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);	}	@Override	public void onProgressChanged(SeekBar seekBar, int progress,			boolean fromUser) {		setBrightness(progress, false);	}	@Override	public void onStartTrackingTouch(SeekBar seekBar) {	}	@Override	public 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;	}	@Override	public 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

注册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;    }

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

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

  转载请保留原文地址

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

最后附上系统调节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
CREATOR = new Parcelable.Creator
() { public SavedState createFromParcel(Parcel in) { return new SavedState(in); } public SavedState[] newArray(int size) { return new SavedState[size]; } }; }}

转载于:https://www.cnblogs.com/ouyangpeng/p/8538132.html

你可能感兴趣的文章
学习嵌入式—导火线
查看>>
hdu 1217 Arbitrage (最小生成树)
查看>>
Bash Shell字符串操作小结
查看>>
sourceinsight技巧
查看>>
ASP.NET 解决URL中文乱码的解决
查看>>
el表达式跟ognl表达式的区别(用法和页面取值) 转
查看>>
解决java获取系统时间差8个小时 专题
查看>>
c#删除list中的元素
查看>>
Ubuntu 12.10安装QQ2012
查看>>
Ubuntu 13.04有线连接异常
查看>>
loj 1036(dp)
查看>>
javascript语法
查看>>
最遥远的距离
查看>>
Android Nine-patch(.9.png)小结
查看>>
C#实现大数据量TXT文本数据快速高效去重
查看>>
动态链接库(dll) __declspec(dllimport) __declspec(dllexport)
查看>>
Bootstrap3.0学习第二轮(栅格系统原理)
查看>>
Oracle Form属性、内置子程序、触发器、系统变量简要
查看>>
标准C++中的string类的用法总结
查看>>
.Net 4.5 异步编程初试(async和await)
查看>>