android程序接通和掛斷電話

package com.ebupt.phonerecorddemo.server;

import java.lang.reflect.Method;
import android.content.Context;
import android.content.Intent;
import android.telephony.TelephonyManager;
import android.util.Log;
import android.view.KeyEvent;

import com.android.internal.telephony.ITelephony;

public class PhoneUtils {
	static String TAG = "PhoneUtils";
	/**
	 * 從TelephonyManager中實例化ITelephony,並返回
	 */
	static public ITelephony getITelephony(TelephonyManager telMgr)
			throws Exception {
		Method getITelephonyMethod = telMgr.getClass().getDeclaredMethod(
				"getITelephony");
		getITelephonyMethod.setAccessible(true);// 私有化函數也能使用
		return (ITelephony) getITelephonyMethod.invoke(telMgr);
	}
	
	//自動接聽
	public static void autoAnswerPhone(Context c,TelephonyManager tm) {
		try {
			Log.i(TAG, "autoAnswerPhone");
			ITelephony itelephony = getITelephony(tm);
			// itelephony.silenceRinger();
			itelephony.answerRingingCall();
		} catch (Exception e) {
			e.printStackTrace();
			try {
				Log.e(TAG, "用於Android2.3及2.3以上的版本上");
				Intent intent = new Intent("android.intent.action.MEDIA_BUTTON");
				KeyEvent keyEvent = new KeyEvent(KeyEvent.ACTION_DOWN,
						KeyEvent.KEYCODE_HEADSETHOOK);
				intent.putExtra("android.intent.extra.KEY_EVENT", keyEvent);
				c.sendOrderedBroadcast(intent,
						"android.permission.CALL_PRIVILEGED");
				intent = new Intent("android.intent.action.MEDIA_BUTTON");
				keyEvent = new KeyEvent(KeyEvent.ACTION_UP,
						KeyEvent.KEYCODE_HEADSETHOOK);
				intent.putExtra("android.intent.extra.KEY_EVENT", keyEvent);
				c.sendOrderedBroadcast(intent,
						"android.permission.CALL_PRIVILEGED");
				Intent localIntent1 = new Intent(Intent.ACTION_HEADSET_PLUG);
				localIntent1.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
				localIntent1.putExtra("state", 1);
				localIntent1.putExtra("microphone", 1);
				localIntent1.putExtra("name", "Headset");
				c.sendOrderedBroadcast(localIntent1,
						"android.permission.CALL_PRIVILEGED");
				Intent localIntent2 = new Intent(Intent.ACTION_MEDIA_BUTTON);
				KeyEvent localKeyEvent1 = new KeyEvent(KeyEvent.ACTION_DOWN,
						KeyEvent.KEYCODE_HEADSETHOOK);
				localIntent2.putExtra("android.intent.extra.KEY_EVENT",
						localKeyEvent1);
				c.sendOrderedBroadcast(localIntent2,
						"android.permission.CALL_PRIVILEGED");
				Intent localIntent3 = new Intent(Intent.ACTION_MEDIA_BUTTON);
				KeyEvent localKeyEvent2 = new KeyEvent(KeyEvent.ACTION_UP,
						KeyEvent.KEYCODE_HEADSETHOOK);
				localIntent3.putExtra("android.intent.extra.KEY_EVENT",
						localKeyEvent2);
				c.sendOrderedBroadcast(localIntent3,
						"android.permission.CALL_PRIVILEGED");
				Intent localIntent4 = new Intent(Intent.ACTION_HEADSET_PLUG);
				localIntent4.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
				localIntent4.putExtra("state", 0);
				localIntent4.putExtra("microphone", 1);
				localIntent4.putExtra("name", "Headset");
				c.sendOrderedBroadcast(localIntent4,
						"android.permission.CALL_PRIVILEGED");
			} catch (Exception e2) {
				e2.printStackTrace();
				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);
				c.sendOrderedBroadcast(meidaButtonIntent, null);
			}
		}
	}
	
	//自動掛斷
	public static void endPhone(Context c,TelephonyManager tm) {
		try {
			Log.i(TAG, "endPhone");
			ITelephony iTelephony;
			Method getITelephonyMethod = TelephonyManager.class
					.getDeclaredMethod("getITelephony", (Class[]) null);
			getITelephonyMethod.setAccessible(true);
			iTelephony = (ITelephony) getITelephonyMethod.invoke(tm,
					(Object[]) null);
			// 掛斷電話
			iTelephony.endCall();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}
package com.android.internal.telephony;  
 /**  
  * Interface used to interact with the phone.  Mostly this is used by the  
  * TelephonyManager class.  A few places are still using this directly.  
  * Please clean them up if possible and use TelephonyManager instead.  
  * {@hide}  
  */ 

interface ITelephony {      
 /**      
  * End call or go to the Home screen
  * @return whether it hung up     
  */    
	boolean endCall();      
   
   /**      
    * Answer the currently-ringing call.      
    *      
    * If there's already a current active call, that call will be      
    * automatically put on hold.  If both lines are currently in use, the     
    * current active call will be ended.      
    *    
    * TODO: provide a flag to let the caller specify what policy to use     
    * if both lines are in use.  (The current behavior is hardwired to     
    * "answer incoming, end ongoing", which is how the CALL button      
    * is specced to behave.)      
    *      
    * TODO: this should be a oneway call (especially since it's called     
    * directly from the key queue thread).      
    */     
    void answerRingingCall(); 
    
    /** 
     * Silence the ringer if an incoming call is currently ringing. 
     * (If vibrating, stop the vibrator also.) 
     * 
     * It's safe to call this if the ringer has already been silenced, or 
     * even if there's no incoming call.  (If so, this method will do nothing.) 
     * 
     * TODO: this should be a oneway call too (see above). 
     *       (Actually *all* the methods here that return void can 
     *       probably be oneway.) 
     */  
    void silenceRinger();
    
    /**
     * Allow mobile data connections.
     */
    boolean enableDataConnectivity();

    /**
     * Disallow mobile data connections.
     */
    boolean disableDataConnectivity();

    /**
     * Report whether data connectivity is possible.
     */
    boolean isDataConnectivityPossible();
} 
package com.ebupt.phonerecorddemo.server;

import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.telephony.TelephonyManager;
import android.util.Log;

public class PhoneReceiver extends BroadcastReceiver {
	String TAG = "PhoneReceiver";
	@Override
	public void onReceive(Context context, Intent intent) {
		TelephonyManager tm = (TelephonyManager) context
				.getSystemService(Service.TELEPHONY_SERVICE);
		switch (tm.getCallState()) {
		case TelephonyManager.CALL_STATE_OFFHOOK:// 電話打進來接通狀態;電話打出時首先監聽到的狀態。
			Log.i("onCallStateChanged", "CALL_STATE_OFFHOOK");
			break;
		case TelephonyManager.CALL_STATE_RINGING:// 電話打進來狀態
			Log.i("onCallStateChanged", "CALL_STATE_RINGING");
			PhoneUtils.autoAnswerPhone(context,tm);
			break;
		case TelephonyManager.CALL_STATE_IDLE:// 不管是電話打出去還是電話打進來都會監聽到的狀態。
			Log.i("onCallStateChanged", "CALL_STATE_IDLE");
			break;
		}
	}

	
}

 

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *