Service-黑名單來電自動掛斷

這只是一個學習例程,很多功能有待完善

允許用戶動態加載手機通訊錄中的電話號碼,勾選某些號碼作爲黑名單,一旦將某些號碼設爲黑名單,當該號碼自動掛斷該號碼

Android沒有對外公開掛斷電話的API,如果需要掛斷電話,必須使用AIDL與電話管理Service進行通信,並調用服務中的API實現結束通話

爲了調用遠程的AIDL Service,需要上圖所示的兩個aidl文件

BlockMain.Java  界面提供一個按鈕讓用戶打開對話框來勾選黑名單、

[java] view plain copy
  1. public class BlockMain extends Activity {  
  2.     ArrayList<String> blockList = new ArrayList<String>();//保存黑名單電話  
  3.     ArrayList<String> numList = new ArrayList<String>(); //保存通訊錄電話  
  4.     TelephonyManager tManager;  
  5.     @Override  
  6.     protected void onCreate(Bundle savedInstanceState) {  
  7.         super.onCreate(savedInstanceState);  
  8.         setContentView(R.layout.main);  
  9.         // 獲取系統的TelephonyManager管理器  
  10.         tManager = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);  
  11.         PhoneStateListener listener = new PhoneStateListener(){  
  12.             @Override  
  13.             public void onCallStateChanged(int state, String incomingNumber) {  
  14.                 switch(state){  
  15.                 case TelephonyManager.CALL_STATE_IDLE:  
  16.                     break;  
  17.                 case TelephonyManager.CALL_STATE_OFFHOOK:  
  18.                     break;  
  19.                 // 當電話呼入時  
  20.                 case TelephonyManager.CALL_STATE_RINGING:  
  21.                     // 如果該號碼屬於黑名單  
  22.                     if(isBlock(incomingNumber)){  
  23.                         System.out.println("**掛斷電話**");  
  24.                         try{  
  25.                             Method method = Class.forName("android.os.ServiceManager").getMethod("getService", String.class);  
  26.                             // 獲取遠程TELEPHONY_SERVICE的IBinder對象的代理  
  27.                             IBinder binder = (IBinder) method.invoke(nullnew Object[]{TELEPHONY_SERVICE});  
  28.                             // 將IBinder對象的代理轉換爲ITelephony對象  
  29.                             ITelephony telephony = ITelephony.Stub.asInterface(binder);  
  30.                             // 掛斷電話  
  31.                             telephony.endCall();  
  32.                         }catch(Exception e){  
  33.                             e.printStackTrace();  
  34.                         }  
  35.                           
  36.                     }  
  37.                     break;  
  38.                 }  
  39.                 super.onCallStateChanged(state, incomingNumber);  
  40.             }  
  41.         };  
  42.         // 通過TelephonyManager監聽通話狀態的改變  
  43.         tManager.listen(listener, PhoneStateListener.LISTEN_CALL_STATE);  
  44.         // 獲取程序的按鈕,併爲它的單擊事件綁定監聽器  
  45.         findViewById(R.id.managerBlock).setOnClickListener(new OnClickListener() {  
  46.               
  47.             @Override  
  48.             public void onClick(View v) {  
  49.                 final Cursor cursor = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,   
  50.                         nullnullnullnull);  
  51.                 BaseAdapter adapter = new BaseAdapter(){  
  52.                         @Override  
  53.                         public int getCount() {  
  54.                             return cursor.getCount();  
  55.                         }  
  56.   
  57.                         @Override  
  58.                         public Object getItem(int position) {  
  59.                             return position;  
  60.                         }  
  61.   
  62.                         @Override  
  63.                         public long getItemId(int position) {  
  64.                             return position;  
  65.                         }  
  66.   
  67.                         @Override  
  68.                         public View getView(int position, View convertView,  
  69.                                 ViewGroup parent) {  
  70.                             cursor.moveToPosition(position);  
  71.                             CheckBox rb = new CheckBox(BlockMain.this);  
  72.                             String number = cursor.getString(cursor.getColumnIndex(  
  73.                                     ContactsContract.CommonDataKinds.Phone.NUMBER))  
  74.                                     .replace("-""")  
  75.                                     .replace(" """);  
  76.                             rb.setText(number);  
  77.                             numList.add(number);  
  78.                             // 如果該號碼已經被加入黑名單、默認勾選該號碼  
  79.                             if(isBlock(number)){  
  80.                                 rb.setChecked(true);  
  81.                             }  
  82.                             return rb;  
  83.                         }  
  84.                     };  
  85.                     // 加載list.xml佈局文件對應的View  
  86.                     final View selectView = getLayoutInflater().inflate(R.layout.list, null);  
  87.                     // 獲取selectView中的名爲list的ListView組件  
  88.                     final ListView listView = (ListView) selectView.findViewById(R.id.list);  
  89.                     listView.setAdapter(adapter);  
  90.                     new AlertDialog.Builder(BlockMain.this)  
  91.                     .setView(selectView)  
  92.                     .setPositiveButton("確定",  
  93.                             new DialogInterface.OnClickListener() {  
  94.                                 @Override  
  95.                                 public void onClick(DialogInterface dialog, int which) {  
  96.                                     // 清空blockList集合  
  97.                                     blockList.clear();  
  98.                                     // 遍歷listView組件的每個列表項,這裏只是遍歷當前頁  
  99.                                     int numOfVisibleView = listView.getLastVisiblePosition() - listView.getFirstVisiblePosition();  
  100.                                     for (int i = 0; i < numOfVisibleView; i++)  
  101.                                     {  
  102.                                         CheckBox checkBox = (CheckBox)  
  103.                                             listView.getChildAt(i);  
  104.                                         // 如果該列表項被勾選  
  105.                                         if (checkBox.isChecked())  
  106.                                         {  
  107.                                             // 添加該列表項的電話號碼  
  108.                                             blockList.add(checkBox  
  109.                                                 .getText().toString());  
  110.                                         }  
  111.                                     }  
  112.       
  113.                                 }  
  114.                             }).show();  
  115.                 }  
  116.                   
  117.         });  
  118.     }  
  119.       
  120.     // 判斷某個電話號碼是否在黑名單之內  
  121.     public boolean isBlock(String phone){  
  122.         System.out.println("呼入號碼:"+phone);  
  123.         System.out.println("-----"+blockList);  
  124.         for (String s1 : blockList){  
  125.             if(s1.equals(phone)){  
  126.                 return true;  
  127.             }  
  128.         }  
  129.         return false;  
  130.     }  
  131.   
  132. }  

