1.Android2.3版本以下实现
http://bbs.51cto.com/viewthread.php?tid=1078059&extra=&page=1;
2.4.1版本的实现
http://stephen830.iteye.com/blog/1181786
3.高版本接听电话的实现
1. PhoneGlobals注册一个广播接收器,action就是上面我们发送的广播“android.intent.action.MEDIA_BUTTON”
ok..这个广播接收器接受到广播之后,就会执行onReceive()方法,也就是MediaButtonBroadcastReceiver的onReceive()方法。
在onReceive()方法里面,它会判断按下的keyEvent,如果是KeyEvent.KEYCODE_HEADSETHOOK的话,就会执行PhoneUtils.handleHeadsetHook(xxx)方法
在handleHeadsetHook(xxx)里面,会调用answerCall(phone.getRingingCall)方法,也就是接听电话了...
那么,就有个疑问,为什么android会提供这个MediaButtonBroadcastReceiver广播接收器呢?
其实,这个广播接收器是为了监听耳机上接听电话那个按钮的,耳机上有个按钮,来电时只要按一下,就可以接听电话,也就是会调用我们这个MediaButtonBroadcastReceiver
广播接收器。
那,这就给我们提供了方便之门,做自动接听程序的时候,尽管google已经增加了权限检查,但是我们通过绕过去的方式,利用MediaButtonBroadcastReceiver,从而达到了
我们的目的。
try { Method method = Class.forName("android.os.ServiceManager") .getMethod("getService", String.class); IBinder binder = (IBinder) method.invoke(null, new Object[]{TELEPHONY_SERVICE}); ITelephony telephony = ITelephony.Stub.asInterface(binder); telephony.answerRingingCall(); } catch (NoSuchMethodException e) { Log.d("Sandy", "", e); } catch (ClassNotFoundException e) { Log.d("Sandy", "", e); }catch (Exception e) { Log.d("Sandy", "", e); try{ Log.e("Sandy", "for version 4.1 or larger"); Intent intent = new Intent("android.intent.action.MEDIA_BUTTON"); KeyEvent keyEvent = new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_HEADSETHOOK); intent.putExtra("android.intent.extra.KEY_EVENT",keyEvent); sendOrderedBroadcast(intent,"android.permission.CALL_PRIVILEGED"); } catch (Exception e2) { Log.d("Sandy", "", e2); Intent meidaButtonIntent = new Intent(Intent.ACTION_MEDIA_BUTTON); KeyEvent keyEvent = new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_HEADSETHOOK); meidaButtonIntent.putExtra(Intent.EXTRA_KEY_EVENT,keyEvent); sendOrderedBroadcast(meidaButtonIntent, null); } }
在上面的代码里面,最开始的代码和第二点讲解的时候,没有什么区别,主要看Exception发生之后,try{}里面的代码,也就是:
Log.e("Sandy", "for version 4.1 or larger"); Intent intent = new Intent("android.intent.action.MEDIA_BUTTON"); KeyEvent keyEvent = new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_HEADSETHOOK); intent.putExtra("android.intent.extra.KEY_EVENT",keyEvent); sendOrderedBroadcast(intent,"android.permission.CALL_PRIVILEGED");
/ Broadcast receiver purely for ACTION_MEDIA_BUTTON broadcasts private final BroadcastReceiver mMediaButtonReceiver = new MediaButtonBroadcastReceiver(); protected class MediaButtonBroadcastReceiver extends BroadcastReceiver { <a href="http://home.51cto.com/index.php?s=/space/5017954" target="_blank">@override</a> public void onReceive(Context context, Intent intent) { KeyEvent event = (KeyEvent) intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT); if ((event != null) && (event.getKeyCode() == KeyEvent.KEYCODE_HEADSETHOOK)) { boolean consumed = PhoneUtils.handleHeadsetHook(phone, event); ..... } else { .... } } }
static boolean handleHeadsetHook(Phone phone, KeyEvent event) { ... answerCall(phone.getRingingCall()); ... }