Android自动接听电话和自动挂断实现


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

 

 

 

 

 

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM