您的位置:首页 > 移动开发 > Android开发

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

2014-09-30 16:10 363 查看
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了

                   
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: