文档章节

Android2.3以后拨打、接听、挂断电话操作

明轩chen
 明轩chen
发布于 2016/05/27 09:39
字数 558
阅读 33
收藏 0

Android2.3之前的系统可以通过反射机制调用ITelephone的方法来挂断电话,因为Android2.3以后增加了对 permission  android.permission.MODIFY_PHONE_STATE 的限制,之前的反射的方法不能用了,我们可以通过发送广播的方式来接听电话。

示例代码

package com.example.android_3gtest;  
      
    import java.lang.reflect.InvocationTargetException;  
    import java.lang.reflect.Method;  
    import android.content.Context;  
    import android.content.Intent;  
    import android.media.AudioManager;  
    import android.net.Uri;  
    import android.os.Build;  
    import android.telephony.TelephonyManager;  
    import android.text.TextUtils;  
    import android.view.KeyEvent;  
      
    public class PhoneUtil {  
      
        public static String TAG = PhoneUtil.class.getSimpleName();    
          
        /** 
         * 挂断电话 
         * @param context 
         */  
        public static void endCall(Context context) {    
            try {    
                Object telephonyObject = getTelephonyObject(context);    
                if (null != telephonyObject) {    
                    Class telephonyClass = telephonyObject.getClass();    
        
                    Method endCallMethod = telephonyClass.getMethod("endCall");    
                    endCallMethod.setAccessible(true);    
        
                    endCallMethod.invoke(telephonyObject);    
                }    
            } catch (SecurityException e) {    
                e.printStackTrace();    
            } catch (NoSuchMethodException e) {    
                e.printStackTrace();    
            } catch (IllegalArgumentException e) {    
                e.printStackTrace();    
            } catch (IllegalAccessException e) {    
                e.printStackTrace();    
            } catch (InvocationTargetException e) {    
                e.printStackTrace();    
            }    
        
        }    
            
        private static Object getTelephonyObject(Context context) {    
            Object telephonyObject = null;    
            try {    
                // 初始化iTelephony    
                TelephonyManager telephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);    
                // Will be used to invoke hidden methods with reflection    
                // Get the current object implementing ITelephony interface    
                Class telManager = telephonyManager.getClass();    
                Method getITelephony = telManager.getDeclaredMethod("getITelephony");    
                getITelephony.setAccessible(true);    
                telephonyObject = getITelephony.invoke(telephonyManager);    
            } catch (SecurityException e) {    
                e.printStackTrace();    
            } catch (NoSuchMethodException e) {    
                e.printStackTrace();    
            } catch (IllegalArgumentException e) {    
                e.printStackTrace();    
            } catch (IllegalAccessException e) {    
                e.printStackTrace();    
            } catch (InvocationTargetException e) {    
                e.printStackTrace();    
            }    
            return telephonyObject;    
        }    
        
            
        /** 
         * 通过反射调用的方法,接听电话,该方法只在android 2.3之前的系统上有效。 
         * @param context 
         */    
        private static void answerRingingCallWithReflect(Context context) {    
            try {    
                Object telephonyObject = getTelephonyObject(context);    
                if (null != telephonyObject) {    
                     Class telephonyClass = telephonyObject.getClass();    
                     Method endCallMethod = telephonyClass.getMethod("answerRingingCall");    
                     endCallMethod.setAccessible(true);    
                        
                     endCallMethod.invoke(telephonyObject);    
                    // ITelephony iTelephony = (ITelephony) telephonyObject;    
                    // iTelephony.answerRingingCall();    
                }    
            } catch (SecurityException e) {    
                e.printStackTrace();    
            } catch (IllegalArgumentException e) {    
                e.printStackTrace();    
            } catch (IllegalAccessException e) {    
                e.printStackTrace();    
            } catch (InvocationTargetException e) {    
                e.printStackTrace();    
            } catch (NoSuchMethodException e) {    
                e.printStackTrace();    
            }    
        
        }    
            
        /** 
         * 伪造一个有线耳机插入,并按接听键的广播,让系统开始接听电话。 
         * @param context 
         */    
        private static void answerRingingCallWithBroadcast(Context context){    
            AudioManager localAudioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);    
            //判断是否插上了耳机    
            boolean isWiredHeadsetOn = localAudioManager.isWiredHeadsetOn();    
            if (!isWiredHeadsetOn) {    
                Intent headsetPluggedIntent = new Intent(Intent.ACTION_HEADSET_PLUG);    
                headsetPluggedIntent.putExtra("state", 1);    
                headsetPluggedIntent.putExtra("microphone", 0);    
                headsetPluggedIntent.putExtra("name", "");    
                context.sendBroadcast(headsetPluggedIntent);    
                    
                Intent meidaButtonIntent = new Intent(Intent.ACTION_MEDIA_BUTTON);    
                KeyEvent keyEvent = new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_HEADSETHOOK);    
                meidaButtonIntent.putExtra(Intent.EXTRA_KEY_EVENT,keyEvent);    
                context.sendOrderedBroadcast(meidaButtonIntent, null);    
                    
                Intent headsetUnpluggedIntent = new Intent(Intent.ACTION_HEADSET_PLUG);    
                headsetUnpluggedIntent.putExtra("state", 0);    
                headsetUnpluggedIntent.putExtra("microphone", 0);    
                headsetUnpluggedIntent.putExtra("name", "");    
                context.sendBroadcast(headsetUnpluggedIntent);    
                    
            } else {    
                Intent meidaButtonIntent = new Intent(Intent.ACTION_MEDIA_BUTTON);    
                KeyEvent keyEvent = new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_HEADSETHOOK);    
                meidaButtonIntent.putExtra(Intent.EXTRA_KEY_EVENT,keyEvent);    
                context.sendOrderedBroadcast(meidaButtonIntent, null);    
            }    
        }    
        
        /** 
         * 接听电话 
         * @param context 
         */    
        public static void answerRingingCall(Context context) {    
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD) {  //2.3或2.3以上系统  
                answerRingingCallWithBroadcast(context);    
            } else {    
                answerRingingCallWithReflect(context);    
            }    
        }    
            
        /** 
         * 打电话 
         * @param context 
         * @param phoneNumber 
         */    
        public static void callPhone(Context context, String phoneNumber) {    
            if(!TextUtils.isEmpty(phoneNumber)){    
                try {    
                    Intent callIntent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:"+ phoneNumber));    
                    context.startActivity(callIntent);    
                } catch (Exception e) {    
                    e.printStackTrace();    
                }    
            }    
        }    
            
        /** 
         * 拨电话 
         * @param context 
         * @param phoneNumber 
         */    
        public static void dialPhone(Context context, String phoneNumber){    
            if(!TextUtils.isEmpty(phoneNumber)){    
                try {    
                    Intent callIntent = new Intent(Intent.ACTION_DIAL, Uri.parse("tel:"+ phoneNumber));    
                    context.startActivity(callIntent);    
                } catch (Exception e) {    
                    e.printStackTrace();    
                }    
            }    
        }    
    }

