android 全面獲取系統狀態

最近項目需要一個一鍵獲取系統狀態的功能,這裏我寫了一個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是不提供這方面的接口的。

最後發一下效果圖:


哈哈~界面有點醜希望大家見諒。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章