android怎么实现自动接听和挂断电话功能

原文地址:http://zhidao.baidu.com/link?url=LVQ9uI0sHUWtKOroOLc21aaAWOuJDZnqL4TXfwF5bQOUqCULMl3Ayzg5BBY29CuqQVcyvAY6DlrYpmUhyoiNGkOJhn1t37SZCmdrSNyIyby

Android自动接听和挂断电话实现原理:http://blog.csdn.net/chenda_lin/article/details/41346493

Android提供的系统服务之--TelephonyManager(电话管理器):http://www.2cto.com/kf/201410/347844.html

android 实现来电自动接听和自动挂断的方法:
第一步:准备应用环境需要的系统包和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。

添加权限<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);          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);          }      }  }
时间: 2025-01-14 23:20:01

android怎么实现自动接听和挂断电话功能的相关文章

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"?> <Line

Android开发教程--自定义接听/挂断电话功能

1.首先在manifest中加入如下的权限 <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.MODIFY_PHONE_STATE" > </uses-permission> <uses-permission android:name=

Android之——自己主动挂断电话的实现

转载请注明出处:http://blog.csdn.net/l1028386804/article/details/47072451 通过<Android之--AIDL小结>与<Android之--AIDL深入>两篇博文.相信大家已经对Android AIDL有了一定的了解.以下,我们就利用Android的AIDL实现自己主动挂断电话的功能,好了.不多说了,我们直接进入主题. 1.准备AIDL文件 挂断电话的AIDL文件都是Android自带的文件,我们能够从Android的源码中找

Android挂断电话以及Java Class Loader

Android中,要自己实现一个挂断电话方法时,很久之前可以endCall().不过现在已经不行了,要应用反射机制,获取到 "android.os.ServiceManager" 的Class,然后通过反射调用其中的方法,具体如下: 在这个过程中,相当于远程调用系统的Service方法,也就是用到了AIDL机制,需要找到系统的两个AIDL拷贝到自己的项目中 : 然后方法代码如下: //挂断电话操作 private void endCall() { //IBinder b = Servi

Android自动接听&amp;挂断电话(包含怎么应对4.1以上版本的权限检

一  前言 这两天要研究类似白名单黑名单以及手势自动接听的一些功能,所以呢,自然而然的涉及到怎么自动接听/挂断电话的功能了.对于自动接听这一块,android4.1版本及其以上的版本和之前的版本处理逻辑不太一样,因为google增加了权限检查...所以,按照以前的方法可能不能实现自动接听了. 二  android低版本自动接听/挂断实现 1. copy android源代码的ITelephony.aidl文件到自己的项目为什么要copy这个文件到自己的项目中呢?这是因为接听/挂断电话的方法在接口

Android 电话自动接听和挂断详解

1.通过aidl及反射实现挂断电话 具体分三步: (1)ITelephony.aidl ,必须新建com.android.internal.telephony包并放入ITelephony.aidl文件(构建后在gen下有ITelephony.java文件,这是aidl生成的接口),文件内容如下: package com.android.internal.telephony; interface ITelephony{ boolean endCall(); void answerRingingCa

Android之——自动挂断电话的实现

转载请注明出处:http://blog.csdn.net/l1028386804/article/details/47072451 通过<Android之--AIDL小结>与<Android之--AIDL深入>两篇博文,相信大家已经对Android AIDL有了一定的了解,下面,我们就利用Android的AIDL实现自动挂断电话的功能,好了,不多说了,我们直接进入主题. 1.准备AIDL文件 挂断电话的AIDL文件都是Android自带的文件,我们可以从Android的源代码中找到

挂断电话——黑名单拦截

需要用Aidl,来与系统进程进行交互 (关于aidl的介绍: http://chenfeng0104.iteye.com/blog/1255302 http://www.cnblogs.com/mydomainlistentome/p/4687173.html) 首先在src下建立这样的包: com.android.internal.telephony 然后在这个包下建立这样的aidl文件: ITelephony.aidl package com.android.internal.telepho

android 接听和挂断实现方式

参考:android 来电接听和挂断 支持目前所有版本 注意:android2.3版本及以上不支持下面的自动接听方法. (会抛异常:java.lang.SecurityException: Neither user xxxxx nor current process has android.permission.MODIFY_PHONE_STATE.) 原因:android2.3版本及以上android.permission.MODIFY_PHONE_STATE权限限制已经改为系统权限. 普通应