原创首发    
 Android开发获取电量,充电状态,是否有sim卡,sim卡信号强度,网络数据类型,wifi开关,蓝牙开关

Android开发获取电量,充电状态,是否有sim卡,sim卡信号强度,网络数据类型,wifi开关,蓝牙开关。
获取电量,充电状态
广播监听
 private final BroadcastReceiver batteryLevReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent batteryStatus) {
            int level = batteryStatus.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
            int scale = batteryStatus.getIntExtra(BatteryManager.EXTRA_SCALE, -1);
            float batteryPct = level * 100 / (float) scale;
	   //电量
            batteryLev.postValue((int) batteryPct);
            // Are we charging / charged?
            int status = batteryStatus.getIntExtra(BatteryManager.EXTRA_STATUS, -1);
            boolean isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING ||
                    status == BatteryManager.BATTERY_STATUS_FULL;
		//是否在插着
            isChargingValue.postValue(isCharging);
        }
    };
注册电量的广播监听
 IntentFilter batteryFilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
        mContext.registerReceiver(batteryLevReceiver, batteryFilter);
是否有sim卡/sim卡状态
    private boolean querySimCardState() {
        if (mTelephony == null) {
            return false;
        }
        int simState = mTelephony.getSimState();
        if (simState == mOldSimCardState && simState == TelephonyManager.SIM_STATE_READY) {
            //如果状态的原来一样,直接返回true即可,表示有sim卡。
            return true;
        }
        boolean flag;
        mOldSimCardState = simState;
        switch (simState) {
            case TelephonyManager.SIM_STATE_READY:
                //sim卡准备好了
                flag = true;
                break;//sim卡网络查找中
            default:
                //sim卡没有/准备好
                flag = false;
                break;
        }
        hasSimCardValue.postValue(flag);
        return flag;
    }
sim卡信号强度
主动获取的
public void getSignalStrength() {
        if (mTelephony == null) {
            return;
        }
        List<CellInfo> cellInfoList = mTelephony.getAllCellInfo();
        if (cellInfoList == null || cellInfoList.size() == 0) {
            return;
        }
        int level = 1;
        for (CellInfo cellInfo : cellInfoList) {
            if (cellInfo instanceof CellInfoLte) {
                level = ((CellInfoLte) cellInfo).getCellSignalStrength().getLevel() + 1;
            } else if (cellInfo instanceof CellInfoCdma) {
                level = ((CellInfoCdma) cellInfo).getCellSignalStrength().getLevel() + 1;
            } else if (cellInfo instanceof CellInfoGsm) {
                level = ((CellInfoGsm) cellInfo).getCellSignalStrength().getLevel() + 1;
            } else if (cellInfo instanceof CellInfoWcdma) {
                level = ((CellInfoWcdma) cellInfo).getCellSignalStrength().getLevel() + 1;
            }
        }
        
        signalLev.postValue(level);
    }
注册监听的方式
TelephonyManager mTelephonyManager = (TelephonyManager) BaseApplication.getAppContext().getSystemService(Context.TELEPHONY_SERVICE);
        if (mTelephonyManager != null) {
            mTelephonyManager.listen(new PhoneStateListener() {
                @Override
                public void onSignalStrengthsChanged(SignalStrength signalStrength) {
                    super.onSignalStrengthsChanged(signalStrength);
                    int asu = signalStrength.getGsmSignalStrength();
                    int lastSignal = -113 + 2 * asu;
                    if (lastSignal > 0) {
                        mobileNetworkSignal = lastSignal + "dBm";
                    }
                  Log.d(TAG,"Current mobileNetworkSignal:" + lastSignal + " dBm");
                }
            }, PhoneStateListener.LISTEN_SIGNAL_STRENGTHS);
        }
获取网络数据类型
主动获取的方式
   private void queryPhoneNetworkTypeResId(TelephonyManager tm) {
        int networkType = tm.getNetworkType();
        String type = "";
        switch (networkType) {
            case TelephonyManager.NETWORK_TYPE_GPRS:
            case TelephonyManager.NETWORK_TYPE_EDGE:
            case TelephonyManager.NETWORK_TYPE_CDMA:
            case TelephonyManager.NETWORK_TYPE_1xRTT:
            case TelephonyManager.NETWORK_TYPE_IDEN:
                type = "G";
                break;
            case TelephonyManager.NETWORK_TYPE_UMTS:
            case TelephonyManager.NETWORK_TYPE_EVDO_0:
            case TelephonyManager.NETWORK_TYPE_EVDO_A:
            case TelephonyManager.NETWORK_TYPE_HSDPA:
            case TelephonyManager.NETWORK_TYPE_HSUPA:
            case TelephonyManager.NETWORK_TYPE_HSPA:
            case TelephonyManager.NETWORK_TYPE_EVDO_B:
            case TelephonyManager.NETWORK_TYPE_EHRPD:
            case TelephonyManager.NETWORK_TYPE_HSPAP:
                type = "3G";
                break;
            case TelephonyManager.NETWORK_TYPE_LTE:
                type = "4G";
                break;
            default:
                break;
        }
        networkTypeValue.postValue(type);
    }
