當前位置:首頁 » 安卓系統 » android獲取imsi

android獲取imsi

發布時間: 2025-07-20 08:42:24

1. 如何修改android模擬器上的IMEI,IMSI,SIM card serial number

手機使用IMEI和IMSI登錄到GSM網路的,由GSM網路側負責將IMSI和映射成手機號(MSISDN),以及執行相反方向的映射。

(一)、SIM card 號的修改:
SIM card號就是印製在SIM上的一串數字。
讀SIM card號的AT命令為:AT+CRSM=176,12258,0,0,10
因此在andorid模擬其源碼中找到該AT命令——在sim_card.c中:
const char*
asimcard_io( ASimCard sim, const char* cmd )
{
int nn;
#if ENABLE_DYNAMIC_RECORDS
int command, id, p1, p2, p3;
#endif
static const struct { const char* cmd; const char* answer; } answers[] =
{
{ "+CRSM=192,28436,0,0,15", "+CRSM: 144,0," },
{ "+CRSM=176,28436,0,0,20", "+CRSM: 144,0," },

{ "+CRSM=192,28433,0,0,15", "+CRSM: 144,0," },
{ "+CRSM=176,28433,0,0,1", "+CRSM: 144,0,55" },

{ "+CRSM=192,12258,0,0,15", "+CRSM: 144,0," },
{ "+CRSM=176,12258,0,0,10", "+CRSM: 144,0,98101430121181157002" },

...

...

因此用UE二進制方式打開emulator-arm.exe 或 emulator-x86.exe,並搜索字元串「98101430121181157002」,然後將其修改成需要的SIM card號。
比如:
00209a00h: 31 30 00 00 2B 43 52 53 4D 3A 20 31 34 34 2C 30 ; 10..+CRSM: 144,0
00209a10h: 2C 39 38 31 30 31 34 33 30 31 32 31 31 38 31 31 ; ,981014301211811
00209a20h: 35 37 30 30 32 00 2B 43 52 53 4D 3D 31 39 32 2C ; 57002.+CRSM=192,

(二)、IMEI、IMSI號的修改:

Java代碼中獲取手機的IMEI號與ISMI號途徑為:

TelephonyManager manager = (TelephonyManager)getSystemService(TELEPHONY_SERVICE);
String imei = manager.getDeviceId();
String imsi = manager.getSubscriberId();

在android的源碼樹中找到類TelephonyManager的實現:
成員函數getDeviceId:
/**
* Returns the unique device ID, for example, the IMEI for GSM and the MEID
* or ESN for CDMA phones. Return null if device ID is not available.
*
* <p>Requires Permission:
* {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE}
*/
public String getDeviceId() {
try {
return getSubscriberInfo().getDeviceId();
} catch (RemoteException ex) {
return null;
} catch (NullPointerException ex) {
return null;
}
}

成員函數getSubscriberId:
/**
* Returns the unique subscriber ID, for example, the IMSI for a GSM phone.
* Return null if it is unavailable.
* <p>
* Requires Permission:
* {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE}
*/
public String getSubscriberId() {
try {
return getSubscriberInfo().getSubscriberId();
} catch (RemoteException ex) {
return null;
} catch (NullPointerException ex) {
// This could happen before phone restarts e to crashing
return null;
}
}

上面兩個成員函數最終調用共同的一個私有成員函數getSubscriberInfo():
private IPhoneSubInfo getSubscriberInfo() {
// get it each time because that process crashes a lot
return IPhoneSubInfo.Stub.asInterface(ServiceManager.getService("iphonesubinfo"));
}

而上面私有函數getSubscriberInfo獲取的手機IMSI和IMEI號被硬編碼在文件android_modem.c中:
/* the Android GSM stack checks that the operator's name has changed
* when roaming is on. If not, it will not update the Roaming status icon
*
* this means that we need to emulate two distinct operators:
* - the first one for the 'home' registration state, must also correspond
* to the emulated user's IMEI
*
* - the second one for the 'roaming' registration state, must have a
* different name and MCC/MNC
*/

#define OPERATOR_HOME_INDEX 0
#define OPERATOR_HOME_MCC 310
#define OPERATOR_HOME_MNC 260
#define OPERATOR_HOME_NAME "Android"
#define OPERATOR_HOME_MCCMNC STRINGIFY(OPERATOR_HOME_MCC) \
STRINGIFY(OPERATOR_HOME_MNC)

#define OPERATOR_ROAMING_INDEX 1
#define OPERATOR_ROAMING_MCC 310
#define OPERATOR_ROAMING_MNC 295
#define OPERATOR_ROAMING_NAME "TelKila"
#define OPERATOR_ROAMING_MCCMNC STRINGIFY(OPERATOR_ROAMING_MCC) \
STRINGIFY(OPERATOR_ROAMING_MNC)
/* a function used to deal with a non-trivial request */
typedef const char* (*ResponseHandler)(const char* cmd, AModem modem);

static const struct {
const char* cmd; /* command coming from libreference-ril.so, if first
character is '!', then the rest is a prefix only */

const char* answer; /* default answer, NULL if needs specific handling or
if OK is good enough */

ResponseHandler handler; /* specific handler, ignored if 'answer' is not NULL,
NULL if OK is good enough */
} sDefaultResponses[] =
{
/* see onRadioPowerOn() */
{ "%CPHS=1", NULL, NULL },
{ "%CTZV=1", NULL, NULL },

...

{ "!+VTS=", NULL, handleSetDialTone },
{ "+CIMI", OPERATOR_HOME_MCCMNC "000000000", NULL }, /* request internation subscriber identification number */
{ "+CGSN", "000000000000000", NULL }, /* request model version */
{ "+CUSD=2",NULL, NULL }, /* Cancel USSD */

...

/* end of list */
{NULL, NULL, NULL}

};

因此用UE二進制方式打開emulator-arm.exe 或 emulator-x86.exe,並搜索字元串"+CGSN"修改為需要的IMEI號;搜索"+CIMI"修改為需要的IMSI號。需要注意的是 IMSI 號的頭六個數字"310260"不能修改,否則模擬器無法與網路連接。
例如:
001fc700h: 33 00 41 00 48 00 21 2B 56 54 53 3D 00 2B 43 49 ; 3.A.H.!+VTS=.+CI
001fc710h: 4D 49 00 33 31 30 32 36 30 30 30 30 30 30 30 30 ; MI.3102600000000
001fc720h: 30 30 00 2B 43 47 53 4E 00 30 30 30 30 30 30 30 ; 00.+CGSN.0000000
001fc730h: 30 30 30 30 30 30 30 30 00 2B 43 55 53 44 3D 32 ; 00000000.+CUSD=2

2. Android 判斷SIM卡屬於哪個移動運營商

第一種方法:
獲取手機的IMSI碼,並判斷是中國移動\中國聯通\中國電信
TelephonyManager telManager = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
/** 獲取SIM卡的IMSI碼
* SIM卡唯一標識:IMSI 國際移動用戶識別碼(IMSI:InternationalMobile Subscriber Identification Number)是區別移動用戶的標志,
* 儲存在SIM卡中,可用於區別移動用戶的有效信息。IMSI由MCC、MNC、MSIN組成,其中MCC為移動國家號碼,由3位數字組成,
*唯一地識別移動客戶所屬的國家,我國為460;MNC為網路id,由2位數字組成,
*用於識別移動客戶所歸屬的移動網路,中國移動為00,中國聯通為01,中國電信為03;MSIN為移動客戶識別碼,採用等長11位數字構成。
* 唯一地識別國內GSM移動通信網中移動客戶。所以要區分是移動還是聯通,只需取得SIM卡中的MNC欄位即可
*/
Stringimsi = telManager.getSubscriberId();
if(imsi!=null){
if(imsi.startsWith("46000") ||imsi.startsWith("46002")){//因為移動網路編號46000下的IMSI已經用完,所以虛擬了一個46002編號,134/159號段使用了此編號
//中國移動
}elseif(imsi.startsWith("46001")){
//中國聯通
}elseif(imsi.startsWith("46003")){
//中國電信
}
}

第二種方法
TelephonyManager telManager = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
Stringoperator = telManager.getSimOperator();
if(operator!=null){
if(operator.equals("46000") ||operator.equals("46002")){
//中國移動
}elseif(operator.equals("46001")){
//中國聯通
}elseif(operator.equals("46003")){
//中國電信
}
}

3. android 判斷是否有sim卡及運營商

獲取IMSI串號是判斷Android設備是否插入SIM卡及識別運營商的一種方法。若IMSI為空,則表示未插入SIM卡。IMSI的前三位數字被稱為國家碼,其中1~3位數字為460表示是中國運營商,若非460則為境外運營商。IMSI的第4至第5位是運營商代碼:移動運營商的代碼為00、02、04、07,中國聯通GSM系統的代碼為01、06,中國電信的代碼為03、05、11,鐵通運營商的代碼為20。然而,這種方法存在一定的局限性。例如,在雙卡手機中,Android SDK僅能獲取到第一張SIM卡的IMSI。至於哪張卡是第一張,這取決於手機的品牌和型號,各品牌手機對此有不同的處理方式。

由於Android SDK僅能讀取第一張SIM卡的IMSI,因此在雙卡手機中,此方法可能無法准確識別第二張SIM卡的信息。例如,如果用戶希望了解第二張SIM卡的信息,或者希望在同一應用中處理多張SIM卡,就需要使用其他方法。這涉及到更復雜的API或第三方庫,這些方法可能需要更多的開發工作和測試。

此外,不同品牌和型號的手機在處理SIM卡信息方面存在差異。例如,某些品牌可能將第一張SIM卡視為默認卡,而另一些品牌可能讓用戶自行選擇默認卡。因此,在開發應用時需要考慮到這些差異,以便為用戶提供一致且准確的體驗。

值得注意的是,獲取SIM卡信息可能涉及到用戶隱私,因此在開發應用時需要遵守相關的隱私政策和法律法規。開發者需要確保用戶同意並授權應用訪問SIM卡信息,以符合用戶隱私保護的要求。

總而言之,盡管獲取IMSI串號是一種簡單有效的判斷Android設備是否插入SIM卡及識別運營商的方法,但其局限性在於僅能讀取第一張SIM卡的信息,並且不同品牌和型號的手機對此有不同的處理方式。開發者在開發應用時需要考慮到這些局限性和差異,以便為用戶提供最佳體驗。

4. 如何獲取Android設備唯一識別碼

DEVICE_ID
這是Android系統為開發者提供的用於標識手機設備的串號,也是各種方法中普適性較高的,可以說幾乎所有的設備都可以返回這個串號,並且唯一性良好。
這個DEVICE_ID可以同通過下面的方法獲取:
TelephonyManager tm = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE); String DEVICE_ID = tm.getDeviceId();

它會根據不同的手機設備返回IMEI,MEID或者ESN碼,但在使用的過程中有以下問題:
非手機設備:最開始搭載Android系統都手機設備,而現在也出現了非手機設備:如平板電腦、電子書、電視、音樂播放器等。這些設備沒有通話的硬體功能,系統中也就沒有TELEPHONY_SERVICE,自然也就無法通過上面的方法獲得DEVICE_ID。
許可權問題:獲取DEVICE_ID需要READ_PHONE_STATE許可權,如果只是為了獲取DEVICE_ID而沒有用到其他的通話功能,申請這個許可權一來大才小用,二來部分用戶會懷疑軟體的安全性。
廠商定製系統中的Bug:少數手機設備上,由於該實現有漏洞,會返回垃圾,如:zeros或者asterisks
MAC ADDRESS
可以使用手機Wifi或藍牙的MAC地址作為設備標識,但是並不推薦這么做,原因有以下兩點:
硬體限制:並不是所有的設備都有Wifi和藍牙硬體,硬體不存在自然也就得不到這一信息。
獲取的限制:如果Wifi沒有打開過,是無法獲取其Mac地址的;而藍牙是只有在打開的時候才能獲取到其Mac地址。
獲取Wifi Mac地址:
獲取藍牙 Mac地址:
Sim Serial Number
裝有SIM卡的設備,可以通過下面的方法獲取到Sim Serial Number:
TelephonyManager tm = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE); String SimSerialNumber = tm.getSimSerialNumber();

