当前位置:操作系统 > 安卓/Android >>

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;  
 /**  
  * Inte易做图ce 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}  
  */ 

inte易做图ce 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;
		}
	}

	
}

 

补充:移动开发 , Android ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,