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()); ... }