Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android開發之黑名單來電自動掛斷

Android開發之黑名單來電自動掛斷

編輯:關於Android編程

本實例允許用戶動態添加號碼到黑名單,並實現黑名單來電自動掛斷。程序通過創建PhoneStateListener監聽器來監聽TelephonyManager的通話狀態來實現該功能。

由於自Android 10之後Android不再對外公開掛斷電話的API,如果需要掛斷電話必須使用AIDL與電話管理Service進行通信,並調用服務中的API實現結束電話。

為了調用遠程的AIDL Service,開發者需要將Android源碼中的如下兩個文拷到指定位置:

com.android.internal.telephony包下的ITelephony.aidl

android.telephony包下的NeighboringCellInfo.aidl

\

<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+1eLR+b7Nu+HU2mdlbs7EvP680M/Cyfqzyc/g06a1xC5KYXZhzsS8/qGjPC9wPgo8cD7B7c3itffTw0FQSbXEt723qMjnufvT0LK7veK1xLXYt72/ydLUss6/vKO6Q2xhc3MuZm9yTmFtZSgptcTX99PD0+vKudPD19y94TwvcD4KPHA+we3N4rG+yrXA/cq508NCYXNlQWRhcHRlctf3zqpMaXN0Vmlld7XEysrF5Mb3o6xCYXNlQWRhcHRlcr7f09C63Me/tcS2qNbG0M2hozwvcD4KPHA+0d3Kvs28xqyjujwvcD4KPGhyPgo8cD48aW1nIHNyYz0="/uploadfile/Collfiles/20140726/20140726091337155.gif" alt="\">

程序代碼:


package com.jph.callguard;

import java.lang.reflect.Method;
import java.util.ArrayList;
import com.android.internal.telephony.ITelephony;
import android.os.Bundle;
import android.os.IBinder;
import android.provider.ContactsContract;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
import android.view.View;
import android.view.ViewGroup;
import android.view.View.OnClickListener;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.ListView;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.database.Cursor;
/**
 * Describe:
* 黑名單自動掛斷 * 本實例實現了獲取聯系人,並將選中的聯系人添加到黑名單中 * 並通過ITelephony.aidl與NeighboringCellInfo.aidl * 接口使用AIDL與電話管理Servic進行通信掛斷黑名單中的電話 * @author jph * Time:2014.07.24 * */ public class CallGuard extends Activity { Button btnManage; TelephonyManager tManager; //創建一個集合用於保存黑名單中的號碼 ArrayListblockList=new ArrayList(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); btnManage=(Button)findViewById(R.id.btnManage); tManager=(TelephonyManager) getSystemService(TELEPHONY_SERVICE); //創建電話狀態監聽器 PhoneStateListener pStateListener=new PhoneStateListener(){ @Override public void onCallStateChanged(int state, String incomingNumber) { // TODO Auto-generated method stub switch (state) { case TelephonyManager.CALL_STATE_IDLE://空閒狀態不做處理 break; case TelephonyManager.CALL_STATE_OFFHOOK://接起電話不做處理 break; case TelephonyManager.CALL_STATE_RINGING://正在響鈴 //如果來電號碼在黑名單中則自動掛斷 if (isBlock(incomingNumber)) { try { //獲取android.os.ServiceManager類的對象的getService()方法 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) { // TODO Auto-generated catch block e.printStackTrace(); } } break; } super.onCallStateChanged(state, incomingNumber); } }; //為TelephonyManager添加監聽器 tManager.listen(pStateListener, PhoneStateListener.LISTEN_CALL_STATE); btnManage.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub //查詢通信錄中的電話號碼 final Cursor cursor=getContentResolver().query( ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, null, null); //創建一個BaseAdapter作為ListView的適配器 BaseAdapter adapter=new BaseAdapter() { @Override public View getView(int position, View convertView, ViewGroup parent) { // TODO Auto-generated method stub //將游標的指針移動到指定位置 cursor.moveToPosition(position); CheckBox box=new CheckBox(CallGuard.this); //獲取指定位置的電話號碼 String number=cursor.getString(cursor.getColumnIndex( ContactsContract.CommonDataKinds.Phone.NUMBER)); //去掉電話號碼中間的中劃線、空格 number.replace("-", "").replace(" ", ""); box.setText(number); //如果該號碼已經被加入黑名單、默認勾選該號碼 if (isBlock(number)) { box.setChecked(true); } return box; } @Override public long getItemId(int position) { // TODO Auto-generated method stub return position; } @Override public Object getItem(int position) { // TODO Auto-generated method stub return position; } //返回列表的總條數 @Override public int getCount() { // TODO Auto-generated method stub return cursor.getCount(); } }; //加載line布局文件 View view=getLayoutInflater().inflate(R.layout.line, null); //獲取line布局文件中Id為list的組件 final ListView list=(ListView)view.findViewById(R.id.list); list.setAdapter(adapter); new AlertDialog.Builder(CallGuard.this).setView(view).setPositiveButton("確定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // TODO Auto-generated method stub blockList.clear(); for (int i = 0; i < list.getCount(); i++) { CheckBox box=(CheckBox)list.getChildAt(i); //如果聯系人被選中則將其添加到blockList集合 if (box.isChecked()) { blockList.add(box.getText().toString()); } } } }).show(); } }); } private boolean isBlock(String number) { // TODO Auto-generated method stub //判斷號碼是否在blockList集合中 for (String s:blockList) { if (s.equals(number)) { return true; } } return false; } }

最後別忘添加相應的權限:


AndroidManifest.xml


		
	
	
	
	
	
	



  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved