你如何以编程方式结束2.3+的通话?

时间:2012-04-07 12:09:59

标签: android

直到Android 2.2我知道我可以使用反射并通过getITelephony终止调用。

但是,从2.3开始,这不再有效,因为即使你授予你的应用MODIFY_PHONE_STATE权限,它现在只是一个系统应用程序权限: https://stackoverflow.com/a/5095956/821423

也就是说,它可能仍然是因为谷歌游戏市场上的无数应用程序在ICS上做得很好,例如,这个:

https://play.google.com/store/apps/details?id=com.androminigsm.fscifree&hl=en

所以问题是,他们是如何做到的?我知道我可以使用模拟耳机挂机接听电话,但我无法弄清楚如何结束通话。

谢谢。

3 个答案:

答案 0 :(得分:17)

经过多次反省,我发现了一些非常,非常,非常愚蠢的东西。从好的方面来看,StackOverflow上没有人注意到它。自2.3+以来,MODIFY_PHONE_STATE不再使用silenceRinger(),但endCall就好了。

所以解决方案就是注释掉对silentRinger()的调用。

不敢相信我刚刚花了一个星期!我会尝试更新其他问题,因为似乎有太多的欺骗,因为'不可能再使用反射终止呼叫'。

答案 1 :(得分:3)

call(),endcall()函数也适用于我。但是还有另一种方法可以在不使用iTelephony.aidl的情况下工作。它发表在这篇文章中。 BTW我认为谷歌已经知道但由于某种原因他们没有做任何其他功能,这很好!!!

http://androidbridge.blogspot.com/2011/05/how-to-answer-incoming-call-in-android.html

答案 2 :(得分:1)

private void endCall(final String cutofftime){

TelephonyManager telephony = (TelephonyManager) srvs
            .getSystemService(Context.TELEPHONY_SERVICE);
    Class c;
    final com.android.internal.telephony.ITelephony telephonyService;
    try {
        c = Class.forName("android.telephony.TelephonyManager");//telephony.getClass().getName());
        Log.i("TelephonyClass Name", telephony.getClass().getName());
        Method m = c.getDeclaredMethod("getITelephony");
        m.setAccessible(true);
        telephonyService = (ITelephony) m.invoke(telephony);
        TimerTask task = new TimerTask() {

            @Override
            public void run() {
                try {
                    if (telephonyService.isIdle()
                            || telephonyService.isOffhook()
                            || telephonyService.isRinging())
                        telephonyService.endCall();
                } catch (RemoteException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        };
        long delay = Integer.parseInt(cutofftime) * 1000;
        new Timer().schedule(task, delay);
    } catch (ClassNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (SecurityException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (NoSuchMethodException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IllegalArgumentException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (InvocationTargetException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

}