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