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

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

1、定义并注册广播: 
Java代码   收藏代码
  1. public void onReceive(final Context context, Intent intent) {  
  2.         if (intent.getAction().equals(Intent.ACTION_NEW_OUTGOING_CALL)) {  
  3.             //去电,可以用定时挂断  
  4.         } else {  
  5.             //来电  
  6.             String state = intent.getStringExtra(TelephonyManager.EXTRA_STATE);  
  7.             if (state.equalsIgnoreCase(TelephonyManager.EXTRA_STATE_RINGING)) {  
  8.                 Log.d(TAG, "--------coming call , end call!!!");  
  9.                 endCall(context);  
  10.             }  
  11.         }  
  12.     }  


注册广播: 

Java代码   收藏代码
  1.     android:name="com.jerome.util.TelInternal"  
  2.     android:enabled="true" >  
  3.       
  4.         "android.intent.action.NEW_OUTGOING_CALL" />  
  5.         "android.intent.action.PHONE_STATE" />  
  6.       
  7.   


增加权限: 
Java代码   收藏代码
  1. "android.permission.READ_PHONE_STATE" />  
  2. "android.permission.CALL_PHONE" />  
  3. "android.permission.PROCESS_OUTGOING_CALLS" />  


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

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

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


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

Android自动挂断来电(ITelephony的使用)_第1张图片  

没错,就是引入ServiceManager类。 
实现如下: 
Java代码   收藏代码
  1. private ITelephony getITelephony(Context context) {  
  2.     ITelephony iTelephony = null;  
  3.     try {  
  4.         iTelephony = ITelephony.Stub.asInterface(ServiceManager.getService(Context.TELEPHONY_SERVICE));  
  5.     } catch (Exception e) {  
  6.         e.printStackTrace();  
  7.     }  
  8.     return iTelephony;  
  9. }  


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

Java代码   收藏代码
  1. private void endCall(Context context) {  
  2.     AudioManager mAudioManager = (AudioManager) context  
  3.             .getSystemService(Context.AUDIO_SERVICE);  
  4.     // 先静音处理  
  5.     mAudioManager.setRingerMode(AudioManager.RINGER_MODE_SILENT);  
  6.     try {  
  7.         ITelephony iTelephony = getITelephony(context);  
  8.         if (null != iTelephony) {  
  9.             iTelephony.endCall(); // 挂断电话  
  10.         }  
  11.     } catch (Exception e) {  
  12.         e.printStackTrace();  
  13.     }  
  14.     // 再恢复正常铃声  
  15.     mAudioManager.setRingerMode(AudioManager.RINGER_MODE_NORMAL);  
  16. }  
转载:http://gqdy365.iteye.com/blog/2173057

你可能感兴趣的:(android,转载)