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 电话自己主动接听和挂断具体解释的更多相关文章

  1. Android接听、挂断电话

    新建一个名为ITelephony的aidl文件,注意包名不能改变,因为是通过反射方式来实现接听和挂断的

  2. android 接听和挂断实现方式

    参考:android 来电接听和挂断 支持目前所有版本 注意:android2.3版本及以上不支持下面的自动接听方法. (会抛异常:java.lang.SecurityException: Neith ...

  3. Android 对电话进行监听和挂断

    1.添加权限 <!--拨打电话的权限--><uses-permission android:name="android.permission.PROCESS_OUTGOIN ...

  4. Android电话拨打权限绕过漏洞(CVE-2013-6272)分析

    原文:http://blogs.360.cn/360mobile/2014/07/08/cve-2013-6272/ 1. CVE-2013-6272漏洞背景 CVE-2013-6272是一个安卓平台 ...

  5. Android开发之通过反射获取到挂断电话的API

    Android开发黑名单工具类,需要用到挂断电话的API,但是该API处于隐藏状态,需要通过反射得到该方法.. 步骤: 1.通过当前类获取到ServiceManager的字节码 Class< ? ...

  6. android 自己主动拒接后再取消自己主动拒接,该联系人来电界面无图标显示,且点击挂断无反应

    1.    设置一个联系人为自己主动拒接 2.    该联系人来电 3.    取消该联系人的自己主动拒接 4.    该联系人来电 Error: 来电界面无头像显示,直接显示黑屏,且点击拒接butt ...

  7. Android 实现自动接听和挂断电话功能

    添加权限 <uses-permission android:name="android.permission.CALL_PHONE"/> <uses-permis ...

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

    转载请注明出处:http://blog.csdn.net/l1028386804/article/details/47072451 通过<Android之--AIDL小结>与<And ...

  9. 挂断电话demo

    <!-- 结束通话和打电话的权限 --> <uses-permission android:name="android.permission.CALL_PHONE" ...

随机推荐

  1. libCurl的文件上传

    最近在需要使用curl的上传功能,使用libCurl来实现.因此,先使用curl命令操作,然后再使用libCurl实现. 基于Http协议的文件上传的标准方法是: 基于POST Form的文件上传  ...

  2. ddraw 视频下画图 不闪烁的方法

    我们如果是在在RGB视频上画图(直线,矩形等),一般采用双缓冲区继续,使用内存MemoryDC,来实现画的图形在视频上显示不闪烁的功能,但是我们知道用RGB显示视频都是使用GDI进行渲染,这样很耗CP ...

  3. SpringMVC静态文件(图片)访问+js访问 简单小例子

    项目文件布局: web.xml文件: <?xml version="1.0" encoding="UTF-8"?> <web-app vers ...

  4. 创建BDC(Business Data Connectivity Service)

    创建Business Data Connectivity http://blog.csdn.net/spfarm/article/details/44015915 创建和使用Business Data ...

  5. Java多线程之synchronized(二)

    为了解决“非线程安全”带来的问题,上一节中使用的办法是用关键字synchronized修饰多个线程可能同时访问到的方法,但是这样写是存在一定的弊端的,比如线程A调用一个用synchronized修饰的 ...

  6. 通过SSIS监控远程服务器磁盘空间并发送邮件报警

    本文直接参考了博客园软件人生的文章操作的,写在这里只为做个记录. 到公司这边先把两个报表服务器接收了. 为防止宕机,部署个磁盘警告的SSIS包. Step 1 建立两个变量来接收和写入磁盘容量 Ste ...

  7. F - 蜘蛛牌(深度搜索)

    Problem Description 蜘蛛牌是windows xp操作系统自带的一款纸牌游戏,游戏规则是这样的:只能将牌拖到比她大一的牌上面(A最小,K最大),如果拖动的牌上有按顺序排好的牌时,那么 ...

  8. 杭电oj A + B Again

    A + B Again Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Tota ...

  9. DLL运行时动态加加载的问题

    1.error C2440: 'initializing' : cannot convert from 'int (__stdcall *)(void)' to 'void (__cdecl *)(c ...

  10. mysql 添加用户并授权(记录)

    mysql> GRANT ALL PRIVILEGES ON *.* TO monty@localhost IDENTIFIED BY 'something' WITH GRANT OPTION ...