android 来电自动接听和自动挂断
android 来电自动接听和自动挂断
?
?
注意:android2.3版本不支持下面的自动接听方法。(会抛异常:java.lang.SecurityException: Neither user xxxxx nor current process has android.permission.MODIFY_PHONE_STATE.)
?
?
第一步:准备应用环境需要的系统包和aidl文件。
?
(1)在应用中创建包:android.telephony
将android系统框架下的\framework\telephony\java\android\telephony目录中的NeighboringCellInfo.aidl文件复制到上面创建的包(android.telephony )中;
(2)在应用中创建包:com.android.internal.telephony
将android系统框架下的\framework\telephony\java\com\android\internal\telephony目录中的ITelephony.aidl文件复制到上面创建的包(com.android.internal.telephony )中;
?
?
第二步:创建一个获取ITelephony的方法
PhoneUtils.java
Java代码??
- package?com.zhouzijing.android.demo;??
- ??
- import?java.lang.reflect.Method;??
- import?com.android.internal.telephony.ITelephony;??
- import?android.telephony.TelephonyManager;??
- ??
- public?class?PhoneUtils?{??
- ????/**?
- ?????*?根据传入的TelephonyManager来取得系统的ITelephony实例.?
- ?????*?@param?telephony?
- ?????*?@return?系统的ITelephony实例?
- ?????*?@throws?Exception?
- ?????*/??
- ????public?static?ITelephony?getITelephony(TelephonyManager?telephony)?throws?Exception?{???
- ????????Method?getITelephonyMethod?=?telephony.getClass().getDeclaredMethod("getITelephony");???
- ????????getITelephonyMethod.setAccessible(true);//私有化函数也能使用???
- ????????return?(ITelephony)getITelephonyMethod.invoke(telephony);???
- ????}??
- }??
第三步:创建电话广播拦截器
MyPhoneBroadcastReceiver.java
Java代码??
- package?com.zhouzijing.android.demo;??
- ??
- import?com.android.internal.telephony.ITelephony;??
- import?android.content.BroadcastReceiver;??
- import?android.content.Context;??
- import?android.content.Intent;??
- import?android.telephony.TelephonyManager;??
- import?android.util.Log;??
- ??
- public?class?MyPhoneBroadcastReceiver?extends?BroadcastReceiver?{??
- ??
- ????private?final?static?String?TAG?=?MyPhone.TAG;??
- ??????
- ????@Override??
- ????public?void?onReceive(Context?context,?Intent?intent)?{??
- ????????String?action?=?intent.getAction();??
- ????????Log.i(TAG,?"[Broadcast]"+action);??
- ??????????
- ????????//呼入电话??
- ????????if(action.equals(MyPhone.B_PHONE_STATE)){??
- ????????????Log.i(TAG,?"[Broadcast]PHONE_STATE");??
- ????????????doReceivePhone(context,intent);??
- ????????}??
- ????}??
- ??????
- ????/**?
- ?????*?处理电话广播.?
- ?????*?@param?context?
- ?????*?@param?intent?
- ?????*/??
- ????public?void?doReceivePhone(Context?context,?Intent?intent)?{??
- ????????String?phoneNumber?=?intent.getStringExtra(??
- TelephonyManager.EXTRA_INCOMING_NUMBER);??
- ????????TelephonyManager?telephony?=?(TelephonyManager)context.getSystemService(??
- Context.TELEPHONY_SERVICE);??
- ????????int?state?=?telephony.getCallState();??
- ??????????
- ????????switch(state){??
- ????????case?TelephonyManager.CALL_STATE_RINGING:??
- ????????????Log.i(TAG,?"[Broadcast]等待接电话="+phoneNumber);??
- ????????????try?{??
- ????????????????ITelephony?iTelephony?=?PhoneUtils.getITelephony(telephony);??
- ????????????????iTelephony.answerRingingCall();//自动接通电话??
- ????????????????//iTelephony.endCall();//自动挂断电话??
- ????????????}?catch?(Exception?e)?{??
- ????????????????Log.e(TAG,?"[Broadcast]Exception="+e.getMessage(),?e);??
- ????????????}??
- ????????????break;??
- ????????case?TelephonyManager.CALL_STATE_IDLE:??
- ????????????Log.i(TAG,?"[Broadcast]电话挂断="+phoneNumber);??
- ????????????break;??
- ????????case?TelephonyManager.CALL_STATE_OFFHOOK:??
- ????????????Log.i(TAG,?"[Broadcast]通话中="+phoneNumber);??
- ????????????break;??
- ????????}??
- ????}??
- ??
- }??
?
第四部:注册电话广播拦截器
MyPhone.java
Java代码??
- package?com.zhouzijing.android.demo;??
- ??
- import?android.app.Activity;??
- import?android.content.IntentFilter;??
- import?android.os.Bundle;??
- import?android.telephony.TelephonyManager;??
- import?android.util.Log;??
- import?android.view.View;??
- ??
- public?class?MyPhone?extends?Activity?{??
- ????public?final?static?String?TAG?=?"MyPhone";??
- ??????
- ????public?final?static?String?B_PHONE_STATE?=?TelephonyManager.ACTION_PHONE_STATE_CHANGED;??
- ??????
- ????private?MyPhoneBroadcastReceiver?mBroadcastReceiver;??
- ??????
- ????@Override??
- ????public?void?onCreate(Bundle?savedInstanceState)?{??
- ????????super.onCreate(savedInstanceState);??
- ????????setContentView(R.layout.my_phone);??
- ????}??
- ??????
- ????//按钮1-注册广播??
- ????public?void?registerThis(View?v)?{??
- ????????Log.i(TAG,?"registerThis");??
- ????????mBroadcastReceiver?=?new?MyPhoneBroadcastReceiver();??
- ????????IntentFilter?intentFilter?=?new?IntentFilter();??
- ????????intentFilter.addAction(B_PHONE_STATE);??
- ????????intentFilter.setPriority(Integer.MAX_VALUE);??
- ????????registerReceiver(mBroadcastReceiver,?intentFilter);??
- ????}??
- ??????
- ????//按钮2-撤销广播??
- ????public?void?unregisterThis(View?v)?{??
- ????????Log.i(TAG,?"unregisterThis");??
- ????????unregisterReceiver(mBroadcastReceiver);??
- ????}??
- ??????
- }??
第5步:在AndroidManifest.xml配置权限
Xml代码??
- <uses-permission?android:name="android.permission.READ_PHONE_STATE"?/>??
- <uses-permission?android:name="android.permission.MODIFY_PHONE_STATE"?/>??
- <uses-permission?android:name="android.permission.CALL_PHONE"/>??
其中:
Java代码??
- iTelephony.answerRingingCall();//自动接通电话??
?必须有权限 android.permission.MODIFY_PHONE_STATE
?
Java代码??
- iTelephony.endCall();//自动挂断电话??
?必须有权限 android.permission.CALL_PHONE
?
?