我的Android进阶之旅------>自己写个Activity来调节Android系统背光亮度Brightness
今天终于算初步写好了一个调节系统背光亮度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 // doesnt 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
?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 // doesnt 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)) { // Didnt 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];
Android | 音视频方向进阶路线及资源合集 但是系统相机和系统控件VideoView的局限性都是可定制型太差,系统相机的图像分辨率,视频码率以及VideoView的进度条等.
字节卷动 You will never know how excellent you are unless you impel yourself once.
相关文章
- Android程序员面试必备的知识点,分享PDF高清版
- CentOS7下安装安装android sdk & gradle
- 【Android】线程池原理及Java简单实现
- Android获取手机Cpu温度
- Android下未root时导出已安装APK的方法
- Android动态加载——加载未安装APK中的类&加载已安装APK中的类和资源
- Android - Parcel & Parcelable
- react-native 实现条码扫描(ios&android)
- android:configChanges 屏幕横竖屏切换
- 我的Android进阶之旅------>解决Jackson等第三方转换Json的开发包在开启混淆后转换的实体类数据都是null的bug
- 我的Android进阶之旅------>解决:debug-stripped.ap_' specified for property 'resourceFile' does not exist.
- Android系统移植与调试之------->如何修改Android系统默认显示【开发者选项】并默认打开【USB调试】和【未知来源】开关
- 我的Android进阶之旅------>四种呼叫转移场景
- 我的Android进阶之旅------>android api的源代码下载地址
- 我的Android进阶之旅------>HTTP Header 详解
- Android系统移植与调试之------->安装apk时出现错误Failure [INSTALL_FAILED_DEXOPT]问题解决的方法
- Android系统移植与调试之------->如何修改Android设备添加3G上网功能
- Android系统移植与调试之------->如何修改Android设备的桌面背景图片
- Android系统移植与调试之------->如何修改Android设备的开机第二阶段Logo
- Android系统移植与调试之------->build.prop生成过程分析
- Android系统移植与调试之------->如何使用PhotoShop转换24位的bmp图片为16位bmp图片
- Android系统移植与调试之------->Amlogic方案编译步骤
- 我的Android进阶之旅------>android异步加载图片显示,并且对图片进行缓存实例
- 我的Android进阶之旅------>Android Service学习之AIDL, Parcelable和远程服务实例
- 我的Android进阶之旅------>Android通过调用Webservice实现手机号码归属地查询
- Android系统移植与调试之------->Android Sensor传感器系统架构初探
- Android系统移植与调试之------->如何修改Android启动动画和开机声音