谁 触发getstoragesyncyncautomatically

在Android源码中,提供的快捷开关相对是比较少的,Android4.0系统默认提供的桌面快捷开关AppWidget上只有5种开关(分别是开关、蓝牙开关、GPS开关、、亮度设置开关)如下图所示:
& 当然,有时候就需要开发实现承载更多的快捷开关的AppWidget来实现用户体验,所以,本文主要针对这些开关的主要代码实现来重点解决开发这些快捷开关。
& 本文涉及到的快捷开关代码实现有Wifi、蓝牙、GPS、同步、亮度设置、、移动数据流量()、静音模式、重启、关机、、屏幕旋转等。需要注意的是:实现这些开关控制时都需要在AndroidManifest.xml文件中添加相应的权限。
&&&& 一般这些开关在被设置改变时,系统会向外界发送相应的广播。所以,当用代码实现操作这些开关时,我们可以通过动态注册广播,来接收这些系统发送的状态改变广播,以此来验证我们是否正常设置改变了这些开关。
&&&& 当然,在本文以下的一些实例代码中,开关按钮也随着状态的改变而显示不同的文字,动态注册广播接收会显得有点多余,不过这只是证明系统会发送相应的广播,还应用开发还是有用处的,至少我们可以在不同的进程中监听接收这些广播。
&1. Wifi开关:
&&&&&&&&1). Wifi开关由WifiManager这个类控制实现。
&&&&&&& 2). 当Wifi开关改变时,系统会向外界发送广播android.net.wifi.WIFI_STATE_CHANGED;
&&&&&&&&示列代码如下:
package&com.example.&&
import&android.app.A&&
import&android.content.BroadcastR&&
import&android.content.C&&
import&android.content.I&&
import&android.content.IntentF&&
import&android.net.wifi.WifiM&&
import&android.os.B&&
import&android.view.V&&
import&android.view.View.OnClickL&&
import&android.widget.B&&
import&android.widget.T&&
public&class&WifiSwitchTest&extends&Activity&implements&OnClickListener&&
&&&&private&WifiManager&mWifiM&&
&&&&private&Button&mWifiB&&
&&&&public&static&final&String&WIFI_STATE_CHANGED&=&"android.net.wifi.WIFI_STATE_CHANGED";&&
&&&&private&TestChange&mTestC&&
&&&&private&IntentFilter&mIntentF&&
&&&&@Override&&
&&&&public&void&onCreate(Bundle&savedInstanceState)&&&
&&&&&&&&super.onCreate(savedInstanceState);&&
&&&&&&&&setContentView(R.layout.main);&&
&&&&&&&&mWifiManager&=&(WifiManager)&getSystemService(Context.WIFI_SERVICE);&&
&&&&&&&&mTestChange&=&new&TestChange();&&
&&&&&&&&mIntentFilter&=&new&IntentFilter();&&
&&&&&&&&mIntentFilter.addAction("android.net.wifi.WIFI_STATE_CHANGED");&&
&&&&&&&&&&
&&&&&&&&mWifiButton&=&(Button)findViewById(R.id.wifi);&&
&&&&&&&&refreshButton();&&
&&&&&&&&mWifiButton.setOnClickListener(this);&&
&&&&@Override&&
&&&&protected&void&onDestroy()&&&
&&&&&&&&super.onDestroy();&&
&&&&&&&&unregisterReceiver(mTestChange);&&
&&&&@Override&&
&&&&protected&void&onResume()&&
&&&&&&&&super.onResume();&&
&&&&&&&&registerReceiver(mTestChange,&mIntentFilter);&&
&&&&private&void&refreshButton()&&
&&&&&&&&mWifiButton.setText(mWifiManager.isWifiEnabled()&?&R.string.wifi_off&:&R.string.wifi_on);&&
&&&&@Override&&
&&&&public&void&onClick(View&v)&&
&&&&&&&&if&(mWifiManager.isWifiEnabled())&&
&&&&&&&&{&&
&&&&&&&&&&&&
&&&&&&&&&&&&mWifiManager.setWifiEnabled(false);&&
&&&&&&&&}&&
&&&&&&&&else&&
&&&&&&&&{&&
&&&&&&&&&&&&
&&&&&&&&&&&&mWifiManager.setWifiEnabled(true);&&
&&&&&&&&}&&
&&&&private&class&TestChange&extends&BroadcastReceiver&&
&&&&&&&&@Override&&
&&&&&&&&public&void&onReceive(Context&context,&Intent&intent)&&&
&&&&&&&&{&&
&&&&&&&&&&&&
&&&&&&&&&&&&String&action&=&intent.getAction();&&
&&&&&&&&&&&&if&(WIFI_STATE_CHANGED.equals(action))&&
&&&&&&&&&&&&{&&
&&&&&&&&&&&&&&&&refreshButton();&&
&&&&&&&&&&&&&&&&Toast.makeText(WifiSwitchTest.this,&"Wifi设置有改变",&&
&&&&&&&&&&&&&&&&&&&&&&&&Toast.LENGTH_SHORT).show();&&
&&&&&&&&&&&&}&&
&&&&&&&&}&&
&& &权限添加:
&&2. 蓝牙开关:
&&&&& 1). 蓝牙开关主要调用BluetoothAdapter相关方法实现
&&&&& 2). 蓝牙有四种状态:正在打开、打开、正在关闭、关闭
&&&&& 3). 蓝牙状态改变,系统向外界发送广播android.bluetooth.adapter.action.STATE_CHANGED或android.bluetooth.a2dp.profile.action.CONNECTION_STATE_CHANGED;
&&&&&&&示例代码如下:
package&com.example.&&
import&android.app.A&&
import&android.bluetooth.BluetoothA&&
import&android.content.BroadcastR&&
import&android.content.C&&
import&android.content.I&&
import&android.content.IntentF&&
import&android.os.B&&
import&android.view.V&&
import&android.view.View.OnClickL&&
import&android.widget.B&&
import&android.widget.T&&
public&class&BluetoothSwitch&extends&Activity&implements&OnClickListener&&
&&&&private&Button&mB&&
&&&&private&BluetoothAdapter&mBluetoothA&&
&&&&private&TestChange&mTestC&&
&&&&private&IntentFilter&mIntentF&&
&&&&public&static&final&String&BLUETOOTH_STATE_CHANGED&=&"android.bluetooth.adapter.action.STATE_CHANGED";&&
&&&&private&static&final&String&BLUETOOTH_ACTION&=&"android.bluetooth.a2dp.profile.action.CONNECTION_STATE_CHANGED";&&
&&&&@Override&&
&&&&public&void&onCreate(Bundle&savedInstanceState)&&&
&&&&&&&&super.onCreate(savedInstanceState);&&
&&&&&&&&setContentView(R.layout.main);&&
&&&&&&&&mBluetoothAdapter&=&BluetoothAdapter.getDefaultAdapter();&&
&&&&&&&&mTestChange&=&new&TestChange();&&
&&&&&&&&mIntentFilter&=&new&IntentFilter();&&
&&&&&&&&mIntentFilter.addAction("android.bluetooth.adapter.action.STATE_CHANGED");&&
&&&&&&&&mIntentFilter.addAction("android.bluetooth.a2dp.profile.action.CONNECTION_STATE_CHANGED");&&
&&&&&&&&&&
&&&&&&&&mBluetooth&=&(Button)findViewById(R.id.blue);&&
&&&&&&&&refreshButton();&&
&&&&&&&&mBluetooth.setOnClickListener(this);&&
&&&&&&&&&&
&&&&@Override&&
&&&&protected&void&onDestroy()&&&
&&&&&&&&super.onDestroy();&&
&&&&&&&&unregisterReceiver(mTestChange);&&
&&&&@Override&&
&&&&protected&void&onResume()&&
&&&&&&&&super.onResume();&&
&&&&&&&&registerReceiver(mTestChange,&mIntentFilter);&&
&&&&private&void&refreshButton()&&
&&&&&&&&switch&(getBluetoothStatus())&&&
&&&&&&&&{&&
&&&&&&&&case&BluetoothAdapter.STATE_ON:&&
&&&&&&&&&&&&&mBluetooth.setText(R.string.off);&&
&&&&&&&&&&&&&&
&&&&&&&&case&BluetoothAdapter.STATE_TURNING_ON:&&
&&&&&&&&&&&&mBluetooth.setText(R.string.oning);&&
&&&&&&&&&&&&&&
&&&&&&&&case&BluetoothAdapter.STATE_OFF:&&
&&&&&&&&&&&&mBluetooth.setText(R.string.on);&&
&&&&&&&&&&&&&&
&&&&&&&&case&BluetoothAdapter.STATE_TURNING_OFF:&&
&&&&&&&&&&&&mBluetooth.setText(R.string.offing);&&
&&&&&&&&&&&&&&
&&&&&&&&}&&
&&&&private&int&getBluetoothStatus()&&
&&&&&&&&return&mBluetoothAdapter.getState();&&
&&&&private&void&setBluetoothStatus()&&
&&&&&&&&switch&(getBluetoothStatus())&&&
&&&&&&&&{&&
&&&&&&&&case&BluetoothAdapter.STATE_ON:&&
&&&&&&&&&&&&&mBluetoothAdapter.disable();&&
&&&&&&&&&&&&&&
&&&&&&&&case&BluetoothAdapter.STATE_TURNING_ON:&&
&&&&&&&&&&&&mBluetoothAdapter.disable();&&
&&&&&&&&&&&&&&
&&&&&&&&case&BluetoothAdapter.STATE_OFF:&&
&&&&&&&&&&&&mBluetoothAdapter.enable();&&
&&&&&&&&&&&&&&
&&&&&&&&case&BluetoothAdapter.STATE_TURNING_OFF:&&
&&&&&&&&&&&&mBluetoothAdapter.enable();&&
&&&&&&&&&&&&&&
&&&&&&&&}&&
&&&&@Override&&
&&&&public&void&onClick(View&v)&&&
&&&&&&&&setBluetoothStatus();&&
&&&&private&class&TestChange&extends&BroadcastReceiver&&
&&&&&&&&@Override&&
&&&&&&&&public&void&onReceive(Context&context,&Intent&intent)&&&
&&&&&&&&{&&
&&&&&&&&&&&&
&&&&&&&&&&&&String&action&=&intent.getAction();&&
&&&&&&&&&&&&if&(BLUETOOTH_STATE_CHANGED.equals(action)&||&BLUETOOTH_ACTION.equals(action))&&
&&&&&&&&&&&&{&&
&&&&&&&&&&&&&&&&Toast.makeText(BluetoothSwitch.this,&"蓝牙模式设置有改变",&&
&&&&&&&&&&&&&&&&&&&&&&&&Toast.LENGTH_SHORT).show();&&
&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&refreshButton();&&
&&&&&&&&&&&&}&&
&&&&&&&&}&&
& & & 权限添加:
&&3. 屏幕旋转开关:
&&&&& 1). 屏幕旋转开关设置主要调用android.provider.Settings.System的putInt和getInt方法实现。
&&&&& 2). 通过ContentObserver来动态观察屏幕旋转设置的改变。
&&&&&&&& 示例代码如下:
package&com.example.&&
import&android.app.A&&
import&android.content.ContentR&&
import&android.content.C&&
import&android.database.ContentO&&
import&android.net.U&&
import&android.os.B&&
import&android.os.H&&
import&android.provider.S&&
import&android.provider.Settings.SettingNotFoundE&&
import&android.util.L&&
import&android.view.V&&
import&android.view.View.OnClickL&&
import&android.widget.B&&
import&android.widget.T&&
public&class&ScreenRotationSwitch&extends&Activity&implements&OnClickListener&&
&&&&private&Button&mRotationB&&
&&&&private&RotationObserver&mRotationO&&
&&&&@Override&&
&&&&public&void&onCreate(Bundle&savedInstanceState)&&
&&&&&&&&super.onCreate(savedInstanceState);&&
&&&&&&&&setContentView(R.layout.main);&&
&&&&&&&&mRotationObserver&=&new&RotationObserver(new&Handler());&&
&&&&&&&&&&
&&&&&&&&mRotationButton&=&(Button)&findViewById(R.id.rotation);&&
&&&&&&&&refreshButton();&&
&&&&&&&&mRotationButton.setOnClickListener(this);&&
&&&&@Override&&
&&&&protected&void&onDestroy()&{&&
&&&&&&&&super.onDestroy();&&
&&&&&&&&mRotationObserver.stopObserver();&&
&&&&@Override&&
&&&&protected&void&onResume()&{&&
&&&&&&&&super.onResume();&&
&&&&&&&&mRotationObserver.startObserver();&&
&&&&private&void&refreshButton()&&
&&&&&&&&if&(getRotationStatus(this)&==&1)&&
&&&&&&&&{&&
&&&&&&&&&&&&mRotationButton.setText(R.string.rotation_off);&&
&&&&&&&&}&&
&&&&&&&&else&&
&&&&&&&&{&&
&&&&&&&&&&&&mRotationButton.setText(R.string.rotation_on);&&
&&&&&&&&}&&
&&&&private&int&getRotationStatus(Context&context)&&
&&&&&&&&int&status&=&0;&&
&&&&&&&&try&&
&&&&&&&&{&&
&&&&&&&&&&&&status&=&android.provider.Settings.System.getInt(context.getContentResolver(),&&
&&&&&&&&&&&&&&&&&&&&android.provider.Settings.System.ACCELEROMETER_ROTATION);&&
&&&&&&&&}&&
&&&&&&&&catch&(SettingNotFoundException&e)&&
&&&&&&&&{&&
&&&&&&&&&&&&
&&&&&&&&&&&&e.printStackTrace();&&
&&&&&&&&}&&
&&&&&&&&return&&&
&&&&private&void&setRotationStatus(ContentResolver&resolver,&int&status)&&
&&&&&&&&Uri&uri&=&android.provider.Settings.System.getUriFor("accelerometer_rotation");&&
&&&&&&&&android.provider.Settings.System.putInt(resolver,&"accelerometer_rotation",&status);&&
&&&&&&&&resolver.notifyChange(uri,&null);&&
&&&&@Override&&
&&&&public&void&onClick(View&v)&&
&&&&&&&&if&(getRotationStatus(this)&==&1)&&
&&&&&&&&{&&
&&&&&&&&&&&
&&&&&&&&&&&&setRotationStatus(getContentResolver(),&0);&&
&&&&&&&&}&&
&&&&&&&&else&&
&&&&&&&&{&&
&&&&&&&&&&&&setRotationStatus(getContentResolver(),&1);&&
&&&&&&&&}&&
&&&&private&class&RotationObserver&extends&ContentObserver&&
&&&&&&&&ContentResolver&mR&&
&&&&&&&&&&
&&&&&&&&public&RotationObserver(Handler&handler)&&&
&&&&&&&&{&&
&&&&&&&&&&&&super(handler);&&
&&&&&&&&&&&&mResolver&=&getContentResolver();&&
&&&&&&&&&&&&
&&&&&&&&}&&
&&&&&&&&@Override&&
&&&&&&&&public&void&onChange(boolean&selfChange)&&&
&&&&&&&&{&&
&&&&&&&&&&&&
&&&&&&&&&&&&super.onChange(selfChange);&&
&&&&&&&&&&&&
&&&&&&&&&&&&refreshButton();&&
&&&&&&&&&&&&Toast.makeText(ScreenRotationSwitch.this,&"旋转屏幕设置有变化",&&
&&&&&&&&&&&&&&&&&&&&Toast.LENGTH_SHORT).show();&&
&&&&&&&&}&&
&&&&&&&&public&void&startObserver()&&
&&&&&&&&{&&
&&&&&&&&&&&&mResolver.registerContentObserver(Settings.System&&
&&&&&&&&&&&&&&&&&&&&.getUriFor(Settings.System.ACCELEROMETER_ROTATION),&false,&&
&&&&&&&&&&&&&&&&&&&&this);&&
&&&&&&&&}&&
&&&&&&&&public&void&stopObserver()&&
&&&&&&&&{&&
&&&&&&&&&&&&mResolver.unregisterContentObserver(this);&&
&&&&&&&&}&&
&&&& 权限添加:
&&4. 同步开关:
&&&& 1). 同步开关设置主要由ContentResolver类(抽象类)的静态函数来实现;
&&&& 2). 当同步模式改变时,系统会向外界发送广播com.android.sync.SYNC_CONN_STATUS_CHANGED;
&&&& 示例代码如下:
package&com.example.&&
import&android.app.A&&
import&android.content.BroadcastR&&
import&android.content.ContentR&&
import&android.content.C&&
import&android.content.I&&
import&android.content.IntentF&&
import&android.net.ConnectivityM&&
import&android.os.B&&
import&android.view.V&&
import&android.view.View.OnClickL&&
import&android.widget.B&&
import&android.widget.T&&
public&class&SyncSwitchTest&extends&Activity&implements&OnClickListener&&
&&&&private&Button&mSyncB&&
&&&&private&TestChange&mTestC&&
&&&&private&IntentFilter&mIntentF&&
&&&&private&static&final&String&SYNC_CONN_STATUS_CHANGED&=&"com.android.sync.SYNC_CONN_STATUS_CHANGED";&&
&&&&@Override&&
&&&&public&void&onCreate(Bundle&savedInstanceState)&&&
&&&&&&&&super.onCreate(savedInstanceState);&&
&&&&&&&&setContentView(R.layout.main);&&
&&&&&&&&mTestChange&=&new&TestChange();&&
&&&&&&&&mIntentFilter&=&new&IntentFilter();&&
&&&&&&&&mIntentFilter.addAction("com.android.sync.SYNC_CONN_STATUS_CHANGED");&&
&&&&&&&&&&
&&&&&&&&mSyncButton&=&(Button)findViewById(R.id.sync);&&
&&&&&&&&refreshButton();&&
&&&&&&&&&&
&&&&&&&&mSyncButton.setOnClickListener(this);&&
&&&&@Override&&
&&&&protected&void&onDestroy()&&&
&&&&&&&&super.onDestroy();&&
&&&&&&&&unregisterReceiver(mTestChange);&&
&&&&@Override&&
&&&&protected&void&onResume()&{&&
&&&&&&&&super.onResume();&&
&&&&&&&&registerReceiver(mTestChange,&mIntentFilter);&&
&&&&private&void&refreshButton()&&
&&&&&&&&mSyncButton.setText(getSyncStatus(this)&?&R.string.sync_off&:&R.string.sync_on);&&
&&&&private&boolean&getSyncStatus(Context&context)&&
&&&&&&&&ConnectivityManager&connManager&=&(ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);&&
&&&&&&&&return&connManager.getBackgroundDataSetting()&&&&ContentResolver.getMasterSyncAutomatically();&&
&&&&private&void&setSyncStatus(boolean&enbled)&&
&&&&&&&&ContentResolver.setMasterSyncAutomatically(enbled);&&
&&&&@Override&&
&&&&public&void&onClick(View&v)&&
&&&&&&&&if(getSyncStatus(this))&&
&&&&&&&&{&&
&&&&&&&&&&&&setSyncStatus(false);&&
&&&&&&&&}&&
&&&&&&&&else&&
&&&&&&&&{&&
&&&&&&&&&&&&setSyncStatus(true);&&
&&&&&&&&}&&
&&&&private&class&TestChange&extends&BroadcastReceiver&&
&&&&&&&&@Override&&
&&&&&&&&public&void&onReceive(Context&context,&Intent&intent)&&&
&&&&&&&&{&&
&&&&&&&&&&&&
&&&&&&&&&&&&String&action&=&intent.getAction();&&
&&&&&&&&&&&&&&
&&&&&&&&&&&&if&(SYNC_CONN_STATUS_CHANGED.equals(action))&&
&&&&&&&&&&&&{&&
&&&&&&&&&&&&&&&&refreshButton();&&
&&&&&&&&&&&&&&&&Toast.makeText(SyncSwitchTest.this,&"同步模式设置有改变",&Toast.LENGTH_SHORT).show();&&
&&&&&&&&&&&&}&&
&&&&&&&&}&&
&&&&&&&&&&
&&&& 权限添加:
&&5. 亮度设置开关:
& & &1). 亮度设置的主要调用Settings.System的putInt和getInt方法来处理,已经调用PowerManager的setBacklightBrightness方法来实现调节手机亮度。
& & &2).&PowerManager的setBacklightBrightness的方法是隐藏的,通过反射来调用实现。
& & &3).&通过ContentObserver来动态观察亮度设置的改变。
& & & 示例代码如下:
package&com.example.&&
import&java.lang.reflect.F&&
import&java.lang.reflect.InvocationTargetE&&
import&java.lang.reflect.M&&
import&android.app.A&&
import&android.content.ContentR&&
import&android.content.C&&
import&android.database.ContentO&&
import&android.os.B&&
import&android.os.H&&
import&android.os.PowerM&&
import&android.provider.S&&
import&android.provider.Settings.SettingNotFoundE&&
import&android.view.V&&
import&android.view.View.OnClickL&&
import&android.widget.B&&
import&android.widget.T&&
public&class&BrightnessSwitch&extends&Activity&implements&OnClickListener&&
&&&&private&Button&mB&&
&&&&private&static&final&int&LIGHT_NORMAL&=&64;&&
&&&&private&static&final&int&LIGHT_50_PERCENT&=&127;&&
&&&&private&static&final&int&LIGHT_75_PERCENT&=&191;&&
&&&&private&static&final&int&LIGHT_100_PERCENT&=&255;&&
&&&&private&static&final&int&LIGHT_AUTO&=&0;&&
&&&&private&static&final&int&LIGHT_ERR&=&-1;&&
&&&&private&BrightObserver&mBrightO&&
&&&&private&PowerManager&mPowerM&&
&&&&@Override&&
&&&&public&void&onCreate(Bundle&savedInstanceState)&&&
&&&&&&&&super.onCreate(savedInstanceState);&&
&&&&&&&&setContentView(R.layout.main);&&
&&&&&&&&mPowerManager&=&(PowerManager)getSystemService(Context.POWER_SERVICE);&&
&&&&&&&&&&
&&&&&&&&mBrightObserver&=&new&BrightObserver(new&Handler());&&
&&&&&&&&&&
&&&&&&&&mBrightness&=&(Button)findViewById(R.id.bright);&&&&&
&&&&&&&&refreshButton();&&
&&&&&&&&mBrightness.setOnClickListener(this);&&
&&&&@Override&&
&&&&protected&void&onDestroy()&&&
&&&&&&&&super.onDestroy();&&
&&&&&&&&mBrightObserver.stopObserver();&&
&&&&@Override&&
&&&&protected&void&onResume()&&&
&&&&&&&&super.onResume();&&
&&&&&&&&mBrightObserver.startObserver();&&
&&&&private&void&refreshButton()&&
&&&&&&&&switch&(getBrightStatus())&&&
&&&&&&&&{&&
&&&&&&&&case&LIGHT_NORMAL:&&
&&&&&&&&&&&&mBrightness.setText(R.string.light_50percent);&&
&&&&&&&&&&&&&&
&&&&&&&&case&LIGHT_50_PERCENT:&&
&&&&&&&&&&&&mBrightness.setText(R.string.light_75percent);&&
&&&&&&&&&&&&&&
&&&&&&&&case&LIGHT_75_PERCENT:&&
&&&&&&&&&&&&mBrightness.setText(R.string.light_100percent);&&
&&&&&&&&&&&&&&
&&&&&&&&case&LIGHT_100_PERCENT:&&
&&&&&&&&&&&&mBrightness.setText(R.string.light_auto);&&
&&&&&&&&&&&&&&
&&&&&&&&case&LIGHT_AUTO:&&
&&&&&&&&&&&&mBrightness.setText(R.string.light_normal);&&
&&&&&&&&&&&&&&
&&&&&&&&case&LIGHT_ERR:&&
&&&&&&&&&&&&mBrightness.setText(R.string.light_err);&&
&&&&&&&&&&&&&&
&&&&&&&&}&&
&&&&private&int&getBrightStatus()&&
&&&&&&&&int&light&=&0;&&
&&&&&&&&boolean&auto&=&&&
&&&&&&&&ContentResolver&cr&=&getContentResolver();&&
&&&&&&&&&&
&&&&&&&&try&&&
&&&&&&&&{&&
&&&&&&&&&&&&auto&=&Settings.System.getInt(cr,&&
&&&&&&&&&&&&&&&&&&&&Settings.System.SCREEN_BRIGHTNESS_MODE)&==&Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC;&&
&&&&&&&&&&&&if&(!auto)&&&
&&&&&&&&&&&&{&&
&&&&&&&&&&&&&&&&light&=&android.provider.Settings.System.getInt(cr,&&
&&&&&&&&&&&&&&&&&&&&&&&&Settings.System.SCREEN_BRIGHTNESS,&-1);&&
&&&&&&&&&&&&&&&&if&(light&&&0&&&&light&&=&LIGHT_NORMAL)&&&
&&&&&&&&&&&&&&&&{&&
&&&&&&&&&&&&&&&&&&&&return&LIGHT_NORMAL;&&
&&&&&&&&&&&&&&&&}&&
&&&&&&&&&&&&&&&&else&if&(light&&&LIGHT_NORMAL&&&&light&&=&LIGHT_50_PERCENT)&&&
&&&&&&&&&&&&&&&&{&&
&&&&&&&&&&&&&&&&&&&&return&LIGHT_50_PERCENT;&&
&&&&&&&&&&&&&&&&}&&&
&&&&&&&&&&&&&&&&else&if&(light&&&LIGHT_50_PERCENT&&&&light&&=&LIGHT_75_PERCENT)&&&
&&&&&&&&&&&&&&&&{&&
&&&&&&&&&&&&&&&&&&&&return&LIGHT_75_PERCENT;&&
&&&&&&&&&&&&&&&&}&&&
&&&&&&&&&&&&&&&&else&if&(light&&&LIGHT_75_PERCENT&&&&light&&=&LIGHT_100_PERCENT)&&
&&&&&&&&&&&&&&&&{&&
&&&&&&&&&&&&&&&&&&&&return&LIGHT_100_PERCENT;&&
&&&&&&&&&&&&&&&&}&&
&&&&&&&&&&&&}&&&
&&&&&&&&&&&&else&&&
&&&&&&&&&&&&{&&
&&&&&&&&&&&&&&&&return&LIGHT_AUTO;&&
&&&&&&&&&&&&}&&
&&&&&&&&}&&&
&&&&&&&&catch&(SettingNotFoundException&e1)&&&
&&&&&&&&{&&
&&&&&&&&&&&&
&&&&&&&&&&&&e1.printStackTrace();&&
&&&&&&&&}&&
&&&&&&&&return&LIGHT_ERR;&&
&&&&private&void&setBrightStatus()&&
&&&&&&&&int&light&=&0;&&
&&&&&&&&&&
&&&&&&&&switch&(getBrightStatus())&&
&&&&&&&&{&&
&&&&&&&&case&LIGHT_NORMAL:&&
&&&&&&&&&&&&light&=&LIGHT_50_PERCENT&-&1;&&
&&&&&&&&&&&&&&
&&&&&&&&case&LIGHT_50_PERCENT:&&
&&&&&&&&&&&&light&=&LIGHT_75_PERCENT&-&1;&&
&&&&&&&&&&&&&&
&&&&&&&&case&LIGHT_75_PERCENT:&&
&&&&&&&&&&&&light&=&LIGHT_100_PERCENT&-&1;&&
&&&&&&&&&&&&&&
&&&&&&&&case&LIGHT_100_PERCENT:&&
&&&&&&&&&&&&startAutoBrightness(getContentResolver());&&
&&&&&&&&&&&&&&
&&&&&&&&case&LIGHT_AUTO:&&
&&&&&&&&&&&&light&=&LIGHT_NORMAL&-&1;&&
&&&&&&&&&&&&stopAutoBrightness(getContentResolver());&&
&&&&&&&&&&&&&&
&&&&&&&&case&LIGHT_ERR:&&
&&&&&&&&&&&&light&=&LIGHT_NORMAL&-&1;&&
&&&&&&&&&&&&&&
&&&&&&&&&&
&&&&&&&&}&&
&&&&&&&&&&
&&&&&&&&setLight(light);&&
&&&&&&&&setScreenLightValue(getContentResolver(),&light);&&
&&&&private&void&setLight(int&light)&&
&&&&&&&&try&&
&&&&&&&&{&&
&&&&&&&&&&&&
&&&&&&&&&&&&Class&?&&pmClass&=&Class.forName(mPowerManager.getClass().getName());&&
&&&&&&&&&&&&
&&&&&&&&&&&&Field&field&=&pmClass.getDeclaredField("mService");&&
&&&&&&&&&&&&field.setAccessible(true);&&
&&&&&&&&&&&&
&&&&&&&&&&&&Object&iPM&=&field.get(mPowerManager);&&
&&&&&&&&&&&&
&&&&&&&&&&&&Class&?&&iPMClass&=&Class.forName(iPM.getClass().getName());&&
&&&&&&&&&&&&
&&&&&&&&&&&&Method&method&=&iPMClass.getDeclaredMethod("setBacklightBrightness",&int.class);&&
&&&&&&&&&&&&method.setAccessible(true);&&
&&&&&&&&&&&&
&&&&&&&&&&&&method.invoke(iPM,&light);&&
&&&&&&&&}&&
&&&&&&&&catch&(ClassNotFoundException&e)&&
&&&&&&&&{&&
&&&&&&&&&&&&
&&&&&&&&&&&&e.printStackTrace();&&
&&&&&&&&}&&
&&&&&&&&catch&(NoSuchFieldException&e)&&
&&&&&&&&{&&
&&&&&&&&&&&&
&&&&&&&&&&&&e.printStackTrace();&&
&&&&&&&&}&&
&&&&&&&&catch&(IllegalArgumentException&e)&&
&&&&&&&&{&&
&&&&&&&&&&&&
&&&&&&&&&&&&e.printStackTrace();&&
&&&&&&&&}&&
&&&&&&&&catch&(IllegalAccessException&e)&&
&&&&&&&&{&&
&&&&&&&&&&&&
&&&&&&&&&&&&e.printStackTrace();&&
&&&&&&&&}&&
&&&&&&&&catch&(NoSuchMethodException&e)&&
&&&&&&&&{&&
&&&&&&&&&&&&
&&&&&&&&&&&&e.printStackTrace();&&
&&&&&&&&}&&
&&&&&&&&catch&(InvocationTargetException&e)&&
&&&&&&&&{&&
&&&&&&&&&&&&
&&&&&&&&&&&&e.printStackTrace();&&
&&&&&&&&}&&
&&&&@Override&&
&&&&public&void&onClick(View&v)&&&
&&&&&&&&setBrightStatus();&&
&&&&public&void&startAutoBrightness(ContentResolver&cr)&&&
&&&&&&&&Settings.System.putInt(cr,&Settings.System.SCREEN_BRIGHTNESS_MODE,&&
&&&&&&&&&&&&&&&&Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC);&&
&&&&public&void&stopAutoBrightness(ContentResolver&cr)&&&
&&&&&&&&Settings.System.putInt(cr,&Settings.System.SCREEN_BRIGHTNESS_MODE,&&
&&&&&&&&&&&&&&&&Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL);&&
&&&&public&void&setScreenLightValue(ContentResolver&resolver,&int&value)&&
&&&&&&&&android.provider.Settings.System.putInt(resolver,&Settings.System.SCREEN_BRIGHTNESS,&&
&&&&&&&&&&&&&&&&value);&&
&&&&private&class&BrightObserver&extends&ContentObserver&&
&&&&&&&&ContentResolver&mR&&
&&&&&&&&&&
&&&&&&&&public&BrightObserver(Handler&handler)&&
&&&&&&&&{&&
&&&&&&&&&&&&super(handler);&&
&&&&&&&&&&&&mResolver&=&getContentResolver();&&
&&&&&&&&}&&
&&&&&&&&@Override&&
&&&&&&&&public&void&onChange(boolean&selfChange)&&&
&&&&&&&&{&&
&&&&&&&&&&&&
&&&&&&&&&&&&super.onChange(selfChange);&&
&&&&&&&&&&&&refreshButton();&&
&&&&&&&&&&&&Toast.makeText(BrightnessSwitch.this,&"亮度设置有改变",&Toast.LENGTH_SHORT).show();&&
&&&&&&&&}&&
&&&&&&&&&&
&&&&&&&&public&void&startObserver()&&
&&&&&&&&{&&
&&&&&&&&&&&&mResolver.registerContentObserver(Settings.System&&
&&&&&&&&&&&&&&&&&&&&.getUriFor(Settings.System.SCREEN_BRIGHTNESS),&false,&&
&&&&&&&&&&&&&&&&&&&&this);&&
&&&&&&&&&&&&mResolver.registerContentObserver(Settings.System&&
&&&&&&&&&&&&&&&&&&&&.getUriFor(Settings.System.SCREEN_BRIGHTNESS_MODE),&false,&&
&&&&&&&&&&&&&&&&&&&&this);&&
&&&&&&&&}&&
&&&&&&&&&&
&&&&&&&&public&void&stopObserver()&&
&&&&&&&&{&&
&&&&&&&&&&&&mResolver.unregisterContentObserver(this);&&
&&&&&&&&}&&
& &权限添加:
& 6. 飞行模式开关:
& & & 1). 飞行模式主要是调用Settings.System的getInt和setInt方法来处理。
& & & 2). 当飞行模式改变时,系统会向外界发送广播android.intent.action.AIRPLANE_MODE;
& & & 示例代码如下:
package&com.example.&&
import&android.app.A&&
import&android.content.BroadcastR&&
import&android.content.C&&
import&android.content.I&&
import&android.content.IntentF&&
import&android.os.B&&
import&android.provider.S&&
import&android.view.V&&
import&android.view.View.OnClickL&&
import&android.widget.B&&
import&android.widget.T&&
public&class&AirplaneModeSwitchTest&extends&Activity&implements&OnClickListener&&
&&&&private&Button&mA&&
&&&&private&static&final&String&AIRPLANE_MODE&=&"android.intent.action.AIRPLANE_MODE";&&
&&&&private&TestChange&mTestC&&
&&&&private&IntentFilter&mIntentF&&
&&&&@Override&&
&&&&public&void&onCreate(Bundle&savedInstanceState)&&&
&&&&&&&&super.onCreate(savedInstanceState);&&
&&&&&&&&setContentView(R.layout.main);&&
&&&&&&&&&&
&&&&&&&&mTestChange&=&new&TestChange();&&
&&&&&&&&mIntentFilter&=&new&IntentFilter();&&
&&&&&&&&mIntentFilter.addAction("android.intent.action.AIRPLANE_MODE");&&
&&&&&&&&&&
&&&&&&&&mAirplane&=&(Button)findViewById(R.id.airplane);&&
&&&&&&&&refreshButton();&&
&&&&&&&&&&
&&&&&&&&mAirplane.setOnClickListener(this);&&
&&&&@Override&&
&&&&protected&void&onDestroy()&&&
&&&&&&&&super.onDestroy();&&
&&&&&&&&unregisterReceiver(mTestChange);&&
&&&&@Override&&
&&&&protected&void&onResume()&&
&&&&&&&&super.onResume();&&
&&&&&&&&registerReceiver(mTestChange,&mIntentFilter);&&
&&&&private&void&refreshButton()&&
&&&&&&&mAirplane.setText(getAirplaneModeStatus()&?&R.string.airplane_off&:&R.string.airplane_on);&&
&&&&private&boolean&getAirplaneModeStatus()&&
&&&&&&&&boolean&status&=&Settings.System.getInt(this.getContentResolver(),&&
&&&&&&&&&&&&&&&&Settings.System.AIRPLANE_MODE_ON,&0)&==&1&?&true&:&&&
&&&&&&&&&&
&&&&&&&&return&&&
&&&&private&void&setAirplaneMode(Context&context,&boolean&enable)&&
&&&&&&&&Settings.System.putInt(context.getContentResolver(),&&
&&&&&&&&&&&&&&&&Settings.System.AIRPLANE_MODE_ON,&enable&?&1&:&0);&&
&&&&&&&&Intent&intent&=&new&Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED);&&
&&&&&&&&intent.putExtra("state",&enable);&&
&&&&&&&&context.sendBroadcast(intent);&&
&&&&@Override&&
&&&&public&void&onClick(View&v)&&
&&&&&&&&if&(getAirplaneModeStatus())&&
&&&&&&&&{&&
&&&&&&&&&&&&setAirplaneMode(this,&false);&&
&&&&&&&&}&&
&&&&&&&&else&&
&&&&&&&&{&&
&&&&&&&&&&&&setAirplaneMode(this,&true);&&
&&&&&&&&}&&
&&&&private&class&TestChange&extends&BroadcastReceiver&&
&&&&&&&&@Override&&
&&&&&&&&public&void&onReceive(Context&context,&Intent&intent)&&&
&&&&&&&&{&&
&&&&&&&&&&&&
&&&&&&&&&&&&String&action&=&intent.getAction();&&
&&&&&&&&&&&&if&(AIRPLANE_MODE.equals(action))&&
&&&&&&&&&&&&{&&
&&&&&&&&&&&&&&&&refreshButton();&&
&&&&&&&&&&&&&&&&Toast.makeText(AirplaneModeSwitchTest.this,&"飞行模式设置有改变",&&
&&&&&&&&&&&&&&&&&&&&&&&&Toast.LENGTH_SHORT).show();&&
&&&&&&&&&&&&}&&
&&&&&&&&}&&
&&&& 权限添加:
&&7. 移动数据流量开关:
& & & 1). 移动数据流量由ConnectivityManager类控制实现,这个类实现设置和获取移动流量状态的方法是隐藏的,所以我们只能通过反射来实现(或者在源码下编译APK)。
& & &2). 相关广播为android.intent.action.ANY_DATA_STATE;
& & 示例代码如下:
package&com.example.&&
import&java.lang.reflect.F&&
import&java.lang.reflect.InvocationTargetE&&
import&java.lang.reflect.M&&
import&android.app.A&&
import&android.content.BroadcastR&&
import&android.content.C&&
import&android.content.I&&
import&android.content.IntentF&&
import&android.net.ConnectivityM&&
import&android.os.B&&
import&android.view.V&&
import&android.view.View.OnClickL&&
import&android.widget.B&&
import&android.widget.T&&
public&class&MobileDataSwitchTest&extends&Activity&implements&OnClickListener&&
&&&&private&ConnectivityManager&mConnectivityM&&
&&&&private&Button&mMobileDataB&&
&&&&private&static&final&String&NETWORK_CHANGE&=&"android.intent.action.ANY_DATA_STATE";&&
&&&&private&TestChange&mTestC&&
&&&&private&IntentFilter&mIntentF&&
&&&&@Override&&
&&&&public&void&onCreate(Bundle&savedInstanceState)&&
&&&&&&&&super.onCreate(savedInstanceState);&&
&&&&&&&&setContentView(R.layout.main);&&
&&&&&&&&mConnectivityManager&=&(ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);&&
&&&&&&&&&&
&&&&&&&&mTestChange&=&new&TestChange();&&
&&&&&&&&mIntentFilter&=&new&IntentFilter();&&
&&&&&&&&mIntentFilter.addAction("android.intent.action.ANY_DATA_STATE");&&
&&&&&&&&mMobileDataButton&=&(Button)&findViewById(R.id.mobile_data);&&
&&&&&&&&refreshButton();&&
&&&&&&&&mMobileDataButton.setOnClickListener(this);&&
&&&&@Override&&
&&&&protected&void&onDestroy()&&&
&&&&&&&&super.onDestroy();&&
&&&&&&&&unregisterReceiver(mTestChange);&&
&&&&@Override&&
&&&&protected&void&onResume()&&
&&&&&&&&super.onResume();&&
&&&&&&&&registerReceiver(mTestChange,&mIntentFilter);&&
&&&&private&void&refreshButton()&&
&&&&&&&&mMobileDataButton.setText(getMobileDataStatus()&?&R.string.mobile_data_off&:&R.string.mobile_data_on);&&
&&&&private&boolean&getMobileDataStatus()&&
&&&&&&&&String&methodName&=&"getMobileDataEnabled";&&
&&&&&&&&Class&cmClass&=&mConnectivityManager.getClass();&&
&&&&&&&&Boolean&isOpen&=&&&
&&&&&&&&&&
&&&&&&&&try&&&
&&&&&&&&{&&
&&&&&&&&&&&&Method&method&=&cmClass.getMethod(methodName,&null);&&
&&&&&&&&&&&&isOpen&=&(Boolean)&method.invoke(mConnectivityManager,&null);&&
&&&&&&&&}&&&
&&&&&&&&catch&(Exception&e)&&&
&&&&&&&&{&&
&&&&&&&&&&&&e.printStackTrace();&&
&&&&&&&&}&&
&&&&&&&&return&isO&&
&&&&&&&&&&
&&&&private&void&setMobileDataStatus(boolean&enabled)&&&
&&&&&&&&try&&&
&&&&&&&&{&&
&&&&&&&&&&&&Class&?&&conMgrClass&=&Class.forName(mConnectivityManager.getClass().getName());&&
&&&&&&&&&&&&
&&&&&&&&&&&&Field&iConMgrField&=&conMgrClass.getDeclaredField("mService");&&
&&&&&&&&&&&&iConMgrField.setAccessible(true);&&
&&&&&&&&&&&&
&&&&&&&&&&&&Object&iConMgr&=&iConMgrField.get(mConnectivityManager);&&
&&&&&&&&&&&&
&&&&&&&&&&&&Class&?&&iConMgrClass&=&Class.forName(iConMgr.getClass().getName());&&
&&&&&&&&&&&&
&&&&&&&&&&&&Method&setMobileDataEnabledMethod&=&iConMgrClass.getDeclaredMethod(&&
&&&&&&&&&&&&&&&&&&&&"setMobileDataEnabled",&Boolean.TYPE);&&
&&&&&&&&&&&&setMobileDataEnabledMethod.setAccessible(true);&&
&&&&&&&&&&&&
&&&&&&&&&&&&setMobileDataEnabledMethod.invoke(iConMgr,&enabled);&&
&&&&&&&&}&catch&(ClassNotFoundException&e)&&&
&&&&&&&&{&&
&&&&&&&&&&&&e.printStackTrace();&&
&&&&&&&&}&catch&(NoSuchFieldException&e)&&&
&&&&&&&&{&&
&&&&&&&&&&&&e.printStackTrace();&&
&&&&&&&&}&catch&(SecurityException&e)&&&
&&&&&&&&{&&
&&&&&&&&&&&&e.printStackTrace();&&
&&&&&&&&}&catch&(NoSuchMethodException&e)&&&
&&&&&&&&{&&
&&&&&&&&&&&&e.printStackTrace();&&
&&&&&&&&}&catch&(IllegalArgumentException&e)&&&
&&&&&&&&{&&
&&&&&&&&&&&&e.printStackTrace();&&
&&&&&&&&}&catch&(IllegalAccessException&e)&&&
&&&&&&&&{&&
&&&&&&&&&&&&e.printStackTrace();&&
&&&&&&&&}&catch&(InvocationTargetException&e)&&&
&&&&&&&&{&&
&&&&&&&&&&&&e.printStackTrace();&&
&&&&&&&&}&&
&&&&@Override&&
&&&&public&void&onClick(View&v)&&&
&&&&&&&&if&(getMobileDataStatus())&&
&&&&&&&&{&&
&&&&&&&&&&&&setMobileDataStatus(false);&&
&&&&&&&&&&&&mMobileDataButton.setText(R.string.mobile_data_on);&&
&&&&&&&&}&&
&&&&&&&&else&&
&&&&&&&&{&&
&&&&&&&&&&&&setMobileDataStatus(true);&&
&&&&&&&&&&&&mMobileDataButton.setText(R.string.mobile_data_off);&&
&&&&&&&&}&&
&&&&private&class&TestChange&extends&BroadcastReceiver&&
&&&&&&&&@Override&&
&&&&&&&&public&void&onReceive(Context&context,&Intent&intent)&&&
&&&&&&&&{&&
&&&&&&&&&&&&
&&&&&&&&&&&&String&action&=&intent.getAction();&&
&&&&&&&&&&&&if&(NETWORK_CHANGE.equals(action))&&
&&&&&&&&&&&&{&&
&&&&&&&&&&&&&&&&Toast.makeText(MobileDataSwitchTest.this,&"移动数据设置有改变",&&
&&&&&&&&&&&&&&&&&&&&&&&&Toast.LENGTH_SHORT).show();&&
&&&&&&&&&&&&}&&
&&&&&&&&}&&
& & 权限添加:
& 8. 静音模式开关:
& & & 1). 静音模式由AudioManager控制实现,有三种状态:正常(有声音)、震动、静音
& & & 2).&当模式改变时,系统会向外界发送广播android.media.RINGER_MODE_CHANGED;
& & & 示例代码如下:
package&com.example.&&
import&android.app.A&&
import&android.content.BroadcastR&&
import&android.content.C&&
import&android.content.I&&
import&android.content.IntentF&&
import&android.media.AudioM&&
import&android.os.B&&
import&android.view.V&&
import&android.view.View.OnClickL&&
import&android.widget.B&&
import&android.widget.T&&
public&class&SilentSwitchTes&extends&Activity&implements&OnClickListener&&
&&&&private&AudioManager&mAudioM&&
&&&&private&Button&mSilentB&&
&&&&private&TestChange&mTestC&&
&&&&private&IntentFilter&mIntentF&&
&&&&public&static&final&String&RINGER_MODE_CHANGED&=&"android.media.RINGER_MODE_CHANGED";&&
&&&&@Override&&
&&&&public&void&onCreate(Bundle&savedInstanceState)&&&
&&&&&&&&super.onCreate(savedInstanceState);&&
&&&&&&&&setContentView(R.layout.main);&&
&&&&&&&&&&
&&&&&&&&mAudioManager&=&(AudioManager)&getSystemService(Context.AUDIO_SERVICE);&&
&&&&&&&&mTestChange&=&new&TestChange();&&
&&&&&&&&mIntentFilter&=&new&IntentFilter();&&
&&&&&&&&mIntentFilter.addAction("android.media.RINGER_MODE_CHANGED");&&
&&&&&&&&&&
&&&&&&&&mSilentButton&=&(Button)findViewById(R.id.silent);&&
&&&&&&&&refreshButton();&&
&&&&&&&&mSilentButton.setOnClickListener(this);&&
&&&&@Override&&
&&&&protected&void&onDestroy()&&&
&&&&&&&&super.onDestroy();&&
&&&&&&&&unregisterReceiver(mTestChange);&&
&&&&@Override&&
&&&&protected&void&onResume()&{&&
&&&&&&&&super.onResume();&&
&&&&&&&&registerReceiver(mTestChange,&mIntentFilter);&&
&&&&private&void&refreshButton()&&
&&&&&&&&switch&(getSilentStatus())&&
&&&&&&&&{&&
&&&&&&&&case&AudioManager.RINGER_MODE_SILENT:&&
&&&&&&&&&&&&mSilentButton.setText(R.string.mode_vibrate);&&
&&&&&&&&&&&&&&
&&&&&&&&case&AudioManager.RINGER_MODE_NORMAL:&&
&&&&&&&&&&&&mSilentButton.setText(R.string.mode_silent);&&
&&&&&&&&&&&&&&&&&&&&
&&&&&&&&case&AudioManager.RINGER_MODE_VIBRATE:&&
&&&&&&&&&&&&mSilentButton.setText(R.string.mode_normal);&&
&&&&&&&&&&&&&&
&&&&&&&&}&&
&&&&private&int&getSilentStatus()&&
&&&&&&&&return&mAudioManager.getRingerMode();&&
&&&&private&void&setSilentMode()&&
&&&&&&&&switch&(getSilentStatus())&&
&&&&&&&&{&&
&&&&&&&&case&AudioManager.RINGER_MODE_SILENT:&&
&&&&&&&&&&&&mAudioManager.setRingerMode(AudioManager.RINGER_MODE_VIBRATE);&&
&&&&&&&&&&&&&&
&&&&&&&&case&AudioManager.RINGER_MODE_NORMAL:&&
&&&&&&&&&&&&mAudioManager.setRingerMode(AudioManager.RINGER_MODE_SILENT);&&
&&&&&&&&&&&&&&&&&&&&
&&&&&&&&case&AudioManager.RINGER_MODE_VIBRATE:&&
&&&&&&&&&&&&mAudioManager.setRingerMode(AudioManager.RINGER_MODE_NORMAL);&&
&&&&&&&&&&&&&&
&&&&&&&&}&&
&&&&@Override&&
&&&&public&void&onClick(View&v)&&
&&&&&&&&setSilentMode();&&
&&&&private&class&TestChange&extends&BroadcastReceiver&&
&&&&&&&&@Override&&
&&&&&&&&public&void&onReceive(Context&context,&Intent&intent)&&&
&&&&&&&&{&&
&&&&&&&&&&&&
&&&&&&&&&&&&String&action&=&intent.getAction();&&
&&&&&&&&&&&&&&
&&&&&&&&&&&&if&(RINGER_MODE_CHANGED.equals(action))&&
&&&&&&&&&&&&{&&
&&&&&&&&&&&&&&&&refreshButton();&&
&&&&&&&&&&&&&&&&Toast.makeText(SilentSwitchTes.this,&"静音模式设置有改变",&Toast.LENGTH_SHORT).show();&&
&&&&&&&&&&&&}&&
&&&&&&&&}&&
&&&&&&&&&&
&静音模式开关设置不需要添加权限。
&-----以下的开关设置实现需要有系统的UID使用Platform的apk签名,否则是没有权限调用的,会报SecurityException异常-----&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&注:1). 可以不通过apk签名,直接在android源码下编译生成apk,再将apk安装到手机;
&&&&&&&&&&&&&&&&&&&&&&&&& 2). 如果手机有root权限,那么也不需要apk签名,直接通过adb工具将apk推到system/app目录下:操作指令为adb remount----&adb push xxx.apk system/app (注:该apk将做为系统应用)
&&&9. GPS开关:
&&&&&& 1). GPS开关设置的实现由Secure类的相关静态方法实现。
&&&&&& 2).Secure的isLocationProviderEnabled和setLocationProviderEnabled调用需要APK签名;
&&&&& 示例代码如下:
package&com.example.&&
import&android.app.A&&
import&android.content.C&&
import&android.location.LocationM&&
import&android.os.B&&
import&android.provider.Settings.S&&
import&android.view.V&&
import&android.view.View.OnClickL&&
import&android.widget.B&&
public&class&GpsSwitchTest&extends&Activity&implements&OnClickListener&&
&&&&private&Button&mGpsB&&
&&&&@Override&&
&&&&public&void&onCreate(Bundle&savedInstanceState)&&&
&&&&&&&&super.onCreate(savedInstanceState);&&
&&&&&&&&setContentView(R.layout.main);&&
&&&&&&&&mGpsButton&=&(Button)findViewById(R.id.gps);&&
&&&&&&&&refreshButton();&&
&&&&&&&&mGpsButton.setOnClickListener(this);&&
&&&&private&void&refreshButton()&&
&&&&&&&&mGpsButton.setText(getGpsStatus(this)&?&R.string.gps_off&:&R.string.gps_on);&&
&&&&private&boolean&getGpsStatus(Context&context)&&
&&&&&&&&boolean&status&=&Secure.isLocationProviderEnabled(context.getContentResolver(),&&&
&&&&&&&&&&&&&&&&LocationManager.GPS_PROVIDER);&&
&&&&&&&&return&&&
&&&&private&void&setGpsStatus(Context&context,&boolean&enabled)&&
&&&&&&&&Secure.setLocationProviderEnabled(context.getContentResolver(),&&
&&&&&&&&&&&&&&&&LocationManager.GPS_PROVIDER,&enabled);&&
&&&&@Override&&
&&&&public&void&onClick(View&v)&&
&&&&&&&&if&(getGpsStatus(this))&&
&&&&&&&&{&&
&&&&&&&&&&&&setGpsStatus(this,&false);&&
&&&&&&&&&&&&mGpsButton.setText(R.string.gps_on);&&
&&&&&&&&}&&
&&&&&&&&else&&
&&&&&&&&{&&
&&&&&&&&&&&&setGpsStatus(this,&true);&&
&&&&&&&&&&&&mGpsButton.setText(R.string.gps_off);&&
&&&&&&&&}&&
&&&&&& 权限添加:
& 10. 锁屏:
&&&&&&&&1). 手机进入锁屏主要由PowerManager的goToSleep函数实现。
&&&&&&&&2). PowerManager的goToSleep调用需要apk签名。
&&&&&& 示例代码:
package&com.example.&&
import&android.app.A&&
import&android.content.C&&
import&android.os.B&&
import&android.os.PowerM&&
import&android.os.SystemC&&
import&android.view.V&&
import&android.view.View.OnClickL&&
import&android.widget.B&&
public&class&LockScreenSwitchTest&extends&Activity&implements&OnClickListener&&
&&&&private&PowerManager&mPowerM&&
&&&&private&Button&mLockB&&
&&&&@Override&&
&&&&public&void&onCreate(Bundle&savedInstanceState)&&&
&&&&&&&&super.onCreate(savedInstanceState);&&
&&&&&&&&setContentView(R.layout.main);&&
&&&&&&&&mPowerManager&=&(PowerManager)&getSystemService(Context.POWER_SERVICE);&&
&&&&&&&&mLockButton&=&(Button)findViewById(R.id.lock);&&
&&&&&&&&mLockButton.setOnClickListener(this);&&
&&&&private&void&lockScreen()&&
&&&&&&&&mPowerManager.goToSleep(SystemClock.uptimeMillis());&&
&&&&@Override&&
&&&&public&void&onClick(View&v)&&&
&&&&&&&&lockScreen();&&
&&&&&& 权限添加:
& 11. 重启:
&&&&& 1). 手机重启需要调用PowerManager的reboot方法实现,参数为null;
&&&&& 2). 该方法的调用,需要有系统的UID使用Platform的APK签名,否则是没有权限调用的,会报SecurityException异常。
&&&&&&&&& 示例代码如下:
package&com.example.&&
import&android.app.A&&
import&android.content.C&&
import&android.os.B&&
import&android.os.PowerM&&
import&android.view.V&&
import&android.view.View.OnClickL&&
import&android.widget.B&&
public&class&RebootSwitch&extends&Activity&implements&OnClickListener&&
&&&&private&Button&mRebootB&&
&&&&private&PowerManager&mPowerM&&
&&&&@Override&&
&&&&public&void&onCreate(Bundle&savedInstanceState)&&&
&&&&&&&&super.onCreate(savedInstanceState);&&
&&&&&&&&setContentView(R.layout.main);&&
&&&&&&&&mPowerManager&=&(PowerManager)getSystemService(Context.POWER_SERVICE);&&&&
&&&&&&&&mRebootButton&=&(Button)findViewById(R.id.reboot);&&
&&&&&&&&mRebootButton.setOnClickListener(this);&&
&&&&private&void&reboot(String&reason)&&
&&&&&&&&mPowerManager.reboot(null);&&
&&&&@Override&&
&&&&public&void&onClick(View&v)&&
&&&&&&&&reboot(null);&&
&&&& 权限添加:
&&12. 关机:
& & &&1). 手机关机直接通过创建相关的Intent来启动一个对话框,根据对话框的确认或取消键来选择是否关机
& & & 2). 关机实现需要apk签名。&
& & & 示例代码如下:
package&com.example.&&
import&android.app.A&&
import&android.content.I&&
import&android.os.B&&
import&android.view.V&&
import&android.view.View.OnClickL&&
import&android.widget.B&&
public&class&ShutDownSwitch&extends&Activity&implements&OnClickListener&&
&&&&private&Button&mShutD&&
&&&&@Override&&
&&&&public&void&onCreate(Bundle&savedInstanceState)&&&
&&&&&&&&super.onCreate(savedInstanceState);&&
&&&&&&&&setContentView(R.layout.main);&&
&&&&&&&&&&
&&&&&&&&mShutDown&=&(Button)findViewById(R.id.shutdown);&&
&&&&&&&&mShutDown.setOnClickListener(this);&&
&&&&&&&&&&
&&&&@Override&&
&&&&public&void&onClick(View&v)&&
&&&&&&&&Intent&intent&=&new&Intent("android.intent.action.ACTION_REQUEST_SHUTDOWN");&&
&&&&&&&&intent.putExtra("android.intent.extra.KEY_CONFIRM",&true);&&
&&&&&&&&intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);&&
&&&&&&&&startActivity(intent);&&
& & 权限添加:
& & ok,本文的快捷开关代码实现介绍就到此结束,有了上面这些快捷开关的实现代码,那么当你想要开发一个AppWidget来承载和实现这些开关时就容易多了,至于如何去开发一个AppWidget,有兴趣的读者可以去找找相关这些方面的资料。
& & &相关代码下载链接:
阅读(...) 评论()

我要回帖

更多关于 pm runtime get sync 的文章

 

随机推荐