当前位置: 首页 - 技术 - android 来电自动接听和自动挂断

android 来电自动接听和自动挂断

2012-02-29 作者: grassroot 浏览: 6963


android 来电自动接听和自动挂断 注意:android2.3版本不支持下面的自动接听方法。(会抛异常:java.lang.SecurityException: Neither user xxxxx nor current process has android.permission.MODIFY_PHONE_STATE.) 第一步:准备应用环境需要的系统包和aidl文件。 (1)在应用中创建包:android.telephony 将android系统框架下的\framework\telephony\java\android\telephony目录中的NeighboringCellInfo.aidl文件复制到上面创建的包(android.telephony )中; (2)在应用中创建包:com.android.internal.telephony 将android系统框架下的\framework\telephony\java\com\android\internal\telephony目录中的ITelephony.aidl文件复制到上面创建的包(com.android.internal.telephony )中; 第二步:创建一个获取ITelephony的方法 PhoneUtils.java

Java代码 
  • package com.zhouzijing.android.demo;
  • import java.lang.reflect.Method;
  • import com.android.internal.telephony.ITelephony;
  • import android.telephony.TelephonyManager;
  • public class PhoneUtils {
  • /**
  • * 根据传入的TelephonyManager来取得系统的ITelephony实例.
  • * @param telephony
  • * @return 系统的ITelephony实例
  • * @throws Exception
  • */
  • public static ITelephony getITelephony(TelephonyManager telephony) throws Exception {
  • Method getITelephonyMethod = telephony.getClass().getDeclaredMethod("getITelephony");
  • getITelephonyMethod.setAccessible(true);//私有化函数也能使用
  • return (ITelephony)getITelephonyMethod.invoke(telephony);
  • }
  • }
  • package com.zhouzijing.android.demo;
    
    import java.lang.reflect.Method;
    import com.android.internal.telephony.ITelephony;
    import android.telephony.TelephonyManager;
    
    public class PhoneUtils {
    	/**
    	 * 根据传入的TelephonyManager来取得系统的ITelephony实例.
    	 * @param telephony
    	 * @return 系统的ITelephony实例
    	 * @throws Exception
    	 */
    	public static ITelephony getITelephony(TelephonyManager telephony) throws Exception { 
            Method getITelephonyMethod = telephony.getClass().getDeclaredMethod("getITelephony"); 
            getITelephonyMethod.setAccessible(true);//私有化函数也能使用 
            return (ITelephony)getITelephonyMethod.invoke(telephony); 
        }
    }

    第三步:创建电话广播拦截器 MyPhoneBroadcastReceiver.java

    Java代码 
  • package com.zhouzijing.android.demo;
  • import com.android.internal.telephony.ITelephony;
  • import android.content.BroadcastReceiver;
  • import android.content.Context;
  • import android.content.Intent;
  • import android.telephony.TelephonyManager;
  • import android.util.Log;
  • public class MyPhoneBroadcastReceiver extends BroadcastReceiver {
  • private final static String TAG = MyPhone.TAG;
  • @Override
  • public void onReceive(Context context, Intent intent) {
  • String action = intent.getAction();
  • Log.i(TAG, "[Broadcast]"+action);
  • //呼入电话
  • if(action.equals(MyPhone.B_PHONE_STATE)){
  • Log.i(TAG, "[Broadcast]PHONE_STATE");
  • doReceivePhone(context,intent);
  • }
  • }
  • /**
  • * 处理电话广播.
  • * @param context
  • * @param intent
  • */
  • public void doReceivePhone(Context context, Intent intent) {
  • String phoneNumber = intent.getStringExtra(
  • TelephonyManager.EXTRA_INCOMING_NUMBER);
  • TelephonyManager telephony = (TelephonyManager)context.getSystemService(
  • Context.TELEPHONY_SERVICE);
  • int state = telephony.getCallState();
  • switch(state){
  • case TelephonyManager.CALL_STATE_RINGING:
  • Log.i(TAG, "[Broadcast]等待接电话="+phoneNumber);
  • try {
  • ITelephony iTelephony = PhoneUtils.getITelephony(telephony);
  • iTelephony.answerRingingCall();//自动接通电话
  • //iTelephony.endCall();//自动挂断电话
  • } catch (Exception e) {
  • Log.e(TAG, "[Broadcast]Exception="+e.getMessage(), e);
  • }
  • break;
  • case TelephonyManager.CALL_STATE_IDLE:
  • Log.i(TAG, "[Broadcast]电话挂断="+phoneNumber);
  • break;
  • case TelephonyManager.CALL_STATE_OFFHOOK:
  • Log.i(TAG, "[Broadcast]通话中="+phoneNumber);
  • break;
  • }
  • }
  • }
  • package com.zhouzijing.android.demo;
    
    import com.android.internal.telephony.ITelephony;
    import android.content.BroadcastReceiver;
    import android.content.Context;
    import android.content.Intent;
    import android.telephony.TelephonyManager;
    import android.util.Log;
    
    public class MyPhoneBroadcastReceiver extends BroadcastReceiver {
    
    	private final static String TAG = MyPhone.TAG;
    
    	@Override
    	public void onReceive(Context context, Intent intent) {
    		String action = intent.getAction();
    		Log.i(TAG, "[Broadcast]"+action);
    
    		//呼入电话
    		if(action.equals(MyPhone.B_PHONE_STATE)){
    			Log.i(TAG, "[Broadcast]PHONE_STATE");
    			doReceivePhone(context,intent);
    		}
    	}
    
    	/**
    	 * 处理电话广播.
    	 * @param context
    	 * @param intent
    	 */
    	public void doReceivePhone(Context context, Intent intent) {
    		String phoneNumber = intent.getStringExtra(
    TelephonyManager.EXTRA_INCOMING_NUMBER);
    		TelephonyManager telephony = (TelephonyManager)context.getSystemService(
    Context.TELEPHONY_SERVICE);
    		int state = telephony.getCallState();
    
    		switch(state){
    		case TelephonyManager.CALL_STATE_RINGING:
    			Log.i(TAG, "[Broadcast]等待接电话="+phoneNumber);
    			try {
    				ITelephony iTelephony = PhoneUtils.getITelephony(telephony);
    				iTelephony.answerRingingCall();//自动接通电话
    				//iTelephony.endCall();//自动挂断电话
    			} catch (Exception e) {
    				Log.e(TAG, "[Broadcast]Exception="+e.getMessage(), e);
    			}
    			break;
    		case TelephonyManager.CALL_STATE_IDLE:
    			Log.i(TAG, "[Broadcast]电话挂断="+phoneNumber);
    			break;
    		case TelephonyManager.CALL_STATE_OFFHOOK:
    			Log.i(TAG, "[Broadcast]通话中="+phoneNumber);
    			break;
    		}
    	}
    
    }

    第四部:注册电话广播拦截器 MyPhone.java

    Java代码 复制代码 收藏代码
  • package com.zhouzijing.android.demo;
  • import android.app.Activity;
  • import android.content.IntentFilter;
  • import android.os.Bundle;
  • import android.telephony.TelephonyManager;
  • import android.util.Log;
  • import android.view.View;
  • public class MyPhone extends Activity {
  • public final static String TAG = "MyPhone";
  • public final static String B_PHONE_STATE = TelephonyManager.ACTION_PHONE_STATE_CHANGED;
  • private MyPhoneBroadcastReceiver mBroadcastReceiver;
  • @Override
  • public void onCreate(Bundle savedInstanceState) {
  • super.onCreate(savedInstanceState);
  • setContentView(R.layout.my_phone);
  • }
  • //按钮1-注册广播
  • public void registerThis(View v) {
  • Log.i(TAG, "registerThis");
  • mBroadcastReceiver = new MyPhoneBroadcastReceiver();
  • IntentFilter intentFilter = new IntentFilter();
  • intentFilter.addAction(B_PHONE_STATE);
  • intentFilter.setPriority(Integer.MAX_VALUE);
  • registerReceiver(mBroadcastReceiver, intentFilter);
  • }
  • //按钮2-撤销广播
  • public void unregisterThis(View v) {
  • Log.i(TAG, "unregisterThis");
  • unregisterReceiver(mBroadcastReceiver);
  • }
  • }
  • package com.zhouzijing.android.demo;
    
    import android.app.Activity;
    import android.content.IntentFilter;
    import android.os.Bundle;
    import android.telephony.TelephonyManager;
    import android.util.Log;
    import android.view.View;
    
    public class MyPhone extends Activity {
    	public final static String TAG = "MyPhone";
    
    	public final static String B_PHONE_STATE = TelephonyManager.ACTION_PHONE_STATE_CHANGED;
    
    	private MyPhoneBroadcastReceiver mBroadcastReceiver;
    
    	@Override
    	public void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.my_phone);
    	}
    
    	//按钮1-注册广播
    	public void registerThis(View v) {
    		Log.i(TAG, "registerThis");
    		mBroadcastReceiver = new MyPhoneBroadcastReceiver();
    		IntentFilter intentFilter = new IntentFilter();
    		intentFilter.addAction(B_PHONE_STATE);
    		intentFilter.setPriority(Integer.MAX_VALUE);
    		registerReceiver(mBroadcastReceiver, intentFilter);
    	}
    
    	//按钮2-撤销广播
    	public void unregisterThis(View v) {
    		Log.i(TAG, "unregisterThis");
    		unregisterReceiver(mBroadcastReceiver);
    	}
    
    }

    第5步:在AndroidManifest.xml配置权限

    Xml代码 
  •     
        
        

    其中:

    Java代码 
  • iTelephony.answerRingingCall();//自动接通电话
  • iTelephony.answerRingingCall();//自动接通电话

    必须有权限 android.permission.MODIFY_PHONE_STATE

    Java代码 
  • iTelephony.endCall();//自动挂断电话
  • iTelephony.endCall();//自动挂断电话

    必须有权限 android.permission.CALL_PHONE


    评论
    本文作者 阅读排行 文章推荐