編輯:關於Android編程
對於想要攔截一些莫名的陌生號碼,就需要電話攔截功能與刪除其電話記錄功能。攔截的主要業務邏輯,分別是在一個服務裡面進行:1、注冊電話監聽;2、取消注冊電話監聽(當然注冊於取消是在服務裡面建立一個廣播接收者)。刪除電話日志的功能,是靠內容觀察者和內容提供者。
下面給出實現電話監聽,取消注冊監聽,內容觀察者監聽電話數據庫狀態的主要代碼。對於以後開發此類產品,不需要去查看系統源碼,復制粘貼這段代碼就行了。下面給出代碼:
一、注冊電話監聽與內容觀察者監控電話數據庫狀態:
因為是在服務裡面,因此,注冊寫在onCreate方法裡面
@Override
public void onCreate() {
// 注冊電話監聽
// 通過電話管理類TelephoneManager
tm = (TelephoneManager) getSystemService(TELEPHONY_SERVICE);
// 監聽電話的狀態
listener = new PhoneStateListener() {
/*
* (non-Javadoc) 該方法用來監聽電話的狀態
*
* @see android.telephony.PhoneStateListener#onCallStateChanged(int,
* java.lang.String)
*/
@Override
public void onCallStateChanged(int state, final String incomingNumber) {
// TODO Auto-generated method stub
// state 電話的狀態 incomingNumber 打進來的號碼
switch (state) {
case TelephonyManager.CALL_STATE_IDLE:// 掛斷的狀態,空閒的狀態
System.out.println("CALL_STATE_IDLE");
break;
case TelephonyManager.CALL_STATE_RINGING://響鈴狀態
System.out.println("CALL_STATE_RINGING");
//判斷是否是黑名單號碼
//獲取電話的模式
int mode = dao.getMode(incomingNumber);
//如果是攔截號碼
if ((mode & BlackTable.TEL) != 0) {
//電話攔截
System.out.println("掛斷電話");
//掛斷電話之前先注冊內容觀察者,新生成的日志之後(數據庫發生改變)
getContentResolver().registerContentObserver(Uri.parse("content://call_log/calls"), true,
new ContentObserver(new Handler()) {
@Override
public void onChange(boolean selfChange) {
//電話日志變化 觸發此方法調用
deleteCalllog(incomingNumber);//刪除電話日志
super.onChange(selfChange);
}
});
endCall();
}
break;
case TelephonyManager.CALL_STATE_OFFHOOK:// 通話的狀態
System.out.println("CALL_STATE_OFFHOOK");
break;
default:
break;
}
super.onCallStateChanged(state, incomingNumber);
}
};
// 注冊電話的監聽
tm.listen(listener, PhoneStateListener.LISTEN_CALL_STATE);
super.onCreate();
}
/**
* 刪除電話日志
* @param incomingNumber
* 要刪除日志的號碼
*/
protected void deleteCalllog(String incomingNumber) {
//只能內容提供者來刪除電話日志
Uri uri = Uri.parse("content://call_log/calls");
//刪除指定號碼(黑名單號碼)日志
getContentResolver().delete(uri, "number=?", new String[]{incomingNumber});
}
/**
* 掛斷電話:反射+AIDL
*/
protected void endCall() {
//tm.endCall(); 1.5版本後,把該方法閹割掉了
//想用該功能,實現方法
//ServiceManager.getService();
//反射調用
//1.class
try {
Class clazz = Class.forName("android.os.ServiceManager");
//2. method
Method method = clazz.getDeclaredMethod("getService", String.class);
//3.obj 不需要 因為是靜態方法
//4. 調用
IBinder binder = (IBinder) method.invoke(null, Context.TELEPHONY_SERVICE);
//5.aidl
ITelephony iTelephony = ITelephony.Stub.asInterface(binder);
iTelephony.endCall();//掛斷電話
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (RemoteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

若用到了相應的功能,直接復制核心代碼就行了
安卓專項測試之GPU測試探索
背景我們在安卓上進行性能測試時,如果想獲取CPU以及內存等常用性能指標,linux系統自身就提供了現成的方法,谷歌官方甚至公司內部也都提供了大量功能強大的分析工具。而相比
Android安卓安全審計mobiseclab
關於安卓上的app分析,有很多的本地化軟件可以勝任, 不過,今天給大家介紹一款在線的安全審計,惡意軟件(android app)檢測和分析工具,mobiseclab,
android 自學日記(一)
android 自學日記(一) 說起日記,記憶還是小學時候學校裡的作業,只記得當時通篇都是流水賬,例如“幾點起床,去哪裡玩了,干了啥壞事什麼的(額,這不能寫!)。。。”
基於Android Service 生命周期的詳細介紹
Service概念及用途:Android中的服務,它與Activity不同,它是不能與用戶交互的,不能自己啟動的,運行在後台的程序,如果我們退出應用時,Service進程