项目中需要在接收到来电之后把电话挂断,再做一些事情,在研究了Android源码以及参考了网络资料之后得出了如下方法:
1、定义并注册广播:
注册广播:
增加权限:
完成如上操作就可以监听来电和去电了,很简单的。
2、挂断电话:
在研究了电话源码之后发现要挂断电话,需要调用ITelephony的endCall方法,可是ITelephony是拿到不的,怎么办呢?首先想到的是反射,网上的参考资料也是用反射,
先来看网上的方法:
可是我在Android4.2版本上没有编译成功,就是用反射拿不到拿不到getITelephony方法,进源码看一下getITelephony():
里面就一句话,好吧,那句直接把这句话拷贝过来,看能不能调用,但结果是不行,因为ServiceManager你是无法拿到的。好吧,上绝招,见图:
没错,就是引入ServiceManager类。
实现如下:
这样就可以拿到ITelephony对象了。注意我是引入了ITelephony.aidl和NeighboringCellInfo.aidl。
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);
- }
转载:http://gqdy365.iteye.com/blog/2173057