多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > 互聯網 > Android提供的系統服務之--TelephonyManager(電話管理器)

Android提供的系統服務之--TelephonyManager(電話管理器)

來源:程序員人生   發布時間:2014-11-15 02:33:34 閱讀次數:3937次

Android提供的系統服務之--TelephonyManager(電話管理器)

              轉載請注明出處――coder-pig




TelephonyManager的作用:


用于管理手機通話狀態,獲得電話信息(裝備信息、sim卡信息和網絡信息),

偵聽電話狀態(呼喚狀態服務狀態、信號強度狀態等)和可以調用電話撥號器撥打電話!





如何取得TelephonyManager的服務對象:


TelephonyManager tManager = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);




TelephonyManager的相干用法實例:


1.調用撥號器撥打電話號碼:

Uri uri=Uri.parse("tel:"+電話號碼); Intent intent=new Intent(Intent.ACTION_DIAL,uri); startActivity(intent);

ps:調用的是系統的撥號界面哦!



2.獲得Sim卡信息與網絡信息

運行效果圖:(摹擬器下獲得不了相干信息的哦,這里用的是真機哈!)



代碼實現流程:

1.定義了1個存儲狀態名稱的array.xml的數組資源文件;

2.布局定義了1個簡單的listview,列表項是兩個水平方向的textview

3.Activity界面中調用相干方法取得對應參數的值,再把數據綁定到listview上!


詳細代碼以下:

array.xml:

<?xml version="1.0" encoding="utf⑻"?> <resources> <!-- 聲明1個名為statusNames的字符串數組 --> <string-array name="statusNames"> <item>裝備編號</item> <item>軟件版本</item> <item>網絡運營商朝號</item> <item>網絡運營商名稱</item> <item>手機制式</item> <item>裝備當前位置</item> <item>SIM卡的國別</item> <item>SIM卡序列號</item> <item>SIM卡狀態</item> </string-array> <!-- 聲明1個名為simState的字符串數組 --> <string-array name="simState"> <item>狀態未知</item> <item>無SIM卡</item> <item>被PIN加鎖</item> <item>被PUK加鎖</item> <item>被NetWork PIN加鎖</item> <item>已準備好</item> </string-array> <!-- 聲明1個名為phoneType的字符串數組 --> <string-array name="phoneType"> <item>未知</item> <item>GSM</item> <item>CDMA</item> </string-array> </resources>


布局代碼以下:

activity_main.xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/LinearLayout1" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context="com.jay.example.getphonestatus.MainActivity" > <ListView android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/statuslist" /> </LinearLayout>

line.xml:

<?xml version="1.0" encoding="utf⑻"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal" > <TextView android:id="@+id/name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:width="230px" android:textSize="16dp" /> <TextView android:id="@+id/value" android:layout_width="match_parent" android:layout_height="wrap_content" android:paddingLeft="8px" android:textSize="16dp" /> </LinearLayout>


MainActivity.java

package com.jay.example.getphonestatus; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; import android.app.Activity; import android.content.Context; import android.os.Bundle; import android.telephony.TelephonyManager; import android.widget.ListView; import android.widget.SimpleAdapter; public class MainActivity extends Activity { //定義1個ListView對象,1個代表狀態名稱的數組,和手機狀態的集合 private ListView showlist; private String[] statusNames; private ArrayList<String> statusValues = new ArrayList<String>(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); showlist = (ListView) findViewById(R.id.statuslist); //①取得系統提供的TelphonyManager對象的實例 TelephonyManager tManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); //②取得狀態名詞的數組,Sim卡狀態的數組,電話網絡類型的數組 //就是取得array.xml中的對應數組名的值 statusNames = getResources().getStringArray(R.array.statusNames); String[] simState = getResources().getStringArray(R.array.simState); String[] phoneType = getResources().getStringArray(R.array.phoneType); //③依照array.xml中的順序,調用對應的方法,將相應的值保存到集合里 statusValues.add(tManager.getDeviceId()); //取得裝備編號 //獲得系統平臺的版本 statusValues.add(tManager.getDeviceSoftwareVersion() != null? tManager.getDeviceSoftwareVersion():"未知"); statusValues.add(tManager.getNetworkOperator()); //取得網絡運營商朝號 statusValues.add(tManager.getNetworkOperatorName()); //取得網絡運營商的名稱 statusValues.add(phoneType[tManager.getPhoneType()]); //取得手機的網絡類型 // 獲得裝備所在位置 statusValues.add(tManager.getCellLocation() != null ? tManager .getCellLocation().toString() : "未知位置"); statusValues.add(tManager.getSimCountryIso()); // 獲得SIM卡的國別 statusValues.add(tManager.getSimSerialNumber()); // 獲得SIM卡序列號 statusValues.add(simState[tManager.getSimState()]); // 獲得SIM卡狀態 //④遍歷狀態的集合,把狀態名與對應的狀態添加到集合中 ArrayList<Map<String, String>> status = new ArrayList<Map<String, String>>(); for (int i = 0; i < statusValues.size(); i++) { HashMap<String, String> map = new HashMap<String, String>(); map.put("name", statusNames[i]); map.put("value", statusValues.get(i)); status.add(map); } //⑤使用SimpleAdapter封裝List數據 SimpleAdapter adapter = new SimpleAdapter(this, status, R.layout.line, new String[] { "name", "value" } , new int[] { R.id.name, R.id.value }); // 為ListView設置Adapter showlist.setAdapter(adapter); } }

最后別忘了,往AndroidManifest.xml文件中添加下述權限哦!

<!-- 添加訪問手機位置的權限 --> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> <!-- 添加訪問手機狀態的權限 --> <uses-permission android:name="android.permission.READ_PHONE_STATE"/>


3.監聽手機的所有來電:


對監聽到的通話記錄結果,你可以采取不同的方式獲得到,這里用到的是把通話記錄寫入到文件中,

而你也能夠以短信的情勢發送給你,或是上傳到某個平臺,固然如果通訊記錄不多的話還可以用短信

多了的話就很容易給人發現的了!

另外,這里用的是Activity而非Service,就是說要打開這個Activity,才可以進行監聽,通常我們的需求都是

要偷偷滴在后臺跑的,由于時間關系就不寫Service的了,大家自己寫寫吧,讓Service隨開機1起啟動便可!


代碼解析:

很簡單,其實就是重寫TelephonyManager的1個通話狀態監聽器PhoneStateListener

然后調用TelephonyManager.listen()的方法進行監聽,當來電的時候,

程序就會將來電號碼記錄到文件中


MainActivity.java:

package com.jay.PhoneMonitor; import java.io.FileNotFoundException; import java.io.OutputStream; import java.io.PrintStream; import android.app.Activity; import android.content.Context; import android.os.Bundle; import android.telephony.PhoneStateListener; import android.telephony.TelephonyManager; import java.util.Date; public class MainActivity extends Activity { TelephonyManager tManager; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); // 獲得TelephonyManager對象 tManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); // 創建1個通話狀態監聽器 PhoneStateListener listener = new PhoneStateListener() { @Override public void onCallStateChanged(int state, String number) { switch (state) { // 無任何狀態 case TelephonyManager.CALL_STATE_IDLE: break; case TelephonyManager.CALL_STATE_OFFHOOK: break; // 來電鈴響時 case TelephonyManager.CALL_STATE_RINGING: OutputStream os = null; try { os = openFileOutput("phoneList", MODE_APPEND); } catch (FileNotFoundException e) { e.printStackTrace(); } PrintStream ps = new PrintStream(os); // 將來電號碼記錄到文件中 ps.println(new Date() + " 來電:" + number); ps.close(); break; default: break; } super.onCallStateChanged(state, number); } }; // 監聽電話通話狀態的改變 tManager.listen(listener, PhoneStateListener.LISTEN_CALL_STATE); } }

固然還需要在AndroidManifest.xml中添加下面的權限:

<!-- 授與該利用讀取通話狀態的權限 --> <uses-permission android:name="android.permission.READ_PHONE_STATE"/>


運行效果:

注意!要讓這個程序位于前臺哦!用另外一個電話撥打該電話,接著就能夠在DDMS的file Explorer的利用

對應包名的files目錄下看到phoneList的文件了,我們可以將他導出到電腦中打開,文件的大概內容以下:

THR Oct 30 12:05:48 GMT 2014 來電: 137xxxxxxx




4.黑名單來電自動掛斷:

所謂的黑名單就是將1些電話號碼添加到1個集合中,當手機接收到這些電話的時候就直接掛斷!

但是Android并沒有給我們提供掛斷電話的API,因而乎我們需要通過AIDL來調用服務中的API來

實現掛斷電話!

因而乎第1步要做的就是把android源碼中的下面兩個文件復制到src下的相應位置,他們分別是:

com.android.internal.telephony包下的ITelephony.aidl;

android.telephony包下的NeighboringCellInfo.aidl;

要創建對應的包哦!就是要把aidl文件放到上面的包下!!!

接著只需要調用ITelephony的endCall便可掛斷電話!



這里給出的是簡單的單個號碼的攔截,輸入號碼,點擊屏蔽按鈕后,如果此時屏蔽的電話呼入的話;

直接會掛斷,代碼還是比較簡單的,下面粘1下,由于用的摹擬器是Genymotion,所以就不演示

程序運行后的截圖了!


MainActivity.java:

package com.jay.example.locklist; import java.lang.reflect.Method; import com.android.internal.telephony.ITelephony; import android.app.Activity; import android.os.Bundle; import android.os.IBinder; import android.telephony.PhoneStateListener; import android.telephony.TelephonyManager; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText; public class MainActivity extends Activity { private TelephonyManager tManager; private PhoneStateListener pListener; private String number; private EditText locknum; private Button btnlock; public class PhonecallListener extends PhoneStateListener { @Override public void onCallStateChanged(int state, String incomingNumber) { switch(state) { case TelephonyManager.CALL_STATE_IDLE:break; case TelephonyManager.CALL_STATE_OFFHOOK:break; //當有電話撥入時 case TelephonyManager.CALL_STATE_RINGING: if(isBlock(incomingNumber)) { try { Method method = Class.forName("android.os.ServiceManager") .getMethod("getService", String.class); // 獲得遠程TELEPHONY_SERVICE的IBinder對象的代理 IBinder binder = (IBinder) method.invoke(null, new Object[] { TELEPHONY_SERVICE }); // 將IBinder對象的代理轉換為ITelephony對象 ITelephony telephony = ITelephony.Stub.asInterface(binder); // 掛斷電話 telephony.endCall(); }catch(Exception e){e.printStackTrace();} } break; } super.onCallStateChanged(state, incomingNumber); } } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); locknum = (EditText) findViewById(R.id.locknum); btnlock = (Button) findViewById(R.id.btnlock); //獲得系統的TelephonyManager管理器 tManager = (TelephonyManager) getSystemService(TELEPHONY_SERVICE); pListener = new PhoneStateListener(); tManager.listen(pListener, PhoneStateListener.LISTEN_CALL_STATE); btnlock.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { number = locknum.getText().toString(); } }); } public boolean isBlock(String phone) { if(phone.equals(number))return true; return false; } }


另外還需要添加下述的權限:

<!-- 授與該利用控制通話的權限 --> <uses-permission android:name="android.permission.CALL_PHONE" /> <!-- 授與該利用讀取通話狀態的權限 --> <uses-permission android:name="android.permission.READ_PHONE_STATE" />




固然,更多的時候我們屏蔽的不會只是1個號碼,這個時候可使用集合,把多個要屏蔽的號碼添加到

集合中,或是文件中,這里就直接給出李剛老師的demo,他提供的是1個帶復選框的列表供用戶

勾選黑名單,這里就不解析了,直接給出代碼下載吧!


單個號碼攔截的demo:點擊下載

李剛老師的列表黑名單攔截demo:點擊下載






TelephonyManager的相干屬性與方法:

Constants

生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 国产午夜视频在线观看第四页 | 日本一区二区成人教育 | 国产精品中文字幕在线观看 | 国内在线精品 | 精品91一区二区三区 | 最近手机中文字幕大全4 | 一区二区在线视频免费观看 | 性欧美videos另类hd | julia一区二区三区中文字幕 | 国产主播福利在线 | 亚洲高清成人 | 91亚洲精品福利在线播放 | 亚洲欧美日本国产 | 免费看www网站入口 免费看w片的网站在线看 | 日本不卡一区二区三区 最新 | 欧美在线成人午夜影视 | 欧洲美女性做爰 | xyx性爽欧美视频 | 在线亚洲欧洲福利视频 | 亚洲精品欧美精品中文字幕 | 久久久久久国产精品视频 | 91最新地址永久入口 | 欧美午夜色视频国产精品 | 久久久久毛片成人精品 | japanesexxx在线播放 | 欧美亚洲高清 | 亚洲欧美日本国产 | 另类图片综合网 | 欧美高清正版在线 | 国产精品性 | 91av福利| 亚洲福利一区福利三区 | 最新久久精品 | 国产精品爱久久久久久久 | 五月婷婷狠狠 | 高清视频在线播放 | 亚洲精品一二三四区 | 91久久偷偷做嫩草影院免费 | 久久亚洲日本不卡一区二区 | 一级特黄aa大片免费播放视频 | 在线播放免费人成毛片乱码 |

    <i id="4py3e"><tr id="4py3e"></tr></i>

        1. String

           ACTION_PHONE_

           STATE_CHANGED

           Broadcast intent action indicating that the call state (cellular)

           on the device has changed.

          int

           CALL_STATE_IDLE

           Device call state: No activity.

           空閑(無呼入或已掛機)

          int

           CALL_STATE_OFFHOOK

           Device call state: Off-hook.

           摘機(有呼入)

          int

           CALL_STATE_RINGING

           Device call state: Ringing.

           響鈴(接聽中)

          int

           DATA_ACTIVITY_DORMANT

           Data connection is active, but physical link is down

           電話數據活動狀態類型:睡眠模式(3.1版本)

          int

           DATA_ACTIVITY_IN

           Data connection activity: Currently receiving IP PPP traffic.

           電話數據活動狀態類型:數據流入

          int

           DATA_ACTIVITY_INOUT

           Data connection activity: Currently both sending and receiving 

           IP PPP traffic.電話數據活動狀態類型:數據交互

          int 

           DATA_ACTIVITY_NONE

           Data connection activity: No traffic.

           電話數據活動狀態類型:無數據活動

          int

           DATA_ACTIVITY_OUT

           Data connection activity: Currently sending IP PPP traffic.

           電話數據活動狀態類型:數據流出

          int

           DATA_CONNECTED

           Data connection state: Connected.

           數據連接狀態類型:已連接

          int

           DATA_CONNECTING

           Data connection state: Currently setting up a data connection.

           數據連接狀態類型:正在連接

          int

           DATA_DISCONNECTED

           Data connection state: Disconnected.

           數據連接狀態類型:斷開

          int

           DATA_SUSPENDED

           Data connection state: Suspended.

           數據連接狀態類型:已暫停

          String

           EXTRA_INCOMING_NUMBER

           The lookup key used with the ACTION_PHONE_STATE_CHANGED 

           broadcast for a String containing the incoming phone number.

          String

           EXTRA_STATE

           The lookup key used with the ACTION_PHONE_STATE_CHANGED

            broadcast for a String containing the new call state.

          int

           NETWORK_TYPE_1xRTT

           Current network is 1xRTT

          int

           NETWORK_TYPE_CDMA

           Current network is CDMA: Either IS95A or IS95B

          int

           NETWORK_TYPE_EDGE

           Current network is EDGE

          int 

           NETWORK_TYPE_EHRPD

           Current network is eHRPD

          int 

           NETWORK_TYPE_EVDO_0

           Current network is EVDO revision 0

          int 

           NETWORK_TYPE_EVDO_A

           Current network is EVDO revision A

          int 

           NETWORK_TYPE_EVDO_B

           Current network is EVDO revision B