Android開原始碼解讀の使用TelephonyManager擷取移動網路資訊

來源:互聯網
上載者:User

本文介紹使用TelephonyManager來擷取手機SIM卡的狀態和移動網路的相關資訊,主要使用了TelephonyManager.listen函數,這個函數源碼如下:

public void listen(PhoneStateListener listener, int events) {<br /> String pkgForDebug = mContext != null ? mContext.getPackageName() : "<unknown>";<br /> try {<br /> Boolean notifyNow = (getITelephony() != null);<br /> mRegistry.listen(pkgForDebug, listener.callback, events, notifyNow);<br /> } catch (RemoteException ex) {<br /> // system process dead<br /> } catch (NullPointerException ex) {<br /> // system process dead<br /> }<br />}

具體的實現不是本文的重點,這裡只來瞭解函數的兩個參數:

1)PhoneStateListener listener

一般根據events的值,來實現相應的回呼函數介面,在回呼函數裡面執行我們的處理,這些介面包括:

public void onServiceStateChanged(ServiceState serviceState)<br />public void onMessageWaitingIndicatorChanged(boolean mwi)<br />public void onCallForwardingIndicatorChanged(boolean cfi)<br />public void onCellLocationChanged(CellLocation location)<br />public void onCallStateChanged(int state, String incomingNumber)<br />public void onDataConnectionStateChanged(int state)<br />public void onDataConnectionStateChanged(int state, int networkType)<br />public void onDataActivity(int direction)<br />public void onSignalStrengthsChanged(SignalStrength signalStrength)

2)int events

Events取值如下:

public static final int LISTEN_NONE = 0; //停止監聽<br />public static final int LISTEN_SERVICE_STATE = 0x00000001;<br />public static final int LISTEN_MESSAGE_WAITING_INDICATOR = 0x00000004;<br />public static final int LISTEN_CALL_FORWARDING_INDICATOR = 0x00000008;<br />public static final int LISTEN_CELL_LOCATION = 0x00000010;<br />public static final int LISTEN_CALL_STATE = 0x00000020;<br />public static final int LISTEN_DATA_CONNECTION_STATE = 0x00000040;<br />public static final int LISTEN_DATA_ACTIVITY = 0x00000080;<br />public static final int LISTEN_SIGNAL_STRENGTHS = 0x00000100;

下面就是使用了上面知識點的代碼了,先看布局檔案network_detector.xml:

<?xml version="1.0" encoding="utf-8"?><br /><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"<br /> android:orientation="vertical"<br /> android:layout_width="fill_parent"<br /> android:layout_height="fill_parent"<br /> ><br /> <TextView android:id="@+id/phone_type"<br /> android:layout_width="fill_parent"<br /> android:layout_height="wrap_content" /><br /> <TextView android:id="@+id/network_name"<br /> android:layout_width="fill_parent"<br /> android:layout_height="wrap_content" /><br /> <TextView android:id="@+id/sim_state"<br /> android:layout_width="fill_parent"<br /> android:layout_height="wrap_content" /><br /> <TextView android:id="@+id/network_type"<br /> android:layout_width="fill_parent"<br /> android:layout_height="wrap_content" /><br /></LinearLayout>

完整Java代碼如下(對APIDemos的解析,有刪改):