被动通知的方式
 private static final class NetConnChangedReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            log("onReceive");
            NetworkInfo activeInfo = getActiveNetworkInfo(context);
            if (activeInfo == null) {
                broadcastConnStatus(ConnectStatus.NO_NETWORK);
            } else if (activeInfo.isConnected()) {
                int networkType = activeInfo.getType();
                if (ConnectivityManager.TYPE_WIFI == networkType) {
                    broadcastConnStatus(ConnectStatus.WIFI);
                } else if (ConnectivityManager.TYPE_MOBILE == networkType) {
                    broadcastConnStatus(ConnectStatus.MOBILE);
                    int subtype = activeInfo.getSubtype();
                    if (TelephonyManager.NETWORK_TYPE_GPRS == subtype
                            || TelephonyManager.NETWORK_TYPE_GSM == subtype
                            || TelephonyManager.NETWORK_TYPE_EDGE == subtype
                            || TelephonyManager.NETWORK_TYPE_CDMA == subtype
                            || TelephonyManager.NETWORK_TYPE_1xRTT == subtype
                            || TelephonyManager.NETWORK_TYPE_IDEN == subtype) {
                        broadcastConnStatus(ConnectStatus.MOBILE_2G);
                    } else if (TelephonyManager.NETWORK_TYPE_UMTS == subtype
                            || TelephonyManager.NETWORK_TYPE_EVDO_0 == subtype
                            || TelephonyManager.NETWORK_TYPE_EVDO_A == subtype
                            || TelephonyManager.NETWORK_TYPE_HSDPA == subtype
                            || TelephonyManager.NETWORK_TYPE_HSUPA == subtype
                            || TelephonyManager.NETWORK_TYPE_HSPA == subtype
                            || TelephonyManager.NETWORK_TYPE_EVDO_B == subtype
                            || TelephonyManager.NETWORK_TYPE_EHRPD == subtype
                            || TelephonyManager.NETWORK_TYPE_HSPAP == subtype
                            || TelephonyManager.NETWORK_TYPE_TD_SCDMA == subtype) {
                        broadcastConnStatus(ConnectStatus.MOBILE_3G);
                    } else if (TelephonyManager.NETWORK_TYPE_LTE == subtype
                            || TelephonyManager.NETWORK_TYPE_IWLAN == subtype) {
                        broadcastConnStatus(ConnectStatus.MOBILE_4G);
                    } else {
                        broadcastConnStatus(ConnectStatus.MOBILE_UNKNOWN);
                    }
                } else {
                    broadcastConnStatus(ConnectStatus.OTHER);
                }
            } else {
                broadcastConnStatus(ConnectStatus.NO_CONNECTED);
            }
        }
    }
注册和取消注册
    /**
     * 注册网络接收者
     * * @param context 上下文
     */
    public static void registerNetConnChangedReceiver(Context context) {
        checkNonNull(context, "context == null");
        IntentFilter filter = new IntentFilter();
        filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
        context.registerReceiver(sNetConnChangedReceiver, filter);
    }
    /**
     * 取消注册网络接收者
     * * @param context 上下文
     */
    public static void unregisterNetConnChangedReceiver(Context context) {
        checkNonNull(context, "context == null");
        context.unregisterReceiver(sNetConnChangedReceiver);
        sNetConnChangedListeners.clear();
    }
wifi连接状态
class NetworkConnectChangedReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            // 这个监听wifi的打开与关闭,与wifi的连接无关
            if (WifiManager.WIFI_STATE_CHANGED_ACTION.equals(intent.getAction())) {
                int wifiState = intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE, 0);
                switch (wifiState) {
                    case WifiManager.WIFI_STATE_DISABLED:
                    case WifiManager.WIFI_STATE_DISABLING:
                        isWifiOpen.postValue(false);
                        break;
                    case WifiManager.WIFI_STATE_ENABLING:
                    case WifiManager.WIFI_STATE_ENABLED:
                        isWifiOpen.postValue(true);
                        break;
                    default:
                        break;
                }
            }
        }
    }
蓝牙状态
    private final BroadcastReceiver mBtReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
            if (BluetoothAdapter.ACTION_STATE_CHANGED.equals(action)) {
                int blueState = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, 0);
                switch (blueState) {
                    case BluetoothAdapter.STATE_TURNING_ON:
                    case BluetoothAdapter.STATE_ON:
                        btState.postValue(true);
                        ICLogger.d("ON BT OPEN");
                        break;
                    case BluetoothAdapter.STATE_TURNING_OFF:
                    case BluetoothAdapter.STATE_OFF:
                        ICLogger.d("ON BT CLOSE");
                        btState.postValue(false);
                        break;
                }
            }
        }
    };
Gps状态
    private void getGpsState() {
        //GPS
        mContext.getContentResolver()
                .registerContentObserver(
                        Settings.Secure
                                .getUriFor(Settings.System.LOCATION_PROVIDERS_ALLOWED),
                        false, mGpsMonitor);
    }
回调
    private ContentObserver mGpsMonitor = new ContentObserver(null) {
        @Override
        public void onChange(boolean selfChange) {
            super.onChange(selfChange);
            LocationManager mLocationManager = (LocationManager) mContext.getSystemService(Context.LOCATION_SERVICE);
            boolean enabled = mLocationManager
                    .isProviderEnabled(LocationManager.GPS_PROVIDER);
            gpsState.postValue(enabled);
        }
    };
以上各种状态,从别人代码里扣来的,确定是能用的,只是代码可能有点丑。![图片描述]































