String version_release = Build.VERSION.RELEASE; // 設(shè)備的系統(tǒng)版本// 獲取設(shè)備號(hào)TelephonyManager var1 = (TelephonyManager)getapplicationContext().getSystemService(TELEPHONY_SERVICE);String deviceId = var1.getDeviceId();在Android平臺(tái)中,通過(guò)TelephonyManager可以訪問(wèn)與手機(jī)通訊相關(guān)的信息,比如設(shè)備信息、網(wǎng)絡(luò)信息及SIM卡信息,同時(shí)還可以監(jiān)聽電話的相關(guān)狀態(tài)。下面我們通過(guò)幾個(gè)方面來(lái)說(shuō)明Android平臺(tái)中如何使用電話技術(shù)。1、獲取TelephonyManager對(duì)象TelephonyManager類提供的主要的方法: Public Methodsint getCallState()返回一個(gè)常數(shù),表示設(shè)備上的呼叫狀態(tài)CellLocation getCellLocation()返回設(shè)備的當(dāng)前位置。int getDataActivity()返回一個(gè)常數(shù),表示活動(dòng)的數(shù)據(jù)連接的類型。int getDataState()返回一個(gè)常數(shù)表示當(dāng)前數(shù)據(jù)連接狀態(tài) String getDeviceId()返回唯一的設(shè)備ID,例如,IMEI GSM和MEID CDMA手機(jī)。String getDeviceSoftwareVersion()返回設(shè)備的軟件版本號(hào),例如,的IMEI / SV GSM手機(jī)。String getLine1Number()返回1號(hào)線的電話號(hào)碼,例如,MSISDN用于GSM電話。List<NeighboringCellInfo> getNeighboringCellInfo()返回設(shè)備的相鄰小區(qū)信息。String getNetworkCountryIso()返回注冊(cè)的網(wǎng)絡(luò)運(yùn)營(yíng)商的國(guó)家代碼String getNetworkOperator()返回的MCC +跨國(guó)公司的注冊(cè)網(wǎng)絡(luò)運(yùn)營(yíng)商String getNetworkOperatorName()返回注冊(cè)的網(wǎng)絡(luò)運(yùn)營(yíng)商的名字int getNetworkType()返回一個(gè)常數(shù),表示目前在設(shè)備上使用的無(wú)線電技術(shù)(網(wǎng)絡(luò)類型)。int getPhoneType()返回設(shè)備的類型(手機(jī)制式)。String getSimCountryIso() 返回SIM卡運(yùn)營(yíng)商的國(guó)家代碼String getSimOperator()返回MCC +跨國(guó)公司(移動(dòng)國(guó)家代碼+移動(dòng)網(wǎng)絡(luò)代碼)的提供者的SIM卡。String getSimOperatorName()返回服務(wù)提供者的名稱(SPN)。String getSimSerialNumber()返回SIM卡的序列號(hào),如果適用的話。int getSimState()返回一個(gè)常數(shù)表示SIM卡設(shè)備的狀態(tài)。String getSubscriberId()返回唯一的用戶ID,例如,IMSI為GSM手機(jī)。String getVoiceMailAlphaTag()檢索與語(yǔ)音信箱號(hào)碼相關(guān)的字母標(biāo)識(shí)符。String getVoiceMailNumber()返回語(yǔ)音信箱號(hào)碼。boolean hasIccCard()boolean isNetworkRoaming()返回true,如果該設(shè)備被認(rèn)為是漫游當(dāng)前網(wǎng)絡(luò)上,支持GSM目的。void listen(PhoneStateListener listener, int events)注冊(cè)一個(gè)偵聽器對(duì)象接收改變指定的電話狀態(tài)的通知。TelephonyManager telephonyManager = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);2、通過(guò)TelephonyManager獲取設(shè)備信息String phoneTypeStr = "未知";int phoneType = telephonyManager.getPhoneType();switch (phoneType){ case TelephonyManager.PHONE_TYPE_CDMA: phoneTypeStr="CDMA"; break; case TelephonyManager.PHONE_TYPE_GSM: phoneTypeStr="GSM"; break; case TelephonyManager.PHONE_TYPE_Sip: phoneTypeStr="SIP"; break; case TelephonyManager.PHONE_TYPE_NONE: phoneTypeStr="None"; break;}addTelephoneView("電話類型",phoneTypeStr);//GSM--IMEI CDMA--MEIDString deviceId = telephonyManager.getDeviceId();addTelephoneView("設(shè)備編號(hào)",deviceId);//軟件版本編號(hào)String softVersion = telephonyManager.getDeviceSoftwareVersion();addTelephoneView("軟件版本",softVersion);//手機(jī)號(hào)碼(不一定能獲取到)String phoneNumber = telephonyManager.getLine1Number();addTelephoneView("手機(jī)號(hào)碼",phoneNumber);3、通過(guò)TelephonyManager獲取網(wǎng)絡(luò)信息 //網(wǎng)絡(luò)信息:連接到一個(gè)網(wǎng)絡(luò)時(shí)有效,如果是CDMA則不一定有效//國(guó)家ISO代碼String networkCountry = telephonyManager.getNetworkCountryIso();addTelephoneView("國(guó)家ISO代碼",networkCountry);//運(yùn)營(yíng)商信息String networkOperatorId = telephonyManager.getNetworkOperator();addTelephoneView("運(yùn)營(yíng)商編號(hào)",networkOperatorId);String networkOperatorName=telephonyManager.getNetworkOperatorName();addTelephoneView("運(yùn)營(yíng)商名稱",networkOperatorName);//網(wǎng)絡(luò)連接狀態(tài)int networktype = telephonyManager.getNetworkType();addTelephoneView("網(wǎng)絡(luò)類型",networktype+"");4、通過(guò)TelephonyManager獲取SIM卡信息 //SIM卡的狀態(tài)int simState = telephonyManager.getSimState();switch (simState){ case TelephonyManager.SIM_STATE_READY: //SIM卡的ISO國(guó)家代碼 String simISO = telephonyManager.getSimCountryIso(); addTelephoneView("SIM國(guó)家ISO",simISO); //SIM卡的運(yùn)營(yíng)商代碼 String simOperator = telephonyManager.getSimOperator(); addTelephoneView("SIM運(yùn)營(yíng)商編號(hào)",simOperator); //SIM的運(yùn)營(yíng)商名稱 String simOperatorName = telephonyManager.getSimOperatorName(); addTelephoneView("SIM運(yùn)營(yíng)商名稱",simOperatorName); //SIM的序列號(hào)‘ String number = telephonyManager.getSimSerialNumber(); addTelephoneView("SIM序列號(hào)",number); break;} 注意獲取信息的時(shí)候需要添加如下權(quán)限:<uses-permission android:name="android.permission.READ_PHONE_STATE"/>5、通過(guò)繼承PhoneStateListener,使用TelephonyManager注冊(cè)后進(jìn)行監(jiān)聽電話狀態(tài)。PhoneStateListener可以通過(guò)重寫方法onCallStateChanged、onDataConnectionStateChanged、onDataActivity等方法對(duì)來(lái)電狀態(tài)、數(shù)據(jù)連接狀態(tài)、數(shù)據(jù)傳輸狀態(tài)進(jìn)行監(jiān)聽。 通過(guò)TelephonyManager.listen方法進(jìn)行注冊(cè),該方法有兩個(gè)參數(shù),一個(gè)參數(shù)為PhoneStateListener,第二個(gè)參數(shù)為監(jiān)聽標(biāo)志,決定了監(jiān)聽哪些狀態(tài)。 PhoneStateListener的之類代碼如下://定義電話狀態(tài)監(jiān)聽器PRivate PhoneStateListener listener = new PhoneStateListener(){ @Override public void onCallStateChanged(int state, String incomingNumber) { super.onCallStateChanged(state, incomingNumber); String msg = "未知"; switch (state){ case TelephonyManager.CALL_STATE_IDLE: msg="電話空閑"; break; case TelephonyManager.CALL_STATE_RINGING: msg = incomingNumber+"來(lái)電話了,響鈴中……"; break; case TelephonyManager.CALL_STATE_OFFHOOK: msg = "電話中……"; break; } Toast.makeText(TelephonyActivity.this,msg,Toast.LENGTH_LONG).show(); } @Override public void onDataConnectionStateChanged(int state) { super.onDataConnectionStateChanged(state); String msg = "未知"; switch (state){ case TelephonyManager.DATA_CONNECTED: msg="數(shù)據(jù)已連接"; break; case TelephonyManager.DATA_CONNECTING: msg = "數(shù)據(jù)正在連接中……"; break; case TelephonyManager.DATA_DISCONNECTED: msg = "數(shù)據(jù)已關(guān)閉!"; break; } show.setText(msg); } @Override public void onDataActivity(int direction) { super.onDataActivity(direction); String msg = "未知"; switch (direction){ case TelephonyManager.DATA_ACTIVITY_IN: msg = "下載"; break; case TelephonyManager.DATA_ACTIVITY_OUT: msg = "上傳"; break; case TelephonyManager.DATA_ACTIVITY_INOUT: msg = "下載/上傳"; break; case TelephonyManager.DATA_ACTIVITY_NONE: msg = "未知"; break; } show.setText(msg); }};注冊(cè)代碼:telephonyManager.listen(listener, PhoneStateListener.LISTEN_CALL_STATE |PhoneStateListener.LISTEN_DATA_CONNECTION_STATE |PhoneStateListener.LISTEN_DATA_ACTIVITY);注銷代碼:telephonyManager.listen(listener,PhoneStateListener.LISTEN_NONE);6、通過(guò) BroadcastReceiver接收廣播監(jiān)聽電話的狀態(tài)。當(dāng)撥打電話時(shí)系統(tǒng)會(huì)發(fā)送 Intent.ACTION_NEW_OUTGOING_CALL廣播,當(dāng)電話狀態(tài)發(fā)生變化的時(shí)候,系統(tǒng)會(huì)發(fā)送 TelephonyManager.ACTION_PHONE_STATE_CHANGED廣播,我們通過(guò)接收這兩個(gè)廣播來(lái)監(jiān)聽電話的相關(guān)狀態(tài)BroadcastReceiver的關(guān)鍵代碼如下:if(intent.getAction().equals(Intent.ACTION_NEW_OUTGOING_CALL)){ //去電 String phoneNumber = intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER); }else if(intent.getAction().equals(TelephonyManager.ACTION_PHONE_STATE_CHANGED)){ //來(lái)電 String state = intent.getStringExtra(TelephonyManager.EXTRA_STATE); if(state.equals(TelephonyManager.EXTRA_STATE_RINGING)){ //有來(lái)電,響鈴中 //TelephonyManager.EXTRA_STATE_IDLE; //TelephonyManager.EXTRA_STATE_OFFHOOK String phoneNumber= intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER); //比對(duì)電話號(hào)碼 if(null !=backNumber && null != phoneNumber && backNumber.endsWith(phoneNumber)){ //掛掉電話 //AIDL Android接口定義語(yǔ)言 //IPC ITelephony iTelephony = getITelephony(context); try { iTelephony.endCall(); } catch (RemoteException e) { e.printStackTrace(); } finally { } } }else if(state.equals(TelephonyManager.EXTRA_STATE_IDLE)){ // }else if(state.equals(TelephonyManager.EXTRA_STATE_OFFHOOK)){ } }}在清單文件中注冊(cè):<receiver android:name=".receiver.PhoneStateChanagedReceiver"> <intent-filter> <action android:name="android.intent.action.NEW_OUTGOING_CALL"/> <action android:name="android.intent.action.PHONE_STATE"/> </intent-filter></receiver>注意此處需要如下權(quán)限:<uses-permission android:name="android.permission.READ_PHONE_STATE"/><uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"/>7、電話攔截,在 6的基礎(chǔ)上,完成電話攔截操作,這里需要使用到 ITelephony.aidl。首先在 Android Studio的對(duì)應(yīng)的 Module中創(chuàng)建 aidl目錄,和 java目錄同級(jí),在該目錄下創(chuàng)建 com.android.internal.telephony包和 android.telephony包,然后拷貝 ITelephony.aidl和 NeighboringCellInfo.aidl到對(duì)應(yīng)的包下,然后從新構(gòu)建。通過(guò)反射拿到 ITelephony對(duì)象并調(diào)用 endCall方法掛斷電話。關(guān)鍵代碼如下:private static ITelephony getITelephony(Context context){ ITelephony iTelephony = null; TelephonyManager telephonyManager=(TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); Class<TelephonyManager> c = TelephonyManager.class; Method getITelephoneyMethod = null; try { getITelephoneyMethod = c.getDeclaredMethod("getITelephony",(Class[])null); getITelephoneyMethod.setaccessible(true); iTelephony = (ITelephony)getITelephoneyMethod.invoke(telephonyManager,(Object[])null); } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } return iTelephony;}作者: 杰瑞教育出處: http://www.cnblogs.com/jerehedu/版權(quán)聲明:本文版權(quán)歸 煙臺(tái)杰瑞教育科技有限公司 和博客園共有,歡迎轉(zhuǎn)載,但未經(jīng)作者同意必須保留此段聲明,且在文章頁(yè)面明顯位置給出原文連接,否則保留追究法律責(zé)任的權(quán)利。==========================================================================================================================
在開發(fā)中 我們有時(shí)候會(huì)需要獲取當(dāng)前手機(jī)的系統(tǒng)版本來(lái)進(jìn)行判斷,或者需要獲取一些當(dāng)前手機(jī)的硬件信息。
android.os.Build類中。包括了這樣的一些信息。我們可以直接調(diào)用 而不需要添加任何的權(quán)限和方法。
android.os.Build.BOARD:獲取設(shè)備基板名稱
android.os.Build.BOOTLOADER:獲取設(shè)備引導(dǎo)程序版本號(hào)
android.os.Build.BRAND:獲取設(shè)備品牌
android.os.Build.CPU_ABI:獲取設(shè)備指令集名稱(CPU的類型)
android.os.Build.CPU_ABI2:獲取第二個(gè)指令集名稱
android.os.Build.DEVICE:獲取設(shè)備驅(qū)動(dòng)名稱
android.os.Build.DISPLAY:獲取設(shè)備顯示的版本包(在系統(tǒng)設(shè)置中顯示為版本號(hào))和ID一樣
android.os.Build.FINGERPRINT:設(shè)備的唯一標(biāo)識(shí)。由設(shè)備的多個(gè)信息拼接合成。
android.os.Build.HARDWARE:設(shè)備硬件名稱,一般和基板名稱一樣(BOARD)
android.os.Build.HOST:設(shè)備主機(jī)地址
android.os.Build.ID:設(shè)備版本號(hào)。
android.os.Build.MODEL :獲取手機(jī)的型號(hào) 設(shè)備名稱。
android.os.Build.MANUFACTURER:獲取設(shè)備制造商
android:os.Build.PRODUCT:整個(gè)產(chǎn)品的名稱
android:os.Build.RADIO:無(wú)線電固件版本號(hào),通常是不可用的 顯示unknown
android.os.Build.TAGS:設(shè)備標(biāo)簽。如release-keys 或測(cè)試的 test-keys
android.os.Build.TIME:時(shí)間
android.os.Build.TYPE:設(shè)備版本類型 主要為"user" 或"eng".
android.os.Build.USER:設(shè)備用戶名 基本上都為android-build
android.os.Build.VERSION.RELEASE:獲取系統(tǒng)版本字符串。如4.1.2 或2.2 或2.3等
android.os.Build.VERSION.CODENAME:設(shè)備當(dāng)前的系統(tǒng)開發(fā)代號(hào),一般使用REL代替
android.os.Build.VERSION.INCREMENTAL:系統(tǒng)源代碼控制值,一個(gè)數(shù)字或者git hash值
android.os.Build.VERSION.SDK:系統(tǒng)的API級(jí)別 一般使用下面大的SDK_INT 來(lái)查看
android.os.Build.VERSION.SDK_INT:系統(tǒng)的API級(jí)別 數(shù)字表示
android.os.Build.VERSION_CODES類 中有所有的已公布的Android版本號(hào)。全部是Int常亮??捎糜谂cSDK_INT進(jìn)行比較來(lái)判斷當(dāng)前的系統(tǒng)版本
但是在6.0上面打電話需要?jiǎng)討B(tài)請(qǐng)求權(quán)限,所以代碼又改成這樣:if (Build.VERSION.SDK_INT >= 23) { //判斷有沒(méi)有撥打電話權(quán)限 if (PermissionChecker.checkSelfPermission(context, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) { //請(qǐng)求撥打電話權(quán)限 ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CALL_PHONE}, REQUEST_CODE); } else { callPhone("號(hào)碼"); } } else { callPhone("號(hào)碼"); }
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注