原创首发
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);
}
};
以上各种状态,从别人代码里扣来的,确定是能用的,只是代码可能有点丑。![图片描述]