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 answerRingingCall();

}

(2)在需要的类中添加如下方法,代码如下(通过反射获取电话接口的实例)

/**

* @param context

* @return

*/

private static ITelephony getITelephony(Context context) {

TelephonyManager mTelephonyManager = (TelephonyManager) context

.getSystemService(TELEPHONY_SERVICE);

Class<TelephonyManager> c = TelephonyManager.class;

Method getITelephonyMethod = null;

try {

getITelephonyMethod = c.getDeclaredMethod("getITelephony",

(Class[]) null); // 获取声明的方法

getITelephonyMethod.setAccessible(true);

} catch (SecurityException e) {

e.printStackTrace();

} catch (NoSuchMethodException e) {

e.printStackTrace();

}

try {

ITelephony iTelephony = (ITelephony) getITelephonyMethod.invoke(

mTelephonyManager, (Object[]) null); // 获取实例

return iTelephony;

} catch (Exception e) {

e.printStackTrace();

}

return iTelephony;

}

(3)在来电时调用此实例,然后调用此endCall()方法。

mTelephonyManager = (TelephonyManager) this

.getSystemService(TELEPHONY_SERVICE);

mTelephonyManager.listen(phoneStateListener,

PhoneStateListener.LISTEN_CALL_STATE);

//电话实例

PhoneStateListener phoneStateListener = new PhoneStateListener() {

@Override

public void onCallStateChanged(int state, String incomingNumber) {

switch (state) {

case TelephonyManager.CALL_STATE_RINGING :

iTelephony = getITelephony(getApplicationContext()); //获取电话接口

if (iTelephony != null) {

try {

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

Toast.makeText(getApplicationContext(),

"endCall "+ incomingNumber +"  successful!", 3000).show();

} catch (RemoteException e) {

e.printStackTrace();

}

}

break;

default :

break;

}

}

};

aidl下载地址:http://download.csdn.net/detail/ab6326795/7993671

以上方法适用于版本2.3以前的,2.3以上的就不能用了

2、通过广播通知系统进行接听和挂断

因为Android2.3以上增加了对permissionandroid.permission.MODIFY_PHONE_STATE的限制,2.3之前的通过反射机制调用ITelephone的能力的做法已经不适用。

2.3上实现方式:

public synchronized void answerRingingCall() {

查询系统PhoneAPP应用(PhoneGlobals.java)实现了对耳机插入、多媒体按键等通知的接受和处理。其中未发现有特殊的地方,个人认为,如果系统接收到此广播应该可以进行接听或挂断操作。

 // 2.3以上执行以下代码实现自动接听
                    Intent mintent = new Intent(Intent.ACTION_MEDIA_BUTTON);

                    //按下音量
                    KeyEvent keyEvent = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_HEADSETHOOK);
                    mintent.putExtra("android.intent.extra.KEY_EVENT", keyEvent);
                    // 通话权限 允许程序拨打电话, 替换系统的拨号器界面
                    mContext.sendOrderedBroadcast(mintent,"android.permission.CALL_PRIVILEGED");

                    mintent = new Intent(Intent.ACTION_MEDIA_BUTTON);
                    keyEvent = new KeyEvent(KeyEvent.ACTION_UP,KeyEvent.KEYCODE_HEADSETHOOK);
                    mintent.putExtra("android.intent.extra.KEY_EVENT", keyEvent);

                    mContext.sendOrderedBroadcast(mintent,"android.permission.CALL_PRIVILEGED");

两个都需要权限

    <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"/>

综合两种方法就可以做出电话自动接听和挂断的APP了

时间: 2024-10-06 07:00:18

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 接听和挂断实现方式

参考: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权限限制已经改为系统权限. 普通应

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

原文地址:http://zhidao.baidu.com/link?url=LVQ9uI0sHUWtKOroOLc21aaAWOuJDZnqL4TXfwF5bQOUqCULMl3Ayzg5BBY29CuqQVcyvAY6DlrYpmUhyoiNGkOJhn1t37SZCmdrSNyIyby Android自动接听和挂断电话实现原理:http://blog.csdn.net/chenda_lin/article/details/41346493 Android提供的系统服务之--Telephony

【Android】状态栏通知Notification、NotificationManager详解(转)

在Android系统中,发一个状态栏通知还是很方便的.下面我们就来看一下,怎么发送状态栏通知,状态栏通知又有哪些参数可以设置? 首先,发送一个状态栏通知必须用到两个类:  NotificationManager . Notification. NotificationManager :  是状态栏通知的管理类,负责发通知.清楚通知等. NotificationManager 是一个系统Service,必须通过 getSystemService()方法来获取. [java] view plainc

【10.2.3】ArcGIS Runtime for Android搭建开发环境过程中问题详解

一.Visual Studio Ultimate2012安装过程问题 1.问题描述 安装完成后,您将看到一条消息,指示安装程序已完成,但并不是所有的功能具有已正确安装,以及以下警告消息: Microsoft Web Deploy 3.0 所需的证书不在有效期内根据当前系统时钟或签名文件中的时间戳验证时. 2.解决方案 修改电脑系统时间为2013年7月,断网后重新安装,成功后再联网. Visual Studio Ultimate2012激活密钥:RBCXF-CVBGR-382MK-DFHJ4-C6

unity3d-配置Android环境,打包发布Apk流程详解

31:unity3d-配置Android环境,打包发布Apk流程详解 作者 阿西纳尼 关注 2016.08.28 22:52 字数 498 阅读 1806评论 0喜欢 5 Unity配置Android环境,打包发布安卓流程 一:SDK与JDK下载地址:http://pan.baidu.com/s/1mhVaXHe下载完成后,解压文件 SDK文件 二.安装 JDK 运行安装程序jdk-7u67-windows-x64 Java-JDK 分别点击下一步进行安装. 安装中 在安装过程中先后会出现两次选

ANDROID自定义视图——onMeasure流程,MeasureSpec详解

简介: 在自定义view的时候,其实很简单,只需要知道3步骤: 1.测量--onMeasure():决定View的大小 2.布局--onLayout():决定View在ViewGroup中的位置 3.绘制--onDraw():如何绘制这个View. 而第3步的onDraw系统已经封装的很好了,基本不用我们来操心,只需要专注到1,2两个步骤就中好了. 而这篇文章就来谈谈第一步,也是十分关键得一步:"测量(Measure)" Measure(): Measure的中文意思就是测量.所以它的

android四大基础组件--Service生命周期详解

android四大基础组件--ServiceService 生命周期详解 1.Service的生命周期: I> 在非绑定Service情况下,只有oncreate(),onStartCommand(),onDestory()方法情况下:  操作方法对应生命周期一: a.[执行startService(Intent)] 执行生命周期方法:oncreate()--->onStartCommand(): b.[执行stopService(Intent)] 执行生命周期方法:onDestory();

Android 颜色渲染(九) PorterDuff及Xfermode详解

版权声明:本文为博主原创文章,未经博主允许不得转载. Android 颜色渲染(九)  PorterDuff及Xfermode详解 之前已经讲过了除ComposeShader之外Shader的全部子类, 在讲ComposeShader(组合渲染)之前,  由于构造ComposeShader需要 PorterDuffXfermode或者PorterDuff.Mode作为参数,所以在此先详细地了解下这两个类的作用,这对之后的绘图会有很大的帮 助: 在讲具体的使用之前补充一点知识,这就是 Proter