Android获取移动网络信号强度的方法

判断有没有 SIM 卡

获取移动网络的信号,一定要判断是否插了 SIM 卡,没插卡肯定是没法获取的

    /**
     * 判断是否包含SIM卡
     *
     * @return 状态
     */
    public static boolean hasSimCard(Context context) {
        TelephonyManager telMgr = (TelephonyManager)
                context.getSystemService(Context.TELEPHONY_SERVICE);
        int simState = telMgr.getSimState();
        boolean result = true;
        switch (simState) {
            case TelephonyManager.SIM_STATE_ABSENT:
            case TelephonyManager.SIM_STATE_UNKNOWN:
                result = false; // 没有SIM卡
                break;
        }
        return result;
    }

获取信号强度

如果插了 SIM 卡,就可以通过下边方法来获取移动网络的信号强度(单位 dBM),使用的是 TelephonyManager 来监听

    private void getMobileNetworkSignal() {
        if (!PhoneUtils.hasSimCard(mcontext)) {
            logger.info("getMobileNetworkSignal: no sim card");
            return;
        }
        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";
                    }
                    logger.info("Current mobileNetworkSignal:" + lastSignal + " dBm");
                }
            }, PhoneStateListener.LISTEN_SIGNAL_STRENGTHS);
        }
    }

也可以添加网络类型的判断,来获取是何种网络的信号强度

int netWorkType = getNetWorkType(mContext);
switch (netWorkType) {
    case NETWORKTYPE_WIFI:
        mTextView.setText("当前网络为wifi,信号强度为:" + gsmSignalStrength);
        break;
    case NETWORKTYPE_2G:
        mTextView.setText("当前网络为2G移动网络,信号强度为:" + gsmSignalStrength);
        break;
    case NETWORKTYPE_4G:
        mTextView.setText("当前网络为4G移动网络,信号强度为:" + gsmSignalStrength);
        break;
    case NETWORKTYPE_NONE:
        mTextView.setText("当前没有网络,信号强度为:" + gsmSignalStrength);
        break;
    case -1:
        mTextView.setText("当前网络错误,信号强度为:" + gsmSignalStrength);
        break;
}

用到的获取网络类型的方法:

public static int getNetWorkType(Context context) {
    int mNetWorkType = -1;
    ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo networkInfo = manager.getActiveNetworkInfo();
    if (networkInfo != null && networkInfo.isConnected()) {
        String type = networkInfo.getTypeName();
        if (type.equalsIgnoreCase("WIFI")) {
            mNetWorkType = NETWORKTYPE_WIFI;
        } else if (type.equalsIgnoreCase("MOBILE")) {
            return isFastMobileNetwork(context) ? NETWORKTYPE_4G : NETWORKTYPE_2G;
        }
    } else {
        mNetWorkType = NETWORKTYPE_NONE;//没有网络
    }
    return mNetWorkType;
}

/**
 * 判断网络类型
 */
private static boolean isFastMobileNetwork(Context context) {
    TelephonyManager telephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
    if (telephonyManager.getNetworkType() == TelephonyManager.NETWORK_TYPE_LTE) {
        return true;
    }
    return false;
}

最后添加必要权限即可

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

以上就是Android获取移动网络信号强度的方法的详细内容,更多关于Android获取网络信号强度的资料请关注我们其它相关文章!

(0)

