您的位置:首页 > 移动开发 > Android开发

android自动接听和挂断电话

2013-01-21 16:45 274 查看
实现android自动接听和挂断电话功能。代码如下:

 添加权限

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

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

  main.xml

  <?xml version="1.0" encoding="utf-8"?>

  <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

  androidrientation="vertical" android:layout_width="fill_parent"

  android:layout_height="fill_parent">

  <RadioGroup android:layout_height="wrap_content"

  android:layout_width="fill_parent" android:id="@+id/rGrpSelect">

  <RadioButton android:layout_height="wrap_content"

  android:layout_width="fill_parent" android:id="@+id/rbtnAutoAccept"

  android:text="所有来电自动接听"></RadioButton>

  <RadioButton android:layout_height="wrap_content"

  android:layout_width="fill_parent" android:id="@+id/rbtnAutoReject"

  android:text="所有来电自动挂断"></RadioButton>

  </RadioGroup>

  <ToggleButton android:layout_height="wrap_content"

  android:layout_width="fill_parent" android:id="@+id/tbtnRadioSwitch"

  android:textOn="Radio已经启动" android:textOff="Radio已经关闭"

  android:textSize="24dip" android:textStyle="normal"></ToggleButton>

  <ToggleButton android:layout_height="wrap_content"

  android:layout_width="fill_parent" android:id="@+id/tbtnDataConn"

  android:textSize="24dip" android:textStyle="normal" android:textOn="允许数据连接"

  android:textOff="禁止数据连接"></ToggleButton>

  </LinearLayout>

复制代码

  PhoneUtils.java是手机功能类,从TelephonyManager中实例化ITelephony并返回,源码如下:

  package com.testTelephony;

  import java.lang.reflect.Field;

  import java.lang.reflect.Method;

  import com.android.internal.telephony.ITelephony;

  import android.telephony.TelephonyManager;

  import android.util.Log;

  public class 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);

  }

  static public void printAllInform(Class clsShow) {

  try {

  // 取得所有方法

  Method[] hideMethod = clsShow.getDeclaredMethods();

  int i = 0;

  for (; i < hideMethod.length; i++) {

  Log.e("method name", hideMethod.getName());

  }

  // 取得所有常量

  Field[] allFields = clsShow.getFields();

  for (i = 0; i < allFields.length; i++) {

  Log.e("Field name", allFields.getName());

  }

  } catch (SecurityException e) {

  // throw new RuntimeException(e.getMessage());

  e.printStackTrace();

  } catch (IllegalArgumentException e) {

  // throw new RuntimeException(e.getMessage());

  e.printStackTrace();

  } catch (Exception e) {

  // TODO Auto-generated catch block

  e.printStackTrace();

  }

  }

  }

复制代码

  testTelephony.java是主类,使用PhoneStateListener监听通话状态,以及实现上述4种电话控制功能,源码如下:

  package com.testTelephony;

  import android.app.Activity;

  import android.os.Bundle;

  import android.telephony.PhoneStateListener;

  import android.telephony.TelephonyManager;

  import android.util.Log;

  import android.view.View;

  import android.widget.RadioGroup;

  import android.widget.ToggleButton;

  public class testTelephony extends Activity {

  /** Called when the activity is first created. */

  RadioGroup rg;//来电操作单选框

  ToggleButton tbtnRadioSwitch;//Radio开关

  ToggleButton tbtnDataConn;//数据连接的开关

  TelephonyManager telMgr;

  CallStateListener stateListner;

  int checkedId=0;

  @Override

  public void onCreate(Bundle savedInstanceState) {

  super.onCreate(savedInstanceState);

  setContentView(R.layout.main);

  telMgr= (TelephonyManager)getSystemService(TELEPHONY_SERVICE);

  100

  telMgr.listen(new CallStateListener(), CallStateListener.LISTEN_CALL_STATE);

  PhoneUtils.printAllInform(TelephonyManager.class);

  rg = (RadioGroup)findViewById(R.id.rGrpSelect);

  rg.setOnCheckedChangeListener(new CheckEvent());

  tbtnRadioSwitch=(ToggleButton)this.findViewById(R.id.tbtnRadioSwitch);

  tbtnRadioSwitch.setOnClickListener(new ClickEvent());

  try {

  tbtnRadioSwitch.setChecked(PhoneUtils.getITelephony(telMgr).isRadioOn());

  } catch (Exception e) {

  Log.e("error",e.getMessage());

  }

  tbtnDataConn=(ToggleButton)this.findViewById(R.id.tbtnDataConn);

  tbtnDataConn.setOnClickListener(new ClickEvent());

  try {

  tbtnDataConn.setChecked(PhoneUtils.getITelephony(telMgr).isDataConnectivityPossible());

  } catch (Exception e) {

  Log.e("error",e.getMessage());

  }

  }

  /**

  * 来电时的操作

  * @author GV

  *

  */

  public class CheckEvent implements RadioGroup.OnCheckedChangeListener{

  @Override

  public void onCheckedChanged(RadioGroup group, int checkedId) {

  testTelephony.this.checkedId=checkedId;

  }

  }

  /**

  * Radio和数据连接的开关

  * @author GV

  *

  */

  public class ClickEvent implements View.OnClickListener{

  @Override

  public void onClick(View v) {

  if (v == tbtnRadioSwitch) {

  try {

  PhoneUtils.getITelephony(telMgr).setRadio(tbtnRadioSwitch.isChecked());

  } catch (Exception e) {

  Log.e("error", e.getMessage());

  }

  }

  else if(v==tbtnDataConn){

  try {

  if(tbtnDataConn.isChecked())

  PhoneUtils.getITelephony(telMgr).enableDataConnectivity();

  else if(!tbtnDataConn.isChecked())

  PhoneUtils.getITelephony(telMgr).disableDataConnectivity();

  } catch (Exception e) {

  Log.e("error", e.getMessage());

  }

  }

  }

  }

  /**

  * 监视电话状态

  * @author GV

  *

  */

  public class CallStateListener extends PhoneStateListener {

  @Override

  public void onCallStateChanged(int state, String incomingNumber) {

  if(state==TelephonyManager.CALL_STATE_IDLE)//挂断

  {

  Log.e("IDLE",incomingNumber);

  }

  else if(state==TelephonyManager.CALL_STATE_OFFHOOK)//接听

  {

  Log.e("OFFHOOK",incomingNumber);

  }

  else if(state==TelephonyManager.CALL_STATE_RINGING)//来电

  {

  if(testTelephony.this.checkedId==R.id.rbtnAutoAccept)

  {

  try {

  //需要<uses-permission android:name="android.permission.MODIFY_PHONE_STATE" />

  PhoneUtils.getITelephony(telMgr).silenceRinger();//静铃

  PhoneUtils.getITelephony(telMgr).answerRingingCall();//自动接听

  } catch (Exception e) {

  Log.e("error",e.getMessage());

  }

  }

  else if(testTelephony.this.checkedId==R.id.rbtnAutoReject)

  {

  try {

  PhoneUtils.getITelephony(telMgr).endCall();//挂断

  PhoneUtils.getITelephony(telMgr).cancelMissedCallsNotification();//取消未接显示

  } catch (Exception e) {

  Log.e("error",e.getMessage());

  }

  }

  }

  super.onCallStateChanged(state, incomingNumber);

  }

  }

  }

复制代码
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: