1. 程式人生 > >android獲取手機號

android獲取手機號

最近做一個專案 需要獲取到手機的相關資訊

一個朋友的看法:

從技術層面而言,手機的SIM卡上並不會儲存手機號碼資訊,只會儲存IMSIInternational Mobile Subscriber Identification Number)。手機號碼(MSISDN)都是登記在HLRHome Location Register)中的,在HLR中會把IMSIMSISDN關聯在一起。

 中國移動的SIM卡里只有IMSI號碼而沒有儲存手機號碼,在中國移動的HLR中會有一張對映表,專門用於把使用者手機SIM卡的IMSI號對映成為使用者的手機號碼,這就是移動丟卡不丟號的業務也就是緣於此,也是一卡多號的原理。而電信

CDMA(原來聯通CDMA)的機卡合一的手機卡里會同時存在IMSI和手機號碼。 

客戶端獲取:在客戶端對移動使用者而言只能夠獲取諸如IMSIIMEI號等,並不能直接獲得手機號。而對電信CDMA機卡合一使用者可以獲取手機號碼。
伺服器端獲取:在早期的移動白名單中是能夠獲得明文的手機號的,最近移動策略變了,手機號變成了天書般的唯一串號。因此目前從伺服器端直接獲取手機號也不行了。
 目前能夠想到的能夠相對可靠地自動獲取使用者手機號的方法只有通過簡訊方式。

通過簡訊方式:讓使用者上行一條簡訊,通過簡訊閘道器獲取使用者手機號,從而將使用者id與手機號繫結

另一個朋友的看法:


android 獲取手機號碼的方法 這裡就不說了,太簡單了。


手機號碼不是所有的都能獲取。只是有一部分可以拿到。這個是由於移動運營商沒有把手機號碼的資料寫入到sim卡中.SIM卡只有唯一的編號,供網路與裝置識別那就是IMSI號碼,手機的訊號也可以說是通過這個號碼在網路中傳遞的,並不是手機號碼。試想,你的SIM丟失後,補辦一張新的會換號碼嗎?是不會的.就是因為在你的手機號碼對應的IMSI號 在移動運營商中被修改成新SIM卡的IMSI號碼。
那麼手機號為什麼有的就能顯示呢?
這個就像是一個變數,當移動運營商為它賦值了,它自然就會有值。不賦值自然為空。
對於移動的使用者,手機號碼(MDN)儲存在運營商的伺服器中,而不是儲存在SIM卡里。SIM卡只保留了IMSI
和一些驗證資訊。手機每次入網註冊的時候,都會以簡訊的形式將IMSI及驗證資訊上傳到運營商的伺服器,伺服器在完成註冊動作之後,會以簡訊的形式將註冊的結果下發到手機裡。下發的內容會因條件不同而不同。
如果伺服器在下發的簡訊中,不包含手機的號碼,手機是無法取得電話號碼。如果簡訊中包含了號碼,手機才會將其快取,以備他用.此外,對於其他執行商的SIM卡或者UIM卡,MDN有可能儲存在UIM卡中。100%能夠取得本機號碼不太可能。
移動神州行,聯通的卡是可以取到的.動感地帶的取不到.別的卡還沒有試過.
能夠讀取SIM卡號的話應該有前提.那就是SIM卡已經寫入了本機號碼,不然是無法讀取的

TelephonyManager phoneMgr=(TelephonyManager)this.getSystemService(Context.TELEPHONY_SERVICE);

txtPhoneNumber.setText(phoneMgr.getLine1Number()); //txtPhoneNumber是一個EditText 用於顯示手機號

:

根據Android的安全機制,在使用TelephonyManager時,必須在AndroidManifest.xml中新增<uses-permission android:name="READ_PHONE_STATE" /> 否則無法獲得系統的許可。

手機型號 Build.MODEL

MODEL

The end-user-visible name for the end product.

sdk版本 Build.VERSION.SDK

SDK

This constant is deprecated. Use  to easily get this as an integer.

frimware版本號(系統版本號) Build.VERSION.RELEASE

The user-visible version string.