本文转载自:http://www.open-open.com/solution/view/1410493939195

明轩chen
粉丝 12
博文 1
码字总数 0
作品 0
广州
私信 提问
利用liblinphone拨打移动电话或固定电话,如何获取被叫方接听状态

我在Ubuntu上基于linphone提供的liblinphone库开发了自己的voip软件。可以通过sip服务器拨打sip电话一切正常,但是在拨打移动电话或固定电话时(注:我的sip服务器为IPPBX,并通过有线电话或...

jisywh
2015/11/30
1K
1
Android蓝牙开发【八】hfp接听、挂断电话

继续研究hfp相关功能。蓝牙耳机可以控制手机接听、拒接、挂断电话,拨打电话等功能。本文主要分析下起这些操作的大致流程。 在系统应用Bluetooth中comandroidbluetooth.cpp提供了多个回调方法...

天王盖地虎626
01/09
0
0
Android 蓝牙开发(八)hfp接听、挂断电话

转载请注明出处:http://blog.csdn.net/vnanyesheshou/article/details/71429860 本文已授权微信公众号 fanfan程序媛 独家发布 扫一扫文章底部的二维码或在微信搜索 fanfan程序媛 即可关注 ...

VNanyesheshou
2017/05/10
0
0
数据统计对IT服务管理的重要性——服务台语音系统之报表功能

如前面ACD(来电分配)部分中提到的,ACD在非常老旧的PBX(用户专用自动电话交换机)系统中都能实现,而报表功能则是决定PBX能否应用在Service Desk环境中的关键。 评估服务台运作所需数据 ...

rickho
2010/11/10
0
0
Android] 使用广播接收器Braodcast Receiver 监听手机来电 去电 挂断的事

Braodcast Receiver顾名思义就是广播接收器,它和时间处理机制类似,但是事件处理机制是程序组件级别的(比如:按钮的单击事件),而广播事件处理机制是系统级别的。我们可以用Intent来启动一...

等待流星
2014/03/06
0
0

没有更多内容

加载失败,请刷新页面

加载更多

RocketMQ的事务投递

RocketMQ的事务投递 这是阿里的分布式事务图: 1、A服务先发送个Half Message给Brock端,消息中携带 B服务 即将要+100元的信息。 2、当A服务知道Half Message发送成功后,那么开始第3步执行本...

春哥大魔王的博客
32分钟前
1
0
Qt编写自定义控件31-面板仪表盘控件

一、前言 在Qt自定义控件中,仪表盘控件是数量最多的,写仪表盘都写到快要吐血,可能是因为各种工业控制领域用的比较多吧,而且仪表盘又是比较生动直观的,这次看到百度的echart中有这个控件...

飞扬青云
37分钟前
3
0
DisplayPort 迎来重大更新,数据带宽性能提高3倍

VESA宣布了他们对DisplayPort接口三年来的第一次重大更新。 与DP 1.4a相比,DisplayPort 2.0提供了三倍于DP 1.4a的数据带宽性能,支持超过8K的分辨率,更高的刷新率和更高分辨率的HDR,以及其...

linuxCool
44分钟前
2
0
《Linux就该这么学》2019年7月20日第八天上课笔记

du命令 du -sh /newFS/ 察看文件/文件夹数据占用量 SWAP 交换分区的设置 磁盘容量配额 RHEL 5/6 usrquota RHEL 7 quota 软硬连接 ln 软 指针指向inode 硬 建立新的inode RAID 0 1 5 1+0...

2lodoss
46分钟前
1
0
适合钱包应用开发的ERC20代币数据集

Erc20Tokens数据集包含超过1000种主流的以太坊ERC20代币的描述数据清单和图标,可用于钱包等区块链应用的开发,支持使用Java、Python、Php、NodeJs、C#等各种开发语言查询主流ERC20代币的相关...

汇智网教程
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部