注意:對於CDMA設備,返回的是一個空值!
ANDROID_ID
在設備首次啟動時,系統會隨機生成一個64位的數字,並把這個數字以16進制字元串的形式保存下來,這個16進制的字元串就是ANDROID_ID,當設備被wipe後該值會被重置。可以通過下面的方法獲取:
import android.provider.Settings; String ANDROID_ID = Settings.System.getString(getContentResolver(), Settings.System.ANDROID_ID);

ANDROID_ID可以作為設備標識,但需要注意:
廠商定製系統的Bug:不同的設備可能會產生相同的ANDROID_ID:9774d56d682e549c。
廠商定製系統的Bug:有些設備返回的值為null。
設備差異:對於CDMA設備,ANDROID_ID和TelephonyManager.getDeviceId() 返回相同的值。
Serial Number
Android系統2.3版本以上可以通過下面的方法得到Serial Number,且非手機設備也可以通過該介面獲取。
String SerialNumber = android.os.Build.SERIAL;

熱點內容
程序化交易演算法 發布:2025-07-20 13:09:58 瀏覽:970
已關閉伺服器是什麼意思 發布:2025-07-20 13:06:49 瀏覽:707
三星s5密碼多少錢 發布:2025-07-20 12:55:14 瀏覽:961
密碼忘記了怎麼找回 發布:2025-07-20 12:46:18 瀏覽:534
華為的密碼鎖為什麼開不了 發布:2025-07-20 12:45:35 瀏覽:133
app登錄密碼在哪裡 發布:2025-07-20 12:22:31 瀏覽:693
python私有成員變數 發布:2025-07-20 12:03:05 瀏覽:413
創建表的存儲過程 發布:2025-07-20 12:01:27 瀏覽:857
安卓怎麼給girl999投票 發布:2025-07-20 11:53:58 瀏覽:569
linux卸載openoffice 發布:2025-07-20 11:48:42 瀏覽:394