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