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