mainfest文件 配置相應權限

[html] view plain copy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     package="crazyit.manager"  
  4.     android:versionCode="1"  
  5.     android:versionName="1.0" >  
  6.   
  7.     <uses-sdk  
  8.         android:minSdkVersion="8"  
  9.         android:targetSdkVersion="18" />  
  10.     <!-- 授予該應用控制通話的權限 -->  
  11.     <uses-permission android:name="android.permission.CALL_PHONE" />    
  12.     <!-- 授予該應用讀取通話狀態的權限 -->  
  13.     <uses-permission android:name="android.permission.READ_PHONE_STATE" />  
  14.     <!-- 授予讀聯繫人ContentProvider的權限 -->  
  15.     <uses-permission android:name="android.permission.READ_CONTACTS" />  
  16.     <!-- 授予寫聯繫人ContentProvider的權限 -->  
  17.     <uses-permission android:name="android.permission.WRITE_CONTACTS" />  
  18.   
  19.     <application  
  20.         android:allowBackup="true"  
  21.         android:icon="@drawable/ic_launcher"  
  22.         android:label="@string/app_name"  
  23.         android:theme="@style/AppTheme" >  
  24.         <activity  
  25.             android:name="crazyit.manager.BlockMain"  
  26.             android:label="@string/app_name" >  
  27.             <intent-filter>  
  28.                 <action android:name="android.intent.action.MAIN" />  
  29.   
  30.                 <category android:name="android.intent.category.LAUNCHER" />  
  31.             </intent-filter>  
  32.         </activity>  
  33.     </application>  
  34.   
  35. </manifest>  


備註:

本例程只能勾選當前顯示頁的號碼,

[java] view plain copy
  1. numOfVisibleView = listView.getLastVisiblePosition() - listView.getFirstVisiblePosition();  
這是在原例程進行修改,原例程如果遇到號碼很多(超過手機一頁,需要還滑動翻頁)的情況會出現bug

具體情況如 http://www.eoeandroid.com/forum.php?mod=viewthread&tid=249149

在網上尋找解決方案,還是沒有合適的方法,

暫且用numOfVisibleView表示當前顯示頁的號碼數,將此也頁面的電話號碼加入黑名單。

(還找到一個解決方案,但自己沒有修改成功http://blog.csdn.net/fengyuzhengfan/article/details/38166967)

發佈了34 篇原創文章 · 獲贊 4 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章