精华内容
下载资源
问答
  • android读取运营商

    2016-11-30 14:42:26
    android读取运营商
  • 发表时间:2019-10-20内容总览本文会给出在 Android 上获取运营商的方法,几个相近方法结果的差异,以及在多卡情况下有效的获取方式。最后额外提一下一种不需要请求设备识别码获取运营商信息的方法。提供可运行的 ...

    发表时间:2019-10-20

    内容总览

    本文会给出在 Android 上获取运营商的方法,几个相近方法结果的差异,以及在多卡情况下有效的获取方式。最后额外提一下一种不需要请求设备识别码获取运营商信息的方法。提供可运行的 demo 源码。

    MCC 和 MNC

    首先介绍一下这两个码,也是获取运营商所必须的。

    MCC,Mobile Country Code,移动设备国家代码。MNC,Mobile Network Code,移动设备网络代码。MCC 和 MNC 串在一起后,可以用来表示唯一的移动设备运营商。我国的 MCC 是 460,MNC 则会出现一个运营商拥有多个的情况,比如联通有 01、06、09。当前的码表可以在这个维基页面找到。

    于是可以先根据码表来构建这么一个类:

    enum class NetworkOperator(val opName: String) {

    Mobile("移动"),

    Unicom("联通"),

    Telecom("电信"),

    Tietong("铁通"),

    Other("其他");

    companion object {

    /**

    * 根据 [code](MCC+MNC) 返回运营商

    */

    fun from(code: Int) = when (code) {

    46000, 46002, 46004, 46007, 46008 -> Mobile

    46001, 46006, 46009 -> Unicom

    46003, 46005, 46011 -> Telecom

    46020 -> Tietong

    else -> Other

    }

    fun fromOpName(name: String) = when (name) {

    "移动" -> Mobile

    "联通" -> Unicom

    "电信" -> Telecom

    "铁通" -> Tietong

    else -> Other

    }

    }

    }

    复制代码

    你很可能也知道存在一个叫做 IMSI 的识别码(注意并不是 IMEI 哦)。国际移动用户识别码(International Mobile Subscriber Identity)可以在蜂窝网络中区分不同用户,它是由 MCC、MNC 和 MSIN(移动订户识别码,Mobile Subscription Identification Number)组成的。即 IMSI = MCC + MNC + MSIN。

    如何获取

    在 Android 上首先需要请求 READ_PHONE_STATE 权限,然后通过 TelephonyManager 相关方法来获取信息。TelephonyManager 有若干相近的方法,也让人挺困惑的。Demo 里会列出各个方法的结果,有兴趣的可以自行尝试一下。

    val tm = getSystemService()

    val text = """

    TelephonyManager.getSimOperator(): ${tm.simOperator}

    TelephonyManager.getSimOperatorName(): ${tm.simOperatorName}

    TelephonyManager.getNetworkOperator(): ${tm.networkOperator}

    TelephonyManager.getNetworkOperatorName(): ${tm.networkOperatorName}

    TelephonyManager.getSubscriberId(): ${tm.subscriberId}

    Operator name: ${NetworkOperator.from(Integer.valueOf(tm.simOperator)).opName}

    """.trimIndent()

    复制代码

    在我的设备上得到的结果如下:

    TelephonyManager.getSimOperator(): 46009 // 当前流量卡,联通

    TelephonyManager.getSimOperatorName(): CMCC // 联通

    TelephonyManager.getNetworkOperator(): 46000 // 移动,卡一

    TelephonyManager.getNetworkOperatorName(): CHINA MOBILE // 移动

    TelephonyManager.getSubscriberId(): 46002326951xxxx // 移动,这就是 IMSI,xxxx 部分是由我隐去的

    Operator name: 联通

    复制代码

    那么得到了 MCC+MNC,就可以判断出运营商了。

    双卡情况

    如果设备有双卡,该怎么样呢?切换流量卡后再来看一下结果:

    TelephonyManager.getSimOperator(): 46002 // 当前流量卡,移动

    TelephonyManager.getSimOperatorName(): CMCC // 联通,跟 getSimOperator() 结果不符

    TelephonyManager.getNetworkOperator(): 46000 // 移动

    TelephonyManager.getNetworkOperatorName(): CHINA MOBILE // 移动

    TelephonyManager.getSubscriberId(): 46002326951xxxx // 移动

    Operator name: 移动

    复制代码

    通过尝试可以发现,TelephonyManager.getSimOperator() 方法获得的结果是根据当前设置的流量卡变化的。而其他的方法结果都没有变化,甚至得到的信息也是不统一的,可以说没什么用处。

    不过我还无法确定这些方法的结果在不同设备不同 ROM 上的效果,仅供参考。可以下载 demo 来查看在自己设备上的结果。

    不需要权限的方法

    我们都知道 Android 会根据设备设置的不同,去加载不同的资源文件夹。最典型的,会根据系统的语言去加载不同语言的字符串资源。而 Android 也可以根据 MCC 和 MNC 加载不同的资源。

    于是我灵光一闪,给 values 文件夹加上 -mcc460-mnc00 后缀,然后在里面放上对应运营商的名字字符串,就可以绕开权限获取到运营商了。

    不过等等,这么一来要给每个 MNC 都写一个文件夹,还挺麻烦的,还是用代码来获取吧:

    val mcc = resources.configuration.mcc

    val mnc = resources.configuration.mnc

    val operator = NetworkOperator.from(mcc * 100 + mnc)

    复制代码

    这个方法也是有缺点的,不然我就把这个方法写在前了——无法获取到当前流量卡的信息,获取到的信息是固定的。

    Demo 源代码

    运行以下命令来获得 demo 的源代码:

    git clone -b sim-operator https://github.com/Loong-T/demo.git

    复制代码

    展开全文
  • Android获取运营商代码

    2011-08-16 20:50:36
    Android获取运营商代码 IMSI MCC MNC MIN
  • Android获取运营商

    千次阅读 2015-05-08 16:40:08
    今天接到一个新需求,要给服务器上送设备运营商名称,之后我的第一反应是,umeng都无法精确统计运营商,我如何判断上送具体的运营商呢?如下图: 这张图里反映了友盟统计到用户手机的运营商名称,这些名称什么样子...

    今天接到一个新需求,要给服务器上送设备运营商名称,之后我的第一反应是,umeng都无法精确统计运营商,我如何判断上送具体的运营商呢?如下图:

    这里写图片描述
    这张图里反映了友盟统计到用户手机的运营商名称,这些名称什么样子的都有。有什么办法精确判断具体是什么运营商呢?比如,只返回“中国移动”,“中国联通”,“中国电信”。
    我这里解决的方案是通过设备的MCC/MNC代码来判断。
    首先,我们要了解MCC/MNC是什么,请看WIKI百科。通过阅读,我们能够知道,只要对比MCC/MNC编码,就能知道具体是什么运营商了。
    其次,就是具体代码了,如下:

    /**
         * 返回运营商 需要加入权限 <uses-permission android:name="android.permission.READ_PHONE_STATE"/> <BR>
         * 
         * @return 1,代表中国移动,2,代表中国联通,3,代表中国电信,0,代表未知
         * @author youzc@yiche.com
         */
     public int getOperators(Context context) {
            // 移动设备网络代码(英语:Mobile Network Code,MNC)是与移动设备国家代码(Mobile Country Code,MCC)(也称为“MCC /
            // MNC”)相结合, 例如46000,前三位是MCC,后两位是MNC 获取手机服务商信息
            int OperatorsName = 0;
            String IMSI =  (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE).getSubscriberId();
            // IMSI号前面3位460是国家,紧接着后面2位00 运营商代码
            System.out.println(IMSI);
            if (IMSI.startsWith("46000") || IMSI.startsWith("46002") || IMSI.startsWith("46007")) {
                OperatorsName = 1;
            } else if (IMSI.startsWith("46001") || IMSI.startsWith("46006")) {
                OperatorsName = 2;
            } else if (IMSI.startsWith("46003") || IMSI.startsWith("46005")) {
                OperatorsName = 3;
            }
            return OperatorsName;
        }

    通过客户端本地比对MCC/MNC确定运营商这种方式,本身我是不赞同的,我认为把MCC/MNC上送到服务器,由服务器判断这才是最优方案。因为应用打好包分发出去,代码就是死的,未来不可以扩展比对,但是服务器是可以动态的,随时配置比对的MCC/MNC编码。

    展开全文
  • Android获取运营商信息

    千次阅读 2015-02-02 16:10:43
    项目上要求做三网外放产品,将三个单网SDK自行整合成三网联合,思路大概是在OnCreate时区分运营商 设定枚举,根据取到的sim卡信息赋予枚举变量,后面三网的一些操作根据枚举进行判定 先设定运营商枚举 enum ...

    项目上要求做三网外放产品,将三个单网SDK自行整合成三网联合,思路大概是在OnCreate时区分运营商

    设定枚举,根据取到的sim卡信息赋予枚举变量,后面三网的一些操作根据枚举进行判定


    先设定运营商枚举

    	enum CARRIEROPERATOR
    	{
    		NONE(0),
    		MM(1),
    		UNIPAY(2),
    		EGAME(3);
    		
    		private int value;
    		
    	    private CARRIEROPERATOR(int i)
    	    {
    	        this.value=i;
    	    } 
    	    
    	    public int getValue()
    	    {
    	        return this.value;
    	    }
    	}
    	CARRIEROPERATOR carrierOperator = CARRIEROPERATOR.NONE;



    以下是获取sim卡是哪个运营商

    	public int getSimOperatorInfo()
    	{
    		TelephonyManager telephonyManager = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
    		String operatorString = telephonyManager.getSimOperator();
    		
    		if(operatorString == null)
    		{
    			return 0;
    		}
    		
    		if(operatorString.equals("46000") || operatorString.equals("46002"))
    		{
    			//中国移动
    			return 1;
    		}
    		else if(operatorString.equals("46001"))
    		{
    			//中国联通
    			return 2;
    		}
    		else if(operatorString.equals("46003"))
    		{
    			//中国电信
    			return 3;
    		}
    		
    		//error
    		return 0;
    	}
    

    在onCreate函数中调用下面的函数设定运营商

    void SetCarrierOperation()
    		{
    			int simCode = GetSimOperatorInfo();
    			switch(simCode)
    			{
    			case 0:
    				carrierOperator = CARRIEROPERATOR.NONE;
    				break;
    			case 1:
    				carrierOperator = CARRIEROPERATOR.MM;
    				break;
    			case 2:
    				carrierOperator = CARRIEROPERATOR.UNIPAY;
    				break;
    			case 3:
    				carrierOperator = CARRIEROPERATOR.EGAME;
    				break;
    			default:
    				Log.e("unity","SetCarrierOperation error");
    				break;
    			}
    		}

    文章原创,转载请注明

    展开全文
  • 有些地区的MVNO(虚拟运营商Mobile Virtual Network Operator)和国内各MNO(运营商Mobile Network Operator)签订了协议,使用国内所有MNO的网络不算漫游,所以需要判定如果MVNO的卡注册上国内的plmn,则忽略漫游 ...

    有些地区的MVNO(虚拟运营商Mobile Virtual Network Operator)和国内各MNO(运营商Mobile Network Operator)签订了协议,使用国内所有MNO的网络不算漫游,所以需要判定如果MVNO的卡注册上国内的plmn,则忽略漫游
    上层Ap判定roaming的方法是GsmServiceStateTracker.java中的regCodeIsRoaming;请做如下修改:

    --- a/frameworks/opt/telephony/src/java/com/android/internal/telephony/gsm/GsmServiceStateTracker.java
    +++ b/frameworks/opt/telephony/src/java/com/android/internal/telephony/gsm/GsmServiceStateTracker.java
    @@ -220,6 +220,7 @@ final class GsmServiceStateTracker extends ServiceStateTracker {
         private String mHhbName = null;
         private String mCsgId = null;
         private int mFemtocellDomain = 0;
    +    private SIMRecords simRecords = null;
    
         /* ALPS00236452: manufacturer maintained table for specific operator with multiple PLMN id */
         // ALFMS00040828 - add "46008"
    @@ -1348,7 +1349,7 @@ final class GsmServiceStateTracker extends ServiceStateTracker {
             updateSpnDisplay(false);
         }
    
    -    protected void updateSpnDisplay(boolean forceUpdate) {
    +    public void updateSpnDisplay(boolean forceUpdate) {
             if (isInSvlteMode()) {
                 mSvlteSST.updateGsmCdmaServiceState(mSS, 0);
                 final int updateSpnPhoneId = mSvlteSST.getUpdateSvlteSpnPhoneId(SST_TYPE);
    @@ -1363,7 +1364,7 @@ final class GsmServiceStateTracker extends ServiceStateTracker {
                 log("updateSpnDisplay, Use GSMSST (" + mPhone.getPhoneId()
                         + ") to update spn display, forceUpdate = " + forceUpdate);
             }
    -        SIMRecords simRecords = null;
    +        
             IccRecords r = mPhone.mIccRecords.get();
             if (r != null) {
                 simRecords = (SIMRecords) r;
    @@ -3124,7 +3125,8 @@ final class GsmServiceStateTracker extends ServiceStateTracker {
                 }
             }
    
    -        if ((ignoreDomesticRoaming == true) && (isRoaming == true)
    +        if ((((null != simRecords) && (PhoneConstants.MVNO_TYPE_NONE != simRecords.getMvnoMatchType())) || 
    +            (ignoreDomesticRoaming == true)) && (isRoaming == true)
                     && (strServingPlmn != null) && (strHomePlmn != null)) {
                 log("ServingPlmn = " + strServingPlmn + " HomePlmn = " + strHomePlmn);
                 if (strHomePlmn.substring(0, 3).equals(strServingPlmn.substring(0, 3))) {
    展开全文
  • 更改android 5.0 锁屏运营商大小写
  • Android:判断手机运营商

    千次阅读 2017-08-10 18:30:51
    Android Sim卡运营商 TelephonyManager
  • 获取本机手机号以及服务运营商并显示的DEMO,代码简洁明了,供大家学习交流
  • android关闭应用及获取运营商ISP 1.AndroidManifest.xml <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" packa...
  • 主要介绍了Android获取手机SIM卡运营商信息的方法,可获得手机的型号、运营商信息及系统版本等,需要的朋友可以参考下
  • 主要介绍了Android获取手机号码和运营商信息的方法,以实例形式完整讲述了获取手机号码和运营商信息的技巧,代码中包含完整的注释说明,需要的朋友可以参考下
  • QC数据库转化为86_zh文件(带详细运营商) 安卓手机用
  • 一些需求需要获取运营商和网络类型,下面对运营商和网络类型做分析。先抛出一些废话的定义:GSM:全球移动通讯系统Global System of Mobile communication就是众所周知的GSM,是当前应用最为广泛的移动电话标准。...
  • android 判断手机SIM卡 所属 运营商,支持移动,电信,联通
  • Android之获取移动网络运营商名称

    千次阅读 2020-04-02 16:52:42
    原来的获取方法不好用了,适配安卓10.0设备,最新获取移动网络运营商名称方法。 获取权限: android.permission.READ_PHONE_STATE 工具类代码: /** * Created by zachary on 2020/04/02. * 获取设备信息 *...
  • Android 获取当前手机运营商判断

    千次阅读 2017-04-05 19:11:26
    有时候,需要把三大运营商的SDK融合在一个包内,但是又需要根据当前手机卡的运营商作判断,再决定支付。获取手机运营商名,我们根据手机IMSI号来获取,前3位460 是国家,接着后面2位 00和02是 中国移动,01是中国...
  • Unity获取安卓手机运营商信息

    千次阅读 2017-05-11 14:13:01
    Unity获取安卓手机运营商,电量,wifi信号强度,本地Toast,获取已安装apk,调用第三方应用,强制自动重启本应用  一个完整的游戏项目上线需要不断的完善优化,但是到了后期的开发不再仅仅是游戏了,它的...
  • Android 虚拟运营商apn与spn配置

    千次阅读 2016-04-22 14:01:43
    1.通过EF_SPN区分:读取SIM中的文件EF_SPN,结合SIM的mccmnc+spn,在virtual-spn-conf-by-efspn.xml 中查找有没有对应的记录,如果有这张sim卡对应信息,就同时取name字段的内容当作运营商名称。 例如 COOP的SIM卡...
  • 主要介绍了android获取手机IMSI码判断手机运营商代码实例,大家参考使用
  • Android 根据网络分析运营商信息

    千次阅读 2013-12-03 18:19:01
    Android系统上根据网络获取运营商信息。
  • android获取手机号码_获取手机运营商 导入eclipse即可
  • android判断手机SIM卡是哪个运营商
  • android获取运营商代码

    千次阅读 2012-05-15 10:57:55
    在同一个国家内,如果有多个CDMA运营商,可以通过MNC来进行区别. 功能 说明 getCellLocation() 返回的单元格位置的装置 ACCESS_COARSE_LOCATION或ACCESS_FINE_LOCATION getDeviceId() 返回的...
  • android 获取手机运营商名字

    万次阅读 2017-08-23 17:55:10
    * 获取当前的运营商 * * @param context * @return 运营商名字 */ public static String getOperator(Context context) { String ProvidersName = ""; TelephonyManager telephonyManager = ...
  • 主要介绍了Android 判断SIM卡属于哪个移动运营商详解相关资料,并附实例代码,具有一定参考价值,需要的朋友可以参考下

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 35,512
精华内容 14,204
关键字:

安卓选择运营商