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

<?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];
}
};
}
}

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

  1. 我的Android进阶之旅------&gt;怎样将Activity变为半透明的对话框?

    我的Android进阶之旅------>怎样将Activity变为半透明的对话框?能够从两个方面来考虑:对话框和半透明. 在定义Activity时指定Theme.Dialog主题就能够将Acti ...

  2. 我的Android进阶之旅------&gt; Android在TextView中显示图片方法

    面试题:请说出Android SDK支持哪些方式显示富文本信息(不同颜色.大小.并包括图像的文本信息).并简要说明实现方法. 答案:Android SDK支持例如以下显示富文本信息的方式. 1.使用T ...

  3. 我的Android进阶之旅------&gt;Android字符串资源中的单引號问题error: Apostrophe not preceded by 的解决的方法

    刚刚在string字符串资源文件里,写了一个单引號.报错了,错误代码例如以下 error: Apostrophe not preceded by \ (in OuyangPeng's blog ) 资 ...

  4. 我的Android进阶之旅------>如何解决Android 5.0中出现的警告: Service Intent must be explicit:

    我的Android进阶之旅-->如何解决Android 5.0中出现的警告: java.lang.IllegalArgumentException: Service Intent must be ...

  5. 我的Android进阶之旅------>Android字符串资源中的单引号问题error: Apostrophe not preceded by 的解决办法

    刚刚在string字符串资源文件中,写了一个单引号,报错了,错误代码如下 error: Apostrophe not preceded by \ (in OuyangPeng's blog ) 资源文 ...

  6. 我的Android进阶之旅------> Android在TextView中显示图片方法

    面试题:请说出Android SDK支持哪些方式显示富文本信息(不同颜色.大小.并包含图像的文本信息),并简要说明实现方法. 答案:Android SDK支持如下显示富文本信息的方式. 1.使用Tex ...

  7. 我的Android进阶之旅------>关于调用Webservice查询火车票时刻表的几个接口介绍

    今天发现一个可以提供火车票时刻表查询的WebService,先记录下来以后如果写一个火车票时刻表查询的Android App的话就用的着.首先该WebService的的名字是TrainTimeWebS ...

  8. 我的Android进阶之旅------&gt;怎样解决Android 5.0中出现的警告: Service Intent must be explicit:

    我的Android进阶之旅-->怎样解决Android 5.0中出现的警告: java.lang.IllegalArgumentException: Service Intent must be ...

  9. [置顶] 我的Android进阶之旅------>介绍一款集录制与剪辑为一体的屏幕GIF 动画制作工具 GifCam

    由于上一篇文章:我的Android进阶之旅------>Android之动画之Frame Animation实例 中展示的是Frame动画效果,但是之前我是将图片截取下来,不好说明确切的动画过程 ...

随机推荐

  1. (持续集成)win7上部署Jenkins+MSBuild+Svn+SonarQube+SonarQube Scanner for MSBuild (一)

    一.Jenkins介绍 jenkins是一个广泛用于持续构建的可视化web工具,持续构建说得更直白点,就是各种项目的”自动化”编译.打包.分发部署.jenkins可以很好的支持各种语言(比如:java ...

  2. Putty完全使用方法

    http://www.putty.ws/Putty-wanquanshiyong putty中文站

  3. Mac OS X上使用Wireshark抓包

    Wireshark针对UNIX Like系统的GUI发行版界面采用的是X Window(1987年更改X版本到X11).Mac OS X在Mountain Lion之后放弃X11,取而代之的是开源的X ...

  4. HTML小技巧将table边框改为细线

    HTML制作新手在用TABLE表格时,会碰到如何改变边线粗线,因为默认的TABLE边线设置即使是1px 是很粗的.因此会使用其他一些方法来制作出细线边框,这里介绍一种利用CSS来实现细线的方法,很有效 ...

  5. 2016.6.20 eclipse中maven的配置

    前期准备: 安装maven,配置maven的环境变量,并且通过mvn -v验证安装成功.   网上的教程说,需要在线或者离线安装maven integration for eclipse插件. 但是我 ...

  6. mongodb副本集的基础概念和各种机制

         从一开始我们就在讲如何使用一台服务器.一个mongod服务器进程,如果只用做学习和开发,这是可以的,但如果在生产环境中,这是很危险的,如果服务器崩溃了怎么办?数据库至少要一段时间不可用,如果 ...

  7. 微信小程序-获取用户信息(getUserInfo)

    当小程序抹杀掉这个接口的时候,多少人心凉了.. 作为一个初级web前端开发,我是更加懵逼,小程序员跑路了... 当时以及现在用的办法就是: 1.增加一个登陆或授权页 2.上线以后自动获取 3.增加一个 ...

  8. 调用聚合数据新闻头条API

    基于聚合数据新闻头条接口 支持阅读新闻类型包括: 各类社会.国内.国际.体育.娱乐.科技等资讯,更新周期5-30分钟. 新闻内容类型的多选,支持皮肤功能. 使用前需要有聚合数据账号,并实名制后通过 新 ...

  9. appium在MAC上环境搭建

    1. 安装.启动Appium bixiaopeng@bixiaopeng ~$ npm install -g appium Password: npm http GET https://registr ...

  10. python 和 mysql连接

    python 和 mysql连接 虫师教程:http://www.cnblogs.com/fnng/p/3565912.html 其他教程pymysql:http://www.cnblogs.com/ ...