Android -移動數據開發

? ? ? ? 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;

}

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容