package hust.iprai.asce1885;</p><p>import android.app.Activity;<br />import android.os.Bundle;<br />import android.telephony.PhoneStateListener;<br />import android.telephony.ServiceState;<br />import android.telephony.TelephonyManager;<br />import android.widget.TextView;</p><p>public class NetworkDetector extends Activity {</p><p>//SIM卡狀態常量<br />private static final String SIM_ABSENT = "Absent"; //手機內無SIM卡<br />private static final String SIM_READY = "Ready"; //SIM卡已準備好<br />private static final String SIM_PIN_REQUIRED = "PIN required"; //需要SIM卡的PIN解鎖<br />private static final String SIM_PUK_REQUIRED = "PUK required"; //需要SIM卡的PUK解鎖<br />private static final String SIM_NETWORK_LOCKED = "Network locked"; //需要Network PIN解鎖<br />private static final String SIM_UNKNOWN = "Unknown"; //狀態未知</p><p> //網路類型常量<br />private static final String NETWORK_CDMA = "CDMA: Either IS95A or IS95B (2G)";<br />private static final String NETWORK_EDGE = "EDGE (2.75G)";<br />private static final String NETWORK_GPRS = "GPRS (2.5G)";<br />private static final String NETWORK_UMTS = "UMTS (3G)";<br /> private static final String NETWORK_EVDO_0 = "EVDO revision 0 (3G)";<br /> private static final String NETWORK_EVDO_A = "EVDO revision A (3G - Transitional)";<br /> private static final String NETWORK_EVDO_B = "EVDO revision B (3G - Transitional)";<br /> private static final String NETWORK_1X_RTT = "1xRTT (2G - Transitional)";<br /> private static final String NETWORK_HSDPA = "HSDPA (3G - Transitional)";<br /> private static final String NETWORK_HSUPA = "HSUPA (3G - Transitional)";<br /> private static final String NETWORK_HSPA = "HSPA (3G - Transitional)";<br /> private static final String NETWORK_IDEN = "iDen (2G)";<br /> private static final String NETWORK_UNKOWN = "Unknown";</p><p> //手機制式類型常量<br /> private static final String PHONE_CDMA = "CDMA";<br /> private static final String PHONE_GSM = "GSM";<br /> private static final String PHONE_NONE = "No radio";</p><p> /** Called when the activity is first created. */<br /> @Override<br /> public void onCreate(Bundle savedInstanceState) {<br /> super.onCreate(savedInstanceState);<br /> setContentView(R.layout.network_detector);</p><p> //擷取telephony系統服務,用於取得SIM卡和網路相關資訊<br /> final TelephonyManager tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);</p><p> //更新介面上相關網路資訊<br /> updateViews(tm);</p><p> //由於SIM卡狀態和網路資訊隨時都可能發生變化,因此需要註冊PhoneStateListener<br /> //來即時更新介面顯示的資訊。這裡監聽兩個事件:LISTEN_SERVICE_STATE和LISTEN_DATA_CONNECTION_STATE<br /> //它們分別對應回呼函數onServiceStateChanged和onDataConnectionStateChanged<br /> tm.listen(new PhoneStateListener() {</p><p>@Override<br />public void onDataConnectionStateChanged(int state, int networkType) {<br />//資料連線狀態改變可能導致網路類型的改變<br />updateViews(tm);<br />}</p><p>@Override<br />public void onServiceStateChanged(ServiceState serviceState) {<br />updateViews(tm);<br />}</p><p> }, PhoneStateListener.LISTEN_SERVICE_STATE<br /> | PhoneStateListener.LISTEN_DATA_CONNECTION_STATE);<br /> }</p><p>@Override<br />protected void onResume() {<br />super.onResume();<br />final TelephonyManager tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);<br />updateViews(tm);<br />}</p><p> /**<br /> * 更新SIM卡狀態和網路資訊<br /> * @param tm<br /> */<br /> private final void updateViews(TelephonyManager tm) {<br /> TextView view = null;</p><p> view = (TextView) findViewById(R.id.sim_state);<br /> view.setText("SIM State : " + mapSimStateToName(tm.getSimState()));</p><p> view = (TextView) findViewById(R.id.network_type);<br /> view.setText("Network Type : " + mapNetworkTypeToName(tm.getNetworkType()));</p><p> view = (TextView) findViewById(R.id.network_name);<br /> view.setText("Network Operator : " + tm.getNetworkOperatorName());</p><p> view = (TextView) findViewById(R.id.phone_type);<br /> view.setText("Phone Type : " + mapDeviceTypeToName(tm.getPhoneType()));</p><p> }</p><p> /**<br /> * 將手機制式值以字串形式返回<br /> * @param phoneType<br /> * @return<br /> */<br />private String mapDeviceTypeToName(int phoneType) {<br /> switch (phoneType) {<br /> case TelephonyManager.PHONE_TYPE_CDMA:<br /> return PHONE_CDMA;<br /> case TelephonyManager.PHONE_TYPE_GSM:<br /> return PHONE_GSM;<br /> case TelephonyManager.PHONE_TYPE_NONE:<br /> return PHONE_NONE;<br /> default:<br /> //不應該走到這個分支<br /> return null;<br /> }<br />}</p><p>/**<br /> * 將網路類型值以字串形式返回<br /> * @param networkType<br /> * @return<br /> */<br />private String mapNetworkTypeToName(int networkType) {<br /> switch (networkType) {<br /> case TelephonyManager.NETWORK_TYPE_CDMA:<br /> return NETWORK_CDMA;<br /> case TelephonyManager.NETWORK_TYPE_EDGE:<br /> return NETWORK_EDGE;<br /> case TelephonyManager.NETWORK_TYPE_GPRS:<br /> return NETWORK_GPRS;<br /> case TelephonyManager.NETWORK_TYPE_UMTS:<br /> return NETWORK_UMTS;<br /> case TelephonyManager.NETWORK_TYPE_EVDO_0:<br /> return NETWORK_EVDO_0;<br /> case TelephonyManager.NETWORK_TYPE_EVDO_A:<br /> return NETWORK_EVDO_A;<br /> case TelephonyManager.NETWORK_TYPE_EVDO_B:<br /> return NETWORK_EVDO_B;<br /> case TelephonyManager.NETWORK_TYPE_1xRTT:<br /> return NETWORK_1X_RTT;<br /> case TelephonyManager.NETWORK_TYPE_HSDPA:<br /> return NETWORK_HSDPA;<br /> case TelephonyManager.NETWORK_TYPE_HSPA:<br /> return NETWORK_HSPA;<br /> case TelephonyManager.NETWORK_TYPE_HSUPA:<br /> return NETWORK_HSUPA;<br /> case TelephonyManager.NETWORK_TYPE_IDEN:<br /> return NETWORK_IDEN;<br /> case TelephonyManager.NETWORK_TYPE_UNKNOWN:<br /> default:<br /> return NETWORK_UNKOWN;<br /> }<br />}</p><p>/**<br /> * 將SIM卡狀態值以字串形式返回<br /> * @param simState<br /> * @return<br /> */<br />private static String mapSimStateToName(int simState) {<br /> switch (simState) {<br /> case TelephonyManager.SIM_STATE_ABSENT:<br /> return SIM_ABSENT;<br /> case TelephonyManager.SIM_STATE_READY:<br /> return SIM_READY;<br /> case TelephonyManager.SIM_STATE_PIN_REQUIRED:<br /> return SIM_PIN_REQUIRED;<br /> case TelephonyManager.SIM_STATE_PUK_REQUIRED:<br /> return SIM_PUK_REQUIRED;<br /> case TelephonyManager.SIM_STATE_NETWORK_LOCKED:<br /> return SIM_NETWORK_LOCKED;<br /> case TelephonyManager.SIM_STATE_UNKNOWN:<br /> return SIM_UNKNOWN;<br /> default:<br /> //不應該走到這個分支<br /> return null;<br /> }<br />}</p><p>}

程式執行結果:

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.