Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android 電話自動接聽和掛斷詳解

Android 電話自動接聽和掛斷詳解

編輯:關於Android編程

1、通過aidl及反射實現掛斷電話

具體分三步:
(1)ITelephony.aidl ,必須新建com.android.internal.telephony包並放入ITelephony.aidl文件(構建後在gen下有ITelephony.java文件,這是aidl生成的接口),文件內容如下:
package com.android.internal.telephony;
interface ITelephony{
boolean endCall();
void answerRingingCall();
}
(2)在需要的類中添加如下方法,代碼如下(通過反射獲取電話接口的實例)

/**
* @param context
* @return
*/
private static ITelephony getITelephony(Context context) {
TelephonyManager mTelephonyManager = (TelephonyManager) context
.getSystemService(TELEPHONY_SERVICE);
Class c = TelephonyManager.class;
Method getITelephonyMethod = null;
try {
getITelephonyMethod = c.getDeclaredMethod("getITelephony",
(Class[]) null); // 獲取聲明的方法
getITelephonyMethod.setAccessible(true);
} catch (SecurityException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
}

try {
ITelephony iTelephony = (ITelephony) getITelephonyMethod.invoke(
mTelephonyManager, (Object[]) null); // 獲取實例
return iTelephony;
} catch (Exception e) {
e.printStackTrace();
}
return iTelephony;
}

(3)在來電時調用此實例,然後調用此endCall()方法。

mTelephonyManager = (TelephonyManager) this
.getSystemService(TELEPHONY_SERVICE);
mTelephonyManager.listen(phoneStateListener,
PhoneStateListener.LISTEN_CALL_STATE);

//電話實例
PhoneStateListener phoneStateListener = new PhoneStateListener() {

@Override
public void onCallStateChanged(int state, String incomingNumber) {

switch (state) {
case TelephonyManager.CALL_STATE_RINGING :
iTelephony = getITelephony(getApplicationContext()); //獲取電話接口
if (iTelephony != null) {
try {
iTelephony.endCall(); // 掛斷電話
Toast.makeText(getApplicationContext(),
"endCall "+ incomingNumber +" successful!", 3000).show();
} catch (RemoteException e) {
e.printStackTrace();
}
}
break;
default :
break;
}
}

};


aidl下載地址:http://download.csdn.net/detail/ab6326795/7993671


以上方法適用於版本2.3以前的,2.3以上的就不能用了


2、通過廣播通知系統進行接聽和掛斷

因為Android2.3以上增加了對permissionandroid.permission.MODIFY_PHONE_STATE的限制,2.3之前的通過反射機制調用ITelephone的能力的做法已經不適用。
2.3上實現方式:
public synchronized void answerRingingCall() {

查詢系統PhoneAPP應用(PhoneGlobals.java)實現了對耳機插入、多媒體按鍵等通知的接受和處理。其中未發現有特殊的地方,個人認為,如果系統接收到此廣播應該可以進行接聽或掛斷操作。

 // 2.3以上執行以下代碼實現自動接聽
                    Intent mintent = new Intent(Intent.ACTION_MEDIA_BUTTON);
                    
                    //按下音量
                    KeyEvent keyEvent = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_HEADSETHOOK);
                    mintent.putExtra("android.intent.extra.KEY_EVENT", keyEvent);
                    // 通話權限 允許程序撥打電話, 替換系統的撥號器界面
                    mContext.sendOrderedBroadcast(mintent,"android.permission.CALL_PRIVILEGED");

                    mintent = new Intent(Intent.ACTION_MEDIA_BUTTON);
                    keyEvent = new KeyEvent(KeyEvent.ACTION_UP,KeyEvent.KEYCODE_HEADSETHOOK);
                    mintent.putExtra("android.intent.extra.KEY_EVENT", keyEvent);

                    mContext.sendOrderedBroadcast(mintent,"android.permission.CALL_PRIVILEGED");


兩個都需要權限

     
    
        
    


綜合兩種方法就可以做出電話自動接聽和掛斷的APP了



  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved