1. 程式人生 > >雙卡雙待(一)

雙卡雙待(一)

前言:

關於雙卡雙待這個問題,調研了幾個月終於有所進展,通過收集各方面的資料,整理出了這個文件。~~╭(╯^╰)╮

1.獲取雙卡的subId

方法1:
/**
     * @param slotId:卡槽的序號:0代表卡槽1,1代表卡槽2
     * @param context:上下文
     * @return:subId(可以理解為sim卡的索引)
     */
    public static int getSubId(int slotId, Context context) {
        Uri uri = Uri.parse("content://telephony/siminfo"
); Cursor cursor = null; ContentResolver contentResolver = context.getContentResolver(); try { cursor = contentResolver.query(uri, new String[] {"_id", "sim_id"}, "sim_id = ?", new String[] {String.valueOf(slotId)}, null); if (null != cursor) { if
(cursor.moveToFirst()) { return cursor.getInt(cursor.getColumnIndex("_id")); } } } catch (Exception e) { } finally { if (null != cursor) { cursor.close(); } } return -1; }
使用:

tv_subId1.setText(getSubId(0,this)+"");//卡1
tv_subId2.setText(getSubId(1,this)+"");//卡2

方法2:
List<SubscriptionInfo> list = new ArrayList<>();

//獲取SubscriptionManager物件
SubscriptionManager sm = SubscriptionManager.from(this);

list = sm.getActiveSubscriptionInfoList();//獲取所有sim卡的資訊集合
SubscriptionInfo info1 = list.get(0);//卡1的sim卡資訊
SubscriptionInfo info2 = list.get(1);//卡2的sim卡資訊
使用:

tv_subId1.setText(info1.getSubscriptionId()+"");
tv_subId2.setText(info2.getSubscriptionId()+"");

2. 獲取SIM卡數量

//獲取TelephonyManager例項物件
TelephonyManager tm = (TelephonyManager) this.getSystemService(Context.TELEPHONY_SERVICE);
int simCount = tm.getPhoneCount();//sim卡數量(1:一張sim卡;2:2張sim卡)

3. sim卡資訊

List<SubscriptionInfo> list = new ArrayList<>();

//獲取SubscriptionManager物件
SubscriptionManager sm = SubscriptionManager.from(this);

list = sm.getActiveSubscriptionInfoList();//獲取所有sim卡的資訊集合
SubscriptionInfo info1 = list.get(0);//卡1的sim卡資訊
SubscriptionInfo info2 = list.get(1);//卡2的sim卡資訊
使用:

TextView tv_info1.setText(info.toString());

sim卡資訊格式:

java
{
id=2,
iccId=898600640XXXXXXXXXXX,
simSlotIndex=0,
displayName=CMCC,
carrierName=CMCC,
nameSource=0,
iconTint=-13408298,
dataRoaming=0,
[email protected]
mcc 460,
mnc 0,
mStatus=1,
mNwMode=-1
}

4.雙卡的IMSI

1.解釋:

IMSI:即國際移動使用者識別碼,有15數字,由三部分組成:
①mcc:國家碼(460)
②mnc:網路碼(聯通:01;移動:00、02;電信:03)
③min:10位長度
例:460003311452284

2.獲取方法
方法1:
//獲取SubscriptionManager物件
SubscriptionManager sm = SubscriptionManager.from(this);

 //IMSI
String IMSI1 = tm.getSubscriberId();//卡1
方法2:
//imsi
    private String getSubscriberId(SubscriptionInfo sir) {
        if (sir == null) {
            return null;
        }
        return getSubscriberId(sir.getSubscriptionId());
    }
使用:
List<SubscriptionInfo> list = new ArrayList<>();
//獲取SubscriptionManager物件
SubscriptionManager sm = SubscriptionManager.from(this);
list = sm.getActiveSubscriptionInfoList();//獲取所有sim卡的資訊集合
SubscriptionInfo info1 = list.get(0);//卡1的sim卡資訊
SubscriptionInfo info2 = list.get(1);//卡2的sim卡資訊

String IMSI1=getSubscriberId(info1);//卡1
String IMSI2=getSubscriberId(info2);//卡2

5.雙卡的IMEI

1.解釋:

IMEI:國際移動裝置標識,15位長度

2.獲取方法
/**
     * @param context:上下文
     * @param soltId:卡槽的序號,0代表卡槽1;1代表卡槽2
     * @return
     */
    public static String getDeviced(Context context, int soltId) {
        return (String) getPhoneInfo(soltId, "getDeviceId", context);
    }
 //通過subId和方法名來獲取該方法的返回值
    public static Object getPhoneInfo(int subId, String methodName, Context context) {
        Object value = null;
        try {
            TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
            if (Build.VERSION.SDK_INT >= 21) {
                Method method = tm.getClass().getMethod(methodName, getMethodParamTypes(methodName));
                if (subId >= 0) {
                    value = method.invoke(tm, subId);
                }
            }
        } catch (Exception e) {
        }
        return value;
    }
 //通過方法名來獲取方法的引數列表
    public static Class[] getMethodParamTypes(String methodName) {
        Class[] params = null;
        try {
            Method[] methods = TelephonyManager.class.getDeclaredMethods();
            for (int i = 0; i < methods.length; i++) {
                if (methodName.equals(methods[i].getName())) {
                    params = methods[i].getParameterTypes();
                    if (params.length >= 1) {
                        //LogUtil.d("length:", "" + params.length);
                        break;
                    }
                }
            }
        } catch (Exception e) {
        }
        return params;
    }
3.使用:
 TextView tv_imei1.setText(getDeviced(this,info.getSimSlotIndex())+"");//卡1
 TextView tv_imei2.setText(getDeviced(this,info2.getSimSlotIndex())+"");//卡2

注:這裡的info和info2都為獲取sim卡資訊中的值

6.獲取雙卡的服務提供商

