這只是一個學習例程,很多功能有待完善
允許用戶動態加載手機通訊錄中的電話號碼,勾選某些號碼作爲黑名單,一旦將某些號碼設爲黑名單,當該號碼自動掛斷該號碼
Android沒有對外公開掛斷電話的API,如果需要掛斷電話,必須使用AIDL與電話管理Service進行通信,並調用服務中的API實現結束通話
爲了調用遠程的AIDL Service,需要上圖所示的兩個aidl文件
BlockMain.Java 界面提供一個按鈕讓用戶打開對話框來勾選黑名單、
- public class BlockMain extends Activity {
- ArrayList<String> blockList = new ArrayList<String>();//保存黑名單電話
- ArrayList<String> numList = new ArrayList<String>(); //保存通訊錄電話
- TelephonyManager tManager;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- // 獲取系統的TelephonyManager管理器
- tManager = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
- PhoneStateListener listener = new 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)){
- System.out.println("**掛斷電話**");
- 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);
- }
- };
- // 通過TelephonyManager監聽通話狀態的改變
- tManager.listen(listener, PhoneStateListener.LISTEN_CALL_STATE);
- // 獲取程序的按鈕,併爲它的單擊事件綁定監聽器
- findViewById(R.id.managerBlock).setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- final Cursor cursor = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
- null, null, null, null);
- BaseAdapter adapter = new BaseAdapter(){
- @Override
- public int getCount() {
- return cursor.getCount();
- }
- @Override
- public Object getItem(int position) {
- return position;
- }
- @Override
- public long getItemId(int position) {
- return position;
- }
- @Override
- public View getView(int position, View convertView,
- ViewGroup parent) {
- cursor.moveToPosition(position);
- CheckBox rb = new CheckBox(BlockMain.this);
- String number = cursor.getString(cursor.getColumnIndex(
- ContactsContract.CommonDataKinds.Phone.NUMBER))
- .replace("-", "")
- .replace(" ", "");
- rb.setText(number);
- numList.add(number);
- // 如果該號碼已經被加入黑名單、默認勾選該號碼
- if(isBlock(number)){
- rb.setChecked(true);
- }
- return rb;
- }
- };
- // 加載list.xml佈局文件對應的View
- final View selectView = getLayoutInflater().inflate(R.layout.list, null);
- // 獲取selectView中的名爲list的ListView組件
- final ListView listView = (ListView) selectView.findViewById(R.id.list);
- listView.setAdapter(adapter);
- new AlertDialog.Builder(BlockMain.this)
- .setView(selectView)
- .setPositiveButton("確定",
- new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int which) {
- // 清空blockList集合
- blockList.clear();
- // 遍歷listView組件的每個列表項,這裏只是遍歷當前頁
- int numOfVisibleView = listView.getLastVisiblePosition() - listView.getFirstVisiblePosition();
- for (int i = 0; i < numOfVisibleView; i++)
- {
- CheckBox checkBox = (CheckBox)
- listView.getChildAt(i);
- // 如果該列表項被勾選
- if (checkBox.isChecked())
- {
- // 添加該列表項的電話號碼
- blockList.add(checkBox
- .getText().toString());
- }
- }
- }
- }).show();
- }
- });
- }
- // 判斷某個電話號碼是否在黑名單之內
- public boolean isBlock(String phone){
- System.out.println("呼入號碼:"+phone);
- System.out.println("-----"+blockList);
- for (String s1 : blockList){
- if(s1.equals(phone)){
- return true;
- }
- }
- return false;
- }
- }
mainfest文件 配置相應權限
- <?xml version="1.0" encoding="utf-8"?>
- <manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="crazyit.manager"
- android:versionCode="1"
- android:versionName="1.0" >
- <uses-sdk
- android:minSdkVersion="8"
- android:targetSdkVersion="18" />
- <!-- 授予該應用控制通話的權限 -->
- <uses-permission android:name="android.permission.CALL_PHONE" />
- <!-- 授予該應用讀取通話狀態的權限 -->
- <uses-permission android:name="android.permission.READ_PHONE_STATE" />
- <!-- 授予讀聯繫人ContentProvider的權限 -->
- <uses-permission android:name="android.permission.READ_CONTACTS" />
- <!-- 授予寫聯繫人ContentProvider的權限 -->
- <uses-permission android:name="android.permission.WRITE_CONTACTS" />
- <application
- android:allowBackup="true"
- android:icon="@drawable/ic_launcher"
- android:label="@string/app_name"
- android:theme="@style/AppTheme" >
- <activity
- android:name="crazyit.manager.BlockMain"
- android:label="@string/app_name" >
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
- <category android:name="android.intent.category.LAUNCHER" />
- </intent-filter>
- </activity>
- </application>
- </manifest>
本例程只能勾選當前顯示頁的號碼,
- numOfVisibleView = listView.getLastVisiblePosition() - listView.getFirstVisiblePosition();
具體情況如 http://www.eoeandroid.com/forum.php?mod=viewthread&tid=249149
在網上尋找解決方案,還是沒有合適的方法,
暫且用numOfVisibleView表示當前顯示頁的號碼數,將此也頁面的電話號碼加入黑名單。
(還找到一個解決方案,但自己沒有修改成功http://blog.csdn.net/fengyuzhengfan/article/details/38166967)