当前位置: 代码迷 >> Android >> Android自动挂断复电(ITelephony的使用)
  详细解决方案

Android自动挂断复电(ITelephony的使用)

热度:73   发布时间:2016-04-28 02:54:42.0
Android自动挂断来电(ITelephony的使用)

项目中需要在接收到来电之后把电话挂断,再做一些事情,在研究了Android源码以及参考了网络资料之后得出了如下方法:

1、定义并注册广播:
public void onReceive(final Context context, Intent intent) {		if (intent.getAction().equals(Intent.ACTION_NEW_OUTGOING_CALL)) {			//去电,可以用定时挂断		} else {			//来电			String state = intent.getStringExtra(TelephonyManager.EXTRA_STATE);			if (state.equalsIgnoreCase(TelephonyManager.EXTRA_STATE_RINGING)) {				Log.d(TAG, "--------coming call , end call!!!");				endCall(context);			}		}	}


注册广播:

        <receiver            android:name="com.jerome.util.TelInternal"            android:enabled="true" >            <intent-filter>                <action android:name="android.intent.action.NEW_OUTGOING_CALL" />                <action android:name="android.intent.action.PHONE_STATE" />            </intent-filter>        </receiver>


增加权限:
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />    <uses-permission android:name="android.permission.CALL_PHONE" />    <uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" />


完成如上操作就可以监听来电和去电了,很简单的。

2、挂断电话:
在研究了电话源码之后发现要挂断电话,需要调用ITelephony的endCall方法,可是ITelephony是拿到不的,怎么办呢?首先想到的是反射,网上的参考资料也是用反射,
先来看网上的方法:
	private static ITelephony getITelephony(Context context) {		ITelephony iTelephony = null;		TelephonyManager mTelephonyManager = (TelephonyManager) context				.getSystemService(Context.TELEPHONY_SERVICE);		Class<TelephonyManager> c = TelephonyManager.class;		Method getITelephonyMethod = null;		Method[] m = c.getMethods();		for (int i = 0; i < m.length; i++) {			Log.i("jerome", "" + m[i].getName() + "____"					+ m[i].getReturnType().getName());		}		try {			//这种方法没有测试成功,直接将源码拷贝过来了;			 getITelephonyMethod =c.getDeclaredMethod("getITelephony",(Class[])null); // 获取声明的方法			 getITelephonyMethod.setAccessible(true);		} catch (Exception e) {			e.printStackTrace();		}		return iTelephony;	}

可是我在Android4.2版本上没有编译成功,就是用反射拿不到拿不到getITelephony方法,进源码看一下getITelephony():
    private ITelephony getITelephony() {        return ITelephony.Stub.asInterface(ServiceManager.getService(Context.TELEPHONY_SERVICE));    }


里面就一句话,好吧,那句直接把这句话拷贝过来,看能不能调用,但结果是不行,因为ServiceManager你是无法拿到的。好吧,上绝招,见图:



没错,就是引入ServiceManager类。
实现如下:
	private ITelephony getITelephony(Context context) {		ITelephony iTelephony = null;		try {			iTelephony = ITelephony.Stub.asInterface(ServiceManager.getService(Context.TELEPHONY_SERVICE));		} catch (Exception e) {			e.printStackTrace();		}		return iTelephony;	}


这样就可以拿到ITelephony对象了。注意我是引入了ITelephony.aidl和NeighboringCellInfo.aidl。

	private void endCall(Context context) {		AudioManager mAudioManager = (AudioManager) context				.getSystemService(Context.AUDIO_SERVICE);		// 先静音处理		mAudioManager.setRingerMode(AudioManager.RINGER_MODE_SILENT);		try {			ITelephony iTelephony = getITelephony(context);			if (null != iTelephony) {				iTelephony.endCall(); // 挂断电话			}		} catch (Exception e) {			e.printStackTrace();		}		// 再恢复正常铃声		mAudioManager.setRingerMode(AudioManager.RINGER_MODE_NORMAL);	}


好了,这样就可以拦截并挂断电话了,再根据你记录的黑名单,就可以实现指定电话拦截功能了。祝你好运~!

有什么问题可以留言给我。
  相关解决方案