最近項目需要一個一鍵獲取系統狀態的功能,這裏我寫了一個demon簡單的介紹一下如何獲取系統的電量、手機的網絡狀況(包括2G、3G、4G)、藍牙的開關情況等共功能。具體的各個代碼的功能我就不詳細的講解ovo。。 因爲大部分我都做了註釋。好了我就不廢話了直接上代碼:
首先就是大家關注的實現部分:
</pre><pre name="code" class="html">public class MainActivity extends Activity implements View.OnClickListener {
private WifiManager mWifiManager;
private LocationManager mLocationManager;
//判斷gps的狀態
private boolean isGpsOpen;
private boolean isBatteryOpen;
private boolean isGsmOpen;
private Button bt_gps, bt_battery, bt_conn, bt_gsm, bt_bluetooth;
private BatteryReceiver batteryReceiver;
private IntentFilter intentFilter;
private BluetoothAdapter mBluetoothAdapter;
private TelephonyManager Tel;
private MyPhoneStateListener MyListener;
private ConnectionChangeReceiver myReceiver;
private boolean isConnect;
public static final String SIGNAL_STRENGTH_NONE_OR_UNKNOWN = "無信號";
public static final String SIGNAL_STRENGTH_POOR = "信號差";
public static final String SIGNAL_STRENGTH_MODERATE = "中等的";
public static final String SIGNAL_STRENGTH_GOOD = "信號比較好";
public static final String SIGNAL_STRENGTH_GREAT = "信號非常好";
/**
* Network type is unknown
*/
public static final int NETWORK_TYPE_UNKNOWN = 0;
/**
* Current network is GPRS
*/
public static final int NETWORK_TYPE_GPRS = 1;
/**
* Current network is EDGE
*/
public static final int NETWORK_TYPE_EDGE = 2;
/**
* Current network is UMTS
*/
public static final int NETWORK_TYPE_UMTS = 3;
/**
* Current network is CDMA: Either IS95A or IS95B
*/
public static final int NETWORK_TYPE_CDMA = 4;
/**
* Current network is EVDO revision 0
*/
public static final int NETWORK_TYPE_EVDO_0 = 5;
/**
* Current network is EVDO revision A
*/
public static final int NETWORK_TYPE_EVDO_A = 6;
/**
* Current network is 1xRTT
*/
public static final int NETWORK_TYPE_1xRTT = 7;
/**
* Current network is HSDPA
*/
public static final int NETWORK_TYPE_HSDPA = 8;
/**
* Current network is HSUPA
*/
public static final int NETWORK_TYPE_HSUPA = 9;
/**
* Current network is HSPA
*/
public static final int NETWORK_TYPE_HSPA = 10;
/**
* Current network is iDen
*/
public static final int NETWORK_TYPE_IDEN = 11;
/**
* Current network is EVDO revision B
*/
public static final int NETWORK_TYPE_EVDO_B = 12;
/**
* Current network is LTE
*/
public static final int NETWORK_TYPE_LTE = 13;
/**
* Current network is eHRPD
*/
public static final int NETWORK_TYPE_EHRPD = 14;
/**
* Current network is HSPA+
*/
public static final int NETWORK_TYPE_HSPAP = 15;
/**
* Current network is GSM
*/
public static final int NETWORK_TYPE_GSM = 16;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
init();
initEvent();
}
/**
* 初始化對象
*/
private void init() {
bt_gps = (Button) findViewById(R.id.bt_gps);
bt_battery = (Button) findViewById(R.id.bt_battery);
bt_conn = (Button) findViewById(R.id.bt_conn);
bt_gsm = (Button) findViewById(R.id.bt_gsm);
bt_bluetooth = (Button) findViewById(R.id.bt_bluetooth);
batteryReceiver = new BatteryReceiver();
//註冊廣播接受者監聽系統電池變化
intentFilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
mLocationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
/* Update the listener, and start it */
MyListener = new MyPhoneStateListener();
Tel = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
mWifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
}
/**
* 初始化事件
*/
private void initEvent() {
bt_gps.setOnClickListener(this);
bt_battery.setOnClickListener(this);
bt_conn.setOnClickListener(this);
bt_gsm.setOnClickListener(this);
bt_bluetooth.setOnClickListener(this);
registerReceiver();
}
/**
* Called when a view has been clicked.
*
* @param v The view that was clicked.
*/
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.bt_battery:
batteryState();
break;
case R.id.bt_conn:
Toast.makeText(this, netWorkState(), Toast.LENGTH_LONG).show();
break;
case R.id.bt_gps:
Toast.makeText(this, gpsState(), Toast.LENGTH_LONG).show();
break;
case R.id.bt_gsm:
isGsmOpen = true;
Tel.listen(MyListener, PhoneStateListener.LISTEN_SIGNAL_STRENGTHS);
break;
case R.id.bt_bluetooth:
Toast.makeText(this, blueToothState(), Toast.LENGTH_LONG).show();
break;
}
}
/**
* 註冊廣播得到系統電量的值
*/
private void batteryState() {
isBatteryOpen = true;
//註冊receiver
registerReceiver(batteryReceiver, intentFilter);
}
/**
* 返回gps的狀態
*/
private String gpsState() {
String gpsState = "gps已關閉";
if (mLocationManager != null) {
isGpsOpen = mLocationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
if (isGpsOpen) {
gpsState = "gps已打開";
} else {
gpsState = "gps已關閉";
}
}
return gpsState;
}
/**
* @return 返回wife連接狀態
*/
private boolean isWifiOpen() {
boolean isWifiOpen = mWifiManager.isWifiEnabled();
return isWifiOpen;
}
/**
* 判斷網絡狀況
*
* @return
*/
private String netWorkState() {
String netWorkState = "未知網絡";
if (!isConnect) {
return netWorkState = "當前無網絡";
} else if (isWifiOpen()) {
return netWorkState = "無線網絡已打開";
} else {
switch (Tel.getNetworkType()) {
case NETWORK_TYPE_GPRS:
case NETWORK_TYPE_GSM:
case NETWORK_TYPE_EDGE:
case NETWORK_TYPE_CDMA:
case NETWORK_TYPE_1xRTT:
case NETWORK_TYPE_IDEN:
return netWorkState = "當前2g網絡";
case NETWORK_TYPE_UMTS:
case NETWORK_TYPE_EVDO_0:
case NETWORK_TYPE_EVDO_A:
case NETWORK_TYPE_HSDPA:
case NETWORK_TYPE_HSUPA:
case NETWORK_TYPE_HSPA:
case NETWORK_TYPE_EVDO_B:
case NETWORK_TYPE_EHRPD:
case NETWORK_TYPE_HSPAP:
return netWorkState = "當前3g網絡";
case NETWORK_TYPE_LTE:
return netWorkState = "當前4g網絡";
default:
return netWorkState;
}
}
}
/**
* 判斷藍牙服務
*
* @return
*/
private String blueToothState() {
String blueToothState = "藍牙已關閉";
if (mBluetoothAdapter != null) {
boolean isBlueOpen = mBluetoothAdapter.isEnabled();
if (isBlueOpen) {
blueToothState = "藍牙已打開";
} else {
blueToothState = "藍牙已關閉";
}
}
return blueToothState;
}
/**
* 廣播監聽電量變化
*/
class BatteryReceiver extends BroadcastReceiver {
//判斷它是否是爲電量變化的Broadcast Action
@Override
public void onReceive(Context context, Intent intent) {
if (Intent.ACTION_BATTERY_CHANGED.equals(intent.getAction()) && isBatteryOpen) {
//獲取當前電量
int level = intent.getIntExtra("level", 0);
//電量的總刻度
int scale = intent.getIntExtra("scale", 100);
//把它轉成百分比
Toast.makeText(context, "電池電量爲" + ((level * 100) / scale) + "%", Toast.LENGTH_LONG).show();
isBatteryOpen = false;
}
}
}
/* 開始PhoneState聽衆 */
private class MyPhoneStateListener extends PhoneStateListener {
/* 從得到的信號強度,每個tiome供應商有更新 */
@Override
public void onSignalStrengthsChanged(SignalStrength signalStrength) {
super.onSignalStrengthsChanged(signalStrength);
String level;
if (isGsmOpen) {
int asu = signalStrength.getGsmSignalStrength();
if (asu <= 2 || asu == 99) level = SIGNAL_STRENGTH_NONE_OR_UNKNOWN;
else if (asu >= 12) level = SIGNAL_STRENGTH_GREAT;
else if (asu >= 8) level = SIGNAL_STRENGTH_GOOD;
else if (asu >= 5) level = SIGNAL_STRENGTH_MODERATE;
else level = SIGNAL_STRENGTH_POOR;
Toast.makeText(getApplicationContext(),
"當前"
+ level,
Toast.LENGTH_SHORT).show();
}
isGsmOpen = false;
}
}
;
/**
* 廣播監聽網絡變化
*/
public class ConnectionChangeReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo mobNetInfo = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
NetworkInfo wifiNetInfo = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
if (!mobNetInfo.isConnected() && !wifiNetInfo.isConnected()) {
isConnect = false;
} else {
isConnect = true;
}
}
}
/**
* 註冊廣播
*/
private void registerReceiver() {
IntentFilter filter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
myReceiver = new ConnectionChangeReceiver();
this.registerReceiver(myReceiver, filter);
}
/**
* 註銷廣播
*/
private void unregisterReceiver() {
this.unregisterReceiver(myReceiver);
}
/**
* 註銷廣播
*/
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver();
}
}
接下來我發下權限的部分:
<pre name="code" class="java"><?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.com.keyfuncation" >
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" ></uses-permission>
<uses-permission android:name="android.permission.BLUETOOTH" ></uses-permission>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
接下來順便說下我這裏有一個bug就是當你是雙卡的時候 手機的信號強度是99的也就是說是一個無法識別的狀態,也就是說你其實手機兩張卡都有信號但是顯示的是無信號。懂的也可以教下我如何區分單卡還是雙卡一類的知識,google是不提供這方面的接口的。
最後發一下效果圖:
哈哈~界面有點醜希望大家見諒。