相关推荐

  • Android手机信号强度检测详细介绍

    最近到处在跑着找工作,难免在面试过程中遇到这样那样的问题,记得最清楚一次在面试过程中被问到,当手机处于弱网状态下,如何处理,如何监听网络信号强度变化.但是真是蒙了,回答的乱七八糟,思路一点都不明确.今天小编在这里带领大家了解下关于手机信号强度的相关几个概念. Android手机信号强度介绍 android定义了2种信号单位:dBm和asu.它们之间的关系是:dBm =-113+2asu,这是google给android手机定义的特有信号单位.例如,我的信号强度为-53dBm,则对应30asu,因

  • android 获取手机GSM/CDMA信号信息,并获得基站信息的方法

    在Android中我们常用的轻松获取WIFI信号列表,那如何获取CDMA或者GSM的手机信号呢? 系统提供了TelephonyManager类,此类非常丰富,基本你所需要的手机信息都能获取到,那下面就来看看我们所需要的CDMA与GSM信号是如何获取的吧. private TelephonyManager telephonyManager; private PhoneStateListener phoneStateListener; 首先声明两个变量 在onCreate()方法中初始化变量 Ini

  • Android9.0 SystemUI 网络信号栏定制修改的流程解析

    前情提要 Android 8.1平台SystemUI 导航栏加载流程解析 9.0 改动点简要说明 1.新增 StatusBarMobileView 替代 SignalClusterView,用以控制信号栏显示 同时增加的还有 StatusBarIconView.StatusBarWifiView 2.整体流程和 8.1 类似 效果图 整体流程图 上代码 先来看初始赋值的地方 MobileSignalController.java,在 notifyListeners() 方法中进行我们对应的定制,

  • Android实现信号强度监听的方法

    信号强度的监听是Android手机十分常见的一个重要功能.今天本文就以实例展示Android实现信号强度监听的方法.分享给大家供大家参考. 具体实现代码如下: TelephonyManager Tel; MyPhoneStateListener MyListener; /* Update the listener, and start it */ MyListener = new MyPhoneStateListener(); Tel = (TelephonyManager) getSystem

  • Android获取当前已连接的wifi信号强度的方法

    本文实例讲述了Android获取当前已连接的wifi信号强度的方法,是Android程序开发中非常常见的重要技巧.分享给大家供大家参考之用.具体方法如下: 1.得到当前已连接的wifi信息 WifiManager wifi_service = (WifiManager)getSystemService(WIFI_SERVICE); WifiInfo wifiInfo = wifi_service.getConnectionInfo(); 其中wifiInfo有以下的方法: wifiinfo.ge

  • Android自定义View展示Wifi信号强弱指示方法示例

    前言 最近因为工作的需要,要自定义展示Wifi信号强弱的需要,就通过利用系统广播的方式实现了一个自定义View--WifiStateView,下面话不多说了,感兴趣的朋友们一起来看看详细的介绍吧. 实现的效果图如下所示: 用不同的图片来表示Wifi信号的强弱,可以自定义Wifi信号等级 图标简陋了点,根据需要来替换即可 /** * 作者: 叶应是叶 * 时间: 2017/8/22 18:25 * 描述: */ public class WifiStateView extends AppCompa

  • android wifi信号强度等级区分的修改介绍

    /frameworks/base/wifi/java/android/net/wifi/wifimanager.java calculateSignalLevel为计算信号等级函数,MAX_RSSI和MIN_RSSI分别为最强和最弱信号强度等级的信号强度阀值.

  • Android Init进程对信号的处理流程详细介绍

    Android  Init进程对信号的处理流程 在Android中,当一个进程退出(exit())时,会向它的父进程发送一个SIGCHLD信号.父进程收到该信号后,会释放分配给该子进程的系统资源:并且父进程需要调用wait()或waitpid()等待子进程结束.如果父进程没有做这种处理,且父进程初始化时也没有调用signal(SIGCHLD, SIG_IGN)来显示忽略对SIGCHLD的处理,这时子进程将一直保持当前的退出状态,不会完全退出.这样的子进程不能被调度,所做的只是在进程列表中占据一个

  • Android 模拟信号示波器示例代码

    上次简单地介绍了AudioRecord和AudioTrack的使用,这次就结合SurfaceView实现一个Android版的手机模拟信号示波器.最近物联网炒得很火,作为手机软件开发者,如何在不修改手机硬件电路的前提下实现与第三方传感器结合呢?麦克风就是一个很好的ADC接口,通过麦克风与第三方传感器结合,再在软件里对模拟信号做相应的处理,就可以提供更丰富的传感化应用. 先来看看本文程序运行的效果图(屏幕录像速度较慢,真机实际运行起来会更加流畅): 本文程序使用8000hz的采样率,对X轴方向绘图

  • Android提高之模拟信号示波器的实现

    前面简单地介绍了Android程序开发中AudioRecord和AudioTrack的使用,这次再结合SurfaceView实现一个Android版的手机模拟信号示波器.最近物联网炒得很火,作为手机软件开发者,如何在不修改手机硬件电路的前提下实现与第三方传感器结合呢?麦克风就是一个很好的ADC接口,通过麦克风与第三方传感器结合,再在软件里对模拟信号做相应的处理,就可以提供更丰富的传感化应用. 先来看看本文程序运行的效果图(屏幕录像截图的速度较慢,真机实际运行起来会很流畅): 本文程序使用8000

随机推荐