1.獲取方法:
方法1:
//獲取TelephonyManager例項物件
TelephonyManager tm = (TelephonyManager) this.getSystemService(Context.TELEPHONY_SERVICE);
//獲取服務提供商的名字
String SPN1 = tm.getSimOperatorName();//卡1
方法2:
 /**
     * @param sir:sim卡的資訊
     * @return
     */
    private String getSimOperatorName(SubscriptionInfo sir) {
        if (sir == null) {
            return null;
        }
        return getSimOperatorName(sir.getSubscriptionId());
    }
    private String getSimOperatorName(int subId) {
        String simOperatorName = null;
        try {
            Method method = TelephonyManager.class.getDeclaredMethod("getSimOperatorNameForSubscription", int.class);
            simOperatorName = (String) method.invoke(tm, subId);
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return simOperatorName;
    }
使用:
 String SPN1 = getSimOperatorName(info1);
 String SPN2 = getSimOperatorName(info2);

注:此處的info1和info2均來自獲取sim卡資訊的值

7.獲取sim卡的卡槽

獲取方法:
List<SubscriptionInfo> list = new ArrayList<>();
//獲取SubscriptionManager物件
SubscriptionManager sm = SubscriptionManager.from(this);
list = sm.getActiveSubscriptionInfoList();//獲取所有sim卡的資訊集合
SubscriptionInfo info1 = list.get(0);//卡1的sim卡資訊
SubscriptionInfo info2 = list.get(1);//卡2的sim卡資訊

//獲取卡槽slotId
int slotId1 = info1.getSimSlotIndex();
int slotId2 = info2.getSimSlotIndex();

8.獲取sim卡的手機號碼

方法1(只能獲取到卡1的號碼)
 TelephonyManager tm = (TelephonyManager)this.getSystemService(Context.TELEPHONY_SERVICE);
        String te1 = tm.getLine1Number();//獲取卡1的號碼
方法2:
//獲取雙卡的手機號碼
    public static String getNumber(int slotId,Context context){
        Uri uri = Uri.parse("content://telephony/siminfo");
        Cursor cursor = null;
        ContentResolver contentResolver = context.getContentResolver();
        try {
            cursor = contentResolver.query(uri, new String[] {"number", "sim_id"}, "sim_id = ?", new String[] {String.valueOf(slotId)}, null);
            if (null != cursor) {
                if (cursor.moveToFirst()) {
                    String num = cursor.getString(cursor.getColumnIndex("number"));
                    Log.e("cursor","num為:"+num);
                    return num;
                }
            }
        } catch (Exception e) {
        } finally {
            if (null != cursor) {
                cursor.close();
            }
        }
        return null;
    }

小結:

這一部分為基礎知識,在實際開發中不一定會用到。請看雙卡雙待(二)

相關推薦

()

前言: 關於雙卡雙待這個問題,調研了幾個月終於有所進展,通過收集各方面的資料,整理出了這個文件。~~╭(╯^╰)╮ 1.獲取雙卡的subId 方法1: /** * @param slotId:卡槽的序號:0代表卡槽1,1代表卡槽2

聚焦鏈改,

在北京 cdd 北京時間 投資 們的 生態 整合 term ces “為了你我用了半年的積蓄,熬著夜來看你……”這說的大概就是蘋果發布會吧 蘋果的新產品發布會在北京時間9月13日淩晨一點舉行相信果粉們應該都沒有錯過這場盛會 然鵝....窮人才看發布會,土豪都是睡醒直接買這次

android實現異網識別運營商網路

檢測的程式碼 private void checkIMSi() {         boolean simStateBySlotIdx = SimUtils.getSimStateBySlotIdx(this, 0);     &n

華為手機聯通3G上網慢的解決辦法

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

AI技術的蘋果iPhone XS Max7納米6.5寸512GB頂配12799元(公號回覆“蘋果AI”下載PDF資料)

AI技術的蘋果iPhone XS Max雙卡雙待7納米6.5寸512GB頂配12799元(公號回覆“蘋果AI”下載PDF資料) 原創: 秦隴紀 科學Sciences 今天 科學Sciences導讀:北京時間9月13日凌晨1點、美國時間9月12日上午10點,蘋果2018秋季新品釋出會召

android-手機登入介面嘗試獲取手機號碼,並可選擇subscriptionId

LogonActivity.java public class LogonActivity extends Activity { private EditText nickET; private EditText passwordET; private E

android sim

Android的RIL驅動模組,在hardware/ril目錄下,一共分rild,libril.so以及librefrence_ril.so三個部分,另有一 radiooptions可供自動或手動除錯使用。都依賴於include目錄中ril.h標頭檔案。目前cupcake分支上帶的是gsm的支援,另有

android中的那些程式碼

這陣子忙著整理專案了,所以就沒怎麼出新的文章了,不過下面寫的這篇文章對大家很有幫助。關於雙卡雙待的資訊獲取,包含了imei、phonenumber、operatorName(sim卡生產商,國內就主要指三大運營商了)、NetworkType(這裡就主要是4G、3

Android獲取本機號碼(無法獲取兩個號碼)

        搞了一個想獲取Android手機的本機號碼的功能,但是發現雙卡雙待的手機是無法獲取到兩個號碼 的。在Android的官方文件是沒有提供相應的Api的,因為標準的Andoird是沒有雙卡的,好像也只有國內才會搞雙卡雙待的神器吧。以下記錄一下做這個功能所學習到的

getDeviceId unique device ID IMEI 不唯一 會變問題

最近接到使用者反饋無法登入的情況越來越多,因為我們的app設計上是不能換手機用,也就是綁定了唯一的裝置ID。從反饋上來看,有一個線索是大部分是雙卡雙待的使用者出現這個問題,並且切換過SIM卡。看來getDeviceId這個方法在雙卡雙待手機上獲取IMEI還是有問題的。 ge

Android

轉自這裡 一、雙卡雙待背景分析 使用者為了兼顧運營商優勢,使用雙卡雙待手機: 雙卡雙待這項技術在發展中國家使用很普遍,因為在發展中國家電信運營商發展不夠成熟,相關管理制度不完善。從使用者的角度出發,主要考慮資費問題,比如:移動通話訊號好,聯通3G上網流暢、流量費相

Android 識別

簡介Android雙卡雙待已經越來越普及了,解決雙卡雙待管理是廣大手機開發人員必須得面對的問題,為實現Android平臺的雙卡雙待操作,筆者研究了Android 應用層操作雙卡雙待的機制。機制獲取基於ITelephony介面實現phone應用中的“phone服務”,通過Tel

智慧手機之的實現方案

雙卡雙待的出現背景:         手機通訊發展到一定程度之後,很多使用者希望擁有或已經擁用多個手機電話號碼,特別是針對那些經常需要出差,需要經常切換SIM卡的商務人士而言,其迫切希望能將自己的手機承載多個電話號碼, 根據市場上的這一需求,能同時支援兩張SIM卡的

Android 解決的問題 mtk,展訊,高通

目前國內對於雙卡智慧手機的需求還是很大的,各種複雜的業務會涉及到雙卡模組;而android標準的api又不提供對雙卡的支援。導致國內雙卡模組標準混亂,各個廠商各玩各的。目前我知道的雙卡解決方案就有:mtk,展訊,高通,broadcom等。 由於公司業務需要,必須要對雙

DSDS,模,,單通,單通,概念及相互關係?【轉】

DSDS:雙卡雙待 DualSimDualStandby雙模:就是手機支援2鐘模式,可以有兩種情況:          1)是該手機有兩個卡插槽,一個支援模式A(比如WCDMA),一個支援模式B(比如CDMA2000)          2)天翼國際雙模卡,該卡同時支援CDMA2000和GSM。     

線路DNS解析分析

進行 dns解析 htm lib 子網 們的 1.10 位置 安裝 在企業網絡維護過程中我們經常會遇到這樣或那樣的奇怪問題,而很多問題需要有深厚的理論知識才能解決。而隨著網絡的飛速發展越來越多的中小企業開始嘗試通過多條線路來保證網絡的暢通,一方面雙網卡下的雙線接入可以保證我

centos7 網關的路由表配置

網絡雙網卡雙網關的路由表配置。搞過網絡通信的人都知道:一臺計算機不能有兩個網關。如果一臺計算機兩個網卡同時配置了不同的網關,那麽會導致計算機只有一個網卡能用。網絡結構如下圖:路由表解決的問題主要有兩個:雙網卡雙網關的同時使用,一臺電腦可以使用兩個網卡訪問兩個不同的網關。電腦可以通過20.41.200.203所

Centos 6.5IP網關配置

ip地址配置因公司業務需要需在服務器上配置電信,聯通兩個運營商的IP地址,實現數據分別從兩個地址傳輸,即兩個IP地址都能與外界網絡互通。當時我發現在服務器的兩塊網卡上分別配置兩個IP地址及網關,重啟網絡服務之後,系統會默認選取其中一塊網卡的網關做為數據傳輸網關,這樣造成的後果就是一塊網卡無法與外界通信,後來手

centos 7 網關配置問題

linux 雙網卡 雙網關 服務器雙網卡在不同的網段怎麽配置才能正常通訊?類似於雙線機房一個聯通一個電信的網,怎麽配置,是不是需要改什麽內核參數,我使用了策略路由,實現了可以通過兩個網卡去訪問服務器上的網站是沒有問題的,但是,我們服務器上的服務是通過UDP協議的流媒體服務器,向服務器推流就是不成功

redis 寫一致性 看篇成高手系列

首先,快取由於其高併發和高效能的特性,已經在專案中被廣泛使用。在讀取快取方面,大家沒啥疑問,都是按照下圖的流程來進行業務操作。 但是在更新快取方面,對於更新完資料庫,是更新快取呢,還是刪除快取。又或者是先刪除快取,再更新資料庫,其實大家存在很大的爭議。目前沒有一篇全面的部落格,對這幾種方案進行解