zl程序教程

您现在的位置是:首页 >  移动开发

当前栏目

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

Androidamp系统 自己 之旅 进阶 gt Activity
2023-09-27 14:29:23 时间
            今天终于算初步写好了一个调节系统背光亮度Brightness的代码,本来不看Android源代码以为可以直接调用某个Action来启动系统的那个调节Brightness的对话框,但是看了代码后发现系统调节Brightness的自定义组件BrightnessPreference继承了SeekBarDialogPreference,但是最终父类还是Preference,因此不能够单独启动,必须得将这个自定义的BrightnessPreference用某个Activity才能加载过来,毕竟最终还是一个组件。

     

      今天终于算初步写好了一个调节系统背光亮度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.