private void loadPhoneStatus(){ TelephonyManager phoneMgr=(TelephonyManager)this.getSystemService(Context.TELEPHONY_SERVICE); txtPhoneModel.setText(Build.MODEL); //手機型號 txtPhoneNumber.setText(phoneMgr.getLine1Number());//本機電話號碼 txtSdkVersion.setText(Build.VERSION.SDK);//SDK版本號 txtOsVersion.setText(Build.VERSION.RELEASE);//Firmware/OS 版本號}

事實上,Build能向我們提供包括 硬體廠商,硬體編號,序列號等很多資訊 呼叫方法也都同上,很簡單。

BOARD

The name of the underlying board, like "goldfish".

The system bootloader version number.

BRAND

The brand (e.g., carrier) the software is customized for, if any.

The name of the instruction set (CPU type + ABI convention) of native code.

The name of the second instruction set (CPU type + ABI convention) of native code.

The name of the industrial design.

A build ID string meant for displaying to the user

A string that uniquely identifies this build.

The name of the hardware (from the kernel command line or /proc).

ID

Either a changelist number, or a label like "M4-rc20".

The manufacturer of the product/hardware.

MODEL

The end-user-visible name for the end product.

The name of the overall product.

RADIO

The radio firmware version number.

A hardware serial number, if available.

TAGS

Comma-separated tags describing the build, like "unsigned,debug".

long

TIME

TYPE

The type of build, like "user" or "eng".

Value used for when a build property is unknown.

=================================================

首先我們來明確幾個概念:

SIM卡儲存的資料可分為四類:

第一類是固定存放的資料。這類資料在行動電話機被出售之前由SIM卡中心寫入,包括國際移動使用者識別號(IMSI)、鑑權金鑰(KI)、鑑權和加密演算法等等。

第二類是暫時存放的有關網路的資料。如位置區域識別碼(LAI)、移動使用者暫時識別碼(TMSI)、禁止接入的公共電話網程式碼等。

第三類是相關的業務程式碼,如個人識別碼(PIN)、解鎖碼(PUK)、計費費率等。

第四類是電話號碼簿,是手機使用者隨時輸入的電話號碼。使用者全部資料幾乎都儲存在SIM卡內,因此SIM卡又稱為使用者資料識別卡。

IMSI是一個唯一的數字, 標識了GSMUMTS 網路裡的唯一一個使用者它儲存 在手機的SIM卡里,它會通過手機發送到網路上. IMSI 與 SIM唯一對應

IMEI也是一串唯一的數字, 標識了 GSM 和 UMTS網路裡的唯一一個手機.它通常被列印在手機裡電池下面的那一面,撥 *#06# 也能看到它. IMEI 與 裝置唯一對應.

1IMEI不存在於SIM卡中,它是手機本身的串號。
2。通常我們所說的手機號也不存在於SIM卡中,雖然SIM卡中有一個專門儲存SIM卡本身號碼的地方,但是此號碼是通過手工設定的,而且是可以更改的。 SIM卡的識別通常使用IMSI號,這個對於SIM卡是唯一的。
3。使用SimGetRecordInfo之類的函式獲得SIM卡的IMSI號碼能否成功依賴於裝置製造商是否實現了此函式,據我所知在DOPOD的機器上是可以獲得,但是在聯想的機器上卻不行,其他機器沒有。
4。獲得IMEI以及IMSI可以通過RIL或者TAPI中的LINE操作的函式獲得。

下面給出獲取手機本機號碼的程式碼:

TelephonyManager tm = (TelephonyManager) this.getSystemService(Context.TELEPHONY_SERVICE);

String deviceid = tm.getDeviceId();

String tel = tm.getLine1Number();

String imei = tm.getSimSerialNumber();

String imsi = tm.getSubscriberId();

新增許可權:

<uses-permission android:name="android.permission.READ_PHONE_STATE" />

注意,手機號碼不是所有的都能獲取。只是有一部分可以拿到。這個是由於移動運營商沒有把手機號碼的資料寫入到sim卡中。這個就像是一個變數,當移動運營商為它賦值了,它自然就會有值。不賦值自然為空。這就是為什麼很多人得不到本機號碼的原因。

這裡才是我寫的,上面都是開發過程中,轉自別的朋友們的有用的資料,在此謝過。這個是我們的測試結果,不同手機,不同卡會得到不同的結果,下面的測試資料也不是絕對的。

運營商 卡型別 結果

中國移動 動感地帶:3.0 獲取不到

中國移動 神州行卡 可以獲取

中國移動  全球通 可以獲取

中國電信 全球漫遊天翼國際卡 獲取不到

中國聯通 世界風 64K OTA 獲取不到

中國聯通 沃 128K USIM 可以獲取