`
stephen830
  • 浏览: 2964501 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

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

阅读更多

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

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

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

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配置权限

    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.MODIFY_PHONE_STATE" />
    <uses-permission android:name="android.permission.CALL_PHONE"/>
 

其中:

iTelephony.answerRingingCall();//自动接通电话

 必须有权限 android.permission.MODIFY_PHONE_STATE

 

iTelephony.endCall();//自动挂断电话

 必须有权限 android.permission.CALL_PHONE

 

 

 

 

 

 

 

分享到:
评论
4 楼 qyqingyan 2015-01-13  
不明白为什么?
3 楼 qyqingyan 2015-01-13  
有时起作用,有时不起作用!
2 楼 dpf110120 2014-08-04  
兄弟,我用这个代码发现在三星i869手机上,使用自动挂断endCall方法,返回全是false,挂断失败,请问您碰到过这个情况吗?

另你这个代码在什么型号的手机上测试通过的?
1 楼 zw0218zw 2014-05-09  
我按照您说的步骤结果:import android.telephony.CellInfo;找不到提示错误:couldn't find import for class android.telephony.CellInfo,请问怎么解决。

相关推荐

Global site tag (gtag.js) - Google Analytics