? ? ? ? android移動數據開發:主要包含移動數據強度、移動數據類型、手機是否飛行模式 、設置手機飛行模式、SIM卡的狀態監聽幾大主要模塊。
移動數據強度:根據信號范圍定義相關的信號格數
移動數據類型:移動數據 2G 3G 4G 類型 以及各類型之間切換
飛行模式:飛行模式設置和飛行模式狀態監聽
SIM卡狀態:SIM狀態監聽和SIM插拔
在Android中對移動數據操作 android 主要提供以下幾個類和接口:
? ? ? ? TelephonyManager類主要提供了一系列用于訪問與手機通訊相關的狀態和信息的get方法。其中包括手機SIM的狀態和信息、電信網絡的狀態及手機用戶的信息。在應用程序中可以使用這些get方法獲取相關數據。
? ? ? ?TelephonyManager類的對象可以通過Context.getSystemService(Context.TELEPHONY_SERVICE)方法來獲得,需要注意的是有些通訊信息的獲取對應用程序的權限有一定的限制,在開發的時候需要為其添加相應的權限。
? ? ? ?PhoneStateListener除了可以監聽手機的通話狀態,數據連接活動狀態,數據連接狀態還可以監聽很多狀態。
? ? ? ?PhoneStateListener類方法: (移動數據強度和類型 在打電、SIM卡插拔、連接狀態等狀態改變而受影響,因此需要在狀態下分別檢測數據強度和類型 監聽回調)
1.onDataActivity(intdirection) :activity 數據狀態改變時監聽回調
2.onServiceStateChanged(ServiceState serviceState) {//設備服務狀態改變監聽回調
3.onSignalStrengthsChanged(SignalStrength signalStrength) {//信號強度改變監聽回調
4.onDataConnectionStateChanged(intstate) {//數據連接狀態
5.onCallStateChanged(intstate, String incomingNumber) {//電話狀態改變
移動數據代碼如下:
/**
* 0--4
*/
privateintmLevel=0;
/**
*
*/
privateintmState= 0 ;
/**
* 1--2G 2--3G 3--4G 0--unknow
*/
private ?int ?mNetType= 0 ;
private ?TelephonyManagertel;
private ?Contextcontext=null;
private ??SignalChangeCallback ?mSignalChangedCallback=null;
public ?SignalManager ?(Context context){
this.context= context;
tel=(TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
tel.listen(newMyPhoneStateListener(),
PhoneStateListener.LISTEN_SERVICE_STATE
? ? ? ? ? ? ? ? ? |PhoneStateListener.LISTEN_SIGNAL_STRENGTHS
? ? ? ? ? ? ? ? ? | PhoneStateListener.LISTEN_DATA_ACTIVITY
? ? ? ? ? ? ? ? ? | PhoneStateListener.LISTEN_DATA_CONNECTION_STATE);
}
private ??SignalStrength ?mSignalStrength=null;//獲取信號強度類
public ??void ??setSignalChangedCallback(SignalChangeCallback callback){
? ? ? ? ? ? ?mSignalChangedCallback= callback;
}
class ? ?MyPhoneStateListener ??extends ??PhoneStateListener{
@Override
public ? ?void ? ?onDataActivity(intdirection) {//當activity 數據狀態改變時監聽回調
? ? ? ? ? ? super.onDataActivity(direction);
? ? ? ? ? ? switch(direction){
? ? ? ? ? ?case ??TelephonyManager.DATA_ACTIVITY_IN:
? ? ? ? ? ?break;
? ? ? ? ? ?case ??TelephonyManager.DATA_ACTIVITY_INOUT:
? ? ? ? ? break;
? ? ? ? ?case ??TelephonyManager.DATA_ACTIVITY_OUT:
? ? ? ? break;
? ? ? ? case ??TelephonyManager.DATA_ACTIVITY_NONE:
? ? ? ? break;
}
if(mSignalChangedCallback!=null){//監聽回調
? ? ? ? ? ? ? ? ? mSignalChangedCallback.onDataActivityChange(direction);
? ? ? ? ?}
}
@Override
public ? ? void ? ?onServiceStateChanged(ServiceState serviceState) {//設備服務狀態改變監聽回調
? ? ? ? ? ?super.onServiceStateChanged(serviceState);
? ? ? ? ? ?int ? ?state =serviceState.getState();
? ? ? ? ? switch(state){
? ? ? ? ?case ??ServiceState.STATE_EMERGENCY_ONLY:
? ? ? ? mState=0x01;
? ? ? ? ?break;
? ? ? ? ?case ? ?ServiceState.STATE_IN_SERVICE:
? ? ? ? ?mState=0x02;
? ? ? ? ?break;
? ? ? ? ?case ? ?ServiceState.STATE_OUT_OF_SERVICE:
? ? ? ? mState=0x03;
? ? ? ? ?break;
? ? ? ? case ? ?ServiceState.STATE_POWER_OFF:
? ? ? ?mState= 0x04;
? ? ? ?break;
? ? ? ?default:
break;
}
mNetType=tel.getNetworkClass(tel.getNetworkType());
if(mNetType!=0){
? ? ? ?if(mNetType+1==4){
? ? ? ? ? ? ? ? if(mSignalStrength!=null){
? ? ? ? ? ? ? ? ? ? ?mLevel= getGsmLevel(mSignalStrength);//獲取移動數據信號強度
? ? ? ? ? ? ? ?}
? ? ? ?}elseif(mNetType== 2 ||mNetType== 1){
?if(mSignalStrength!=null){
? ? ? ? ? ? ? ? mLevel= getGsmLevel(mSignalStrength);//獲取移動數據信號強度
? ? ? ? }
}
}else{
? ? ? ? ?if(mSignalStrength!=null){
? ? ? ? ? ? ? mLevel= getGsmLevel(mSignalStrength);//獲取移動數據信號強度
? ? ? ? }
}
if(mSignalChangedCallback!=null){//監聽回調移動數據類型
? ? ? ? ?mSignalChangedCallback.onNetTypeChange(mNetType);
}
if(mSignalChangedCallback!=null){//監聽回調移動數據強度
? ? ? ? mSignalChangedCallback.onSignalChange(mLevel);
}
}
publicintgetGsmLevel(SignalStrength signalStrength){
intlevel = 0;
intasu = signalStrength.getGsmSignalStrength();
if(asu <= 2||asu ==99) level =5;
elseif(asu >=19) level =5;
elseif(asu >=17) level =4;
elseif(asu >=14) level =3;
elseif(asu >=10) level =2;
elseif(asu >=8) level =1;
return ??level;
}
@Override
publicvoidonSignalStrengthsChanged(SignalStrength signalStrength) {//信號強度改變監聽回調
//TODOAuto-generated method stub
super.onSignalStrengthsChanged(signalStrength);
mSignalStrength= signalStrength;
mNetType=tel.getNetworkClass(tel.getNetworkType());
if(mNetType+1==4){
if(mSignalStrength!=null){
mLevel= getGsmLevel(mSignalStrength);//獲取移動數據信號強度
}
}elseif(mNetType== 2 ||mNetType== 1){
if(mSignalStrength!=null){
mLevel= getGsmLevel(mSignalStrength);//獲取移動數據信號強度
}
}
if(mNetType!=0){
mLevel= getGsmLevel(mSignalStrength);
}else{
if(mSignalStrength!=null){
mLevel= getGsmLevel(mSignalStrength);//獲取移動數據信號強度
}
if(mSignalChangedCallback!=null){//監聽回調移動數據強度
mSignalChangedCallback.onSignalChange(mLevel);
}
}
if(mSignalChangedCallback!=null){//監聽回調移動數據類型
mSignalChangedCallback.onNetTypeChange(mNetType);
}
if(mSignalChangedCallback!=null){//監聽回調移動數據強度
mSignalChangedCallback.onNetTypeChange(mNetType);
mSignalChangedCallback.onSignalChange(mLevel);
}
}
@Override
publicvoidonDataConnectionStateChanged(intstate) {//數據連接狀態
//TODOAuto-generated method stub
super.onDataConnectionStateChanged(state);
switch(state){
caseTelephonyManager.DATA_CONNECTED://
break;
caseTelephonyManager.DATA_CONNECTING:
break;
caseTelephonyManager.DATA_DISCONNECTED:
break;
caseTelephonyManager.DATA_SUSPENDED:
break;
}
mNetType=tel.getNetworkClass(tel.getNetworkType());
if(mNetType!=0){
if(mNetType+1==4){
if(mSignalStrength!=null){
mLevel= getGsmLevel(mSignalStrength);//獲取移動數據信號強度
}
}elseif(mNetType== 2 ||mNetType== 1){
if(mSignalStrength!=null){
mLevel= getGsmLevel(mSignalStrength);//獲取移動數據信號強度
}
}
}else{
if(mSignalStrength!=null){
mLevel= getGsmLevel(mSignalStrength);//獲取移動數據信號強度
}
if(mSignalChangedCallback!=null){//監聽回調移動數據強度
mSignalChangedCallback.onSignalChange(mLevel);
}
}
if(mSignalChangedCallback!=null){//監聽回調移動數據類型
mSignalChangedCallback.onNetTypeChange(mNetType);
}
}
@Override
publicvoidonCellLocationChanged(CellLocation location) {//電話位置改變
//TODOAuto-generated method stub
super.onCellLocationChanged(location);
}
@Override
publicvoidonCallStateChanged(intstate, String incomingNumber) {//電話狀態改變
//TODOAuto-generated method stub
super.onCallStateChanged(state, incomingNumber);
mNetType=tel.getNetworkClass(tel.getNetworkType());
switch(state){
caseTelephonyManager.CALL_STATE_IDLE:
//掛斷
break;
caseTelephonyManager.CALL_STATE_OFFHOOK:
//接聽
break;
caseTelephonyManager.CALL_STATE_RINGING:
//來電狀態
break;
}
mNetType=tel.getNetworkClass(tel.getNetworkType());
if(mNetType!=0){
if(mNetType+1==4){
if(mSignalStrength!=null){
mLevel= getGsmLevel(mSignalStrength);//獲取移動數據信號強度
}
}elseif(mNetType== 2 ||mNetType== 1){
if(mSignalStrength!=null){
mLevel= getGsmLevel(mSignalStrength);//獲取移動數據信號強度
}
}
}else{
if(mSignalStrength!=null){
mLevel= getGsmLevel(mSignalStrength);//獲取移動數據信號強度
}
if(mSignalChangedCallback!=null){//監聽回調移動數據強度
mSignalChangedCallback.onSignalChange(mLevel);
}
}
if(mSignalChangedCallback!=null){//監聽回調移動數據類型
mSignalChangedCallback.onNetTypeChange(mNetType);
}
}
}
publicinterfaceSignalChangeCallback{
voidonStateChange(intstate);
voidonSignalChange(intlevel);
voidonNetTypeChange(intnetType);
voidonDataActivityChange(intdirction);
voidgpsLocation(booleanb);
}
判斷飛行模式狀態和設置飛行模式代碼:
/**
* 設置手機飛行模式
*@authorZH-SW-Weiw
*
*/
publicvoidsetAirplaneModeOn(booleanenabling){
Settings.System.putInt(context.getContentResolver(),
Settings.System.AIRPLANE_MODE_ON, enabling ? 1 : 0);
Intent intent =newIntent(Intent.ACTION_AIRPLANE_MODE_CHANGED);
intent.putExtra("state", enabling);
context.sendBroadcast(intent);
}
/**
* 判斷手機是否是飛行模式
*@authorZH-SW-Weiw
*
*/
publicbooleanisAirplaneMode(){
intisAirplaneMode = Settings.System.getInt(
context.getContentResolver(), Settings.System.AIRPLANE_MODE_ON,
0);
return(isAirplaneMode == 1) ?true:false;
}
設置移動數據開關和監聽移動數據開關狀態代碼:注在設置移動數據開關時候要判斷SIM狀態(
(telephonyManager.getSimState() == TelephonyManager.SIM_STATE_ABSENT
||telephonyManager.getSimState() == TelephonyManager.SIM_STATE_UNKNOWN)
/**
* 設置移動數據狀態
*@paramcontext
*@parammobileDataEnabled
*/
publicvoidsetMobileDataState(Context context,booleanisEnable) {
TelephonyManager tm = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);
Method methodSet;
try{
methodSet = Class.forName(tm.getClass().getName()).getDeclaredMethod("setDataEnabled", Boolean.TYPE);
methodSet.invoke(tm,isEnable);
}catch(Exception e) {
e.printStackTrace();
Log.d(TAG," e.toString"+e.toString());
}
}
/**
* 獲取數據開關狀態
*@paramcontext
*@paramgetMobileData
*@return
*/
publicbooleangetMobileDataStatus(Context context){
ConnectivityManager mConnectivityManager = ? ? ? ? ?(ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
String methodName ="getMobileDataEnabled";
ClasscmClass = mConnectivityManager.getClass();
Boolean isOpen =null;
try
{
Method method =cmClass.getMethod(methodName,null);
isOpen = (Boolean)method.invoke(mConnectivityManager,null);
}
catch(Exception e)
{
e.printStackTrace();
Log.d(TAG," e.toString"+e.toString());
}
returnisOpen;
}