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;

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,723评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,485评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,998评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,323评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,355评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,079评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,389评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,019评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,519评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,971评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,100评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,738评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,293评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,289评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,517评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,547评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,834评论 2 345

推荐阅读更多精彩内容