黑名单电话自动拦截【Android】

1.功能描述: 

当前手机中保存了一些黑名单电话号(如110等)

当一个电话打入进来, 如果它刚好是一个黑名单号码, 就会自动将电话挂断

过程分析:

启动服务

在服务中监听电话状态, 

当电话状态是响铃时, 判断是否为黑名单号

如果是, 挂断电话

2.相关API

TelephonyManager: 电话服务的管理器

       context.getSystemService(Context.TELEPHONY_SERVICE)

: 得到它的对象

       listen(phoneStateListener,PhoneStateListener.LISTEN_CALL_STATE)

:监听电话状态: 



PhoneStateListener : 电话状态监听器

      onCallStateChanged(int state, String incomingNumber)

: 电话状态改变的回调方法

      TelephonyManager.CALL_STATE_IDLE : 空闲状态

      TelephonyManager.CALL_STATE_RINGING : 响铃状态

      TelephonyManager.CALL_STATE_OFFHOOK : 接通状态

3.挂断电话

说明:Android没有对外公开结束通话的API,如果需要结束通话,必须使用AIDL与电话管理服务进行通信,并调用服务中的API实现结束通话,方法如下:


1).从sdk的源码中复制下面一个文件
 com/android/internal/telephony/ITelephony.aidl


2).调用ITelephony.endCall()结束通话
 Method method = Class.forName("android.os.ServiceManager")
  .getMethod("getService", String.class);
 IBinder binder = (IBinder)method.invoke(null, Context.TELEPHONY_SERVICE);
 ITelephony telephony = ITelephony.Stub.asInterface(br);
 telephony.endCall(); inde


3). 声明打/挂断电话的权限
 

4.代码实现

1).ListenCallService

package com.example.appservice;

import java.lang.reflect.Method;

import com.android.internal.telephony.ITelephony;

import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.os.IBinder;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
import android.util.Log;

public class ListenCallService extends Service {

	private TelephonyManager tm;
	private PhoneStateListener listener = new PhoneStateListener() {

		// 当通话状态发生改变时调用
		public void onCallStateChanged(int state, String incomingNumber) {
			switch (state) {
			case TelephonyManager.CALL_STATE_IDLE:// 空闲(挂断电话/未来电之前)
				Log.e("TAG", "空闲(挂断电话/未来电之前)");
				break;

			case TelephonyManager.CALL_STATE_RINGING:// 响铃
				Log.e("TAG", "响铃");
				// 如果来电是黑名单号(110),就挂断电话
				if ("110".equals(incomingNumber)) {
					try {
						endCall();
					} catch (Exception e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}
				break;

			case TelephonyManager.CALL_STATE_OFFHOOK:// 接通
				Log.e("TAG", "接通");
				break;
			default:
				break;
			}
		}
	};

	@Override
	public IBinder onBind(Intent intent) {
		// TODO Auto-generated method stub
		return null;
	}

	/*
	 * 挂断电话
	 */
	private void endCall() throws Exception {
		// 通过反射调用隐藏的API
		// 得到隐藏类的Class对象
		Class c = Class.forName("android.os.ServiceManager");
		// 得到方法所对应的Method对象
		Method method = c.getMethod("getService", String.class);
		// 调用方法
		IBinder iBinder = (IBinder) method.invoke(null,
				Context.TELEPHONY_SERVICE);
		// 得到接口对象
		ITelephony telephony = ITelephony.Stub.asInterface(iBinder);
		// 结束通话
		telephony.endCall();

	}

	@Override
	public void onCreate() {
		// TODO Auto-generated method stub
		super.onCreate();

		// 得到电话管理器
		tm = (TelephonyManager) this
				.getSystemService(Context.TELEPHONY_SERVICE);
		// 监听电话状态
		tm.listen(listener, PhoneStateListener.LISTEN_CALL_STATE);
	}

	@Override
	public void onDestroy() {
		// TODO Auto-generated method stub
		super.onDestroy();
		// 停止电话监听
		tm.listen(listener, PhoneStateListener.LISTEN_NONE);
	}
}
2).黑名单拦截功能的开关

	public void startListenCall(View v){
		startService(new Intent(this, ListenCallService.class));
	}
	
	public void stopListenCall(View v){
		stopService(new Intent(this, ListenCallService.class));
	}

3).注册Service

5.设置开机即开启黑名单


            
                
            
        
package com.example.appservice;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
/**
 * 接收开机完成广播的receiver
 * @author Xiaocici
 *
 */
public class BootReceiver extends BroadcastReceiver {

	@Override
	public void onReceive(Context context, Intent intent) {
		//启动电话监听的receiver
		context.startService(new Intent(context, ListenCallService.class));

	}

}





你可能感兴趣的:(android)