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了
Android 电话自己主动接听和挂断具体解释的更多相关文章
- Android接听、挂断电话
新建一个名为ITelephony的aidl文件,注意包名不能改变,因为是通过反射方式来实现接听和挂断的
- android 接听和挂断实现方式
参考:android 来电接听和挂断 支持目前所有版本 注意:android2.3版本及以上不支持下面的自动接听方法. (会抛异常:java.lang.SecurityException: Neith ...
- Android 对电话进行监听和挂断
1.添加权限 <!--拨打电话的权限--><uses-permission android:name="android.permission.PROCESS_OUTGOIN ...
- Android电话拨打权限绕过漏洞(CVE-2013-6272)分析
原文:http://blogs.360.cn/360mobile/2014/07/08/cve-2013-6272/ 1. CVE-2013-6272漏洞背景 CVE-2013-6272是一个安卓平台 ...
- Android开发之通过反射获取到挂断电话的API
Android开发黑名单工具类,需要用到挂断电话的API,但是该API处于隐藏状态,需要通过反射得到该方法.. 步骤: 1.通过当前类获取到ServiceManager的字节码 Class< ? ...
- android 自己主动拒接后再取消自己主动拒接,该联系人来电界面无图标显示,且点击挂断无反应
1. 设置一个联系人为自己主动拒接 2. 该联系人来电 3. 取消该联系人的自己主动拒接 4. 该联系人来电 Error: 来电界面无头像显示,直接显示黑屏,且点击拒接butt ...
- Android 实现自动接听和挂断电话功能
添加权限 <uses-permission android:name="android.permission.CALL_PHONE"/> <uses-permis ...
- Android之——自己主动挂断电话的实现
转载请注明出处:http://blog.csdn.net/l1028386804/article/details/47072451 通过<Android之--AIDL小结>与<And ...
- 挂断电话demo
<!-- 结束通话和打电话的权限 --> <uses-permission android:name="android.permission.CALL_PHONE" ...
随机推荐
- 01_什么是Elasticsearch
Logstash是一个开源的用于收集,分析和存储日志的工具. Kibana4用来搜索和查看Logstash已索引的日志的web接口.这两个工具都基于 Elasticsearch. Logstash: ...
- HDU 2815 Mod Tree
不会,先搁着…… http://blog.csdn.net/acm_cxlove/article/details/7832197
- java线程学习——汉堡销售问题
汉堡店中有一个负责做汉堡的厨师,一个负责销售的营业员,用java线程表示他们的营业过程: 问题原型就是生产者与消费者的问题. 首先定义一个汉堡包箱子类与几个相关的变量类: public class H ...
- HDU 4705 Y
Y Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) Total Submis ...
- poj 2513
http://poj.org/problem?id=2513 73348K 1438MS C++ 1614B解题思路:欧拉路的应用 要点 :1.判断连通性 ...
- box-shadow 被其他div遮住 shadow was hidden/covered by another div
使用z-index 来处理 (z-index必须在使用了position的情况下才有效) 参考http://stackoverflow.com/questions/5505118/css-box-sh ...
- ASP.NET jQuery 随笔 在TextBox里面阻止复制、剪切和粘贴事件
当用户要输入一些密码.信用卡信息和银行账号等敏感信息,用户更希望手工通过键盘敲入数据,而好过通过剪贴板复制粘贴. 我们先来看下实现后的效果: <%@ Page Language="C# ...
- python 中函数参数传递形式
python中函数参数的传递是通过赋值来传递的.函数参数的使用又有俩个方面值得注意:1.函数参数是如何定义的 2.在调用函数的过程中参数是如何被解析 先看第一个问题,在python中函数参数的定义主要 ...
- (3)选择元素——(2)文档对象模型(The Document Object Model)
One of the most powerful aspects of jQuery is its ability to make selecting elements in the DOM easy ...
- Java集合中对象排序
集合中的对象排序需求还是比較常见的.当然我们能够重写equals方法,循环比較:同一时候Java为我们提供了更易使用的APIs.当须要排序的集合或数组不是单纯的数字型时,通常能够使用Comparato ...