【问题标题】:How do you programmatically end a call on 2.3+?您如何以编程方式结束 2.3+ 的通话?
【发布时间】:2012-04-20 17:06:23
【问题描述】:

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

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

也就是说,仍然有可能,因为 google play 市场上的无数应用程序在 ICS 上都做得很好,例如,这个:

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

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

谢谢。

【问题讨论】:

    标签: android


    【解决方案1】:

    经过深思熟虑后,我意识到一些非常非常非常愚蠢的事情。从好的方面来说,StackOverflow 上似乎也没有人注意到它。自 2.3+ 起,MODIFY_PHONE_STATE 不再在silenceRinger() 上工作,但 endCall 就好了。

    所以解决办法是注释掉对silenceRinger()的调用。

    不敢相信我只花了一个星期的时间!我将尝试更新其他问题,因为在 SO 上似乎有大量的欺骗行为,即“不可能再使用反射来终止呼叫”。

    【讨论】:

    • 您的意思是,我们仍然可以使用 ITelephony.aidl 技术以编程方式接听和拒绝电话,但它仅不适用于 silentRinger 吗?那么唯一的解决方案是在aidl文件中评论silenceRinger?请建议,因为您对此的发现将使我能够利用这种技术来设计一个新的应用程序。
    • 在 2.3.6 上,通过 iTelephony 的 endCall() 就是这样做的。确实是silenceRinger() 触发了权限问题。您可以在您的实际代码中注释掉silenceRinger(),保留AIDL。我还没有在 1.5 到 2.2 上测试过这个,不过我很快就会这样做。将在此页面上通知您。
    • 哇...实际上我的代码中有 endCall() ,但由于一些 if 语句,它没有受到影响。我只是假设它不起作用,因为 API 被禁用。我很想将您的答案标记为删除,因此 Google 不会解决此问题! :) +1
    • endCall() 会导致铃声静音吗?我认为它也会......
    • @stephan Tual 你能上传你的整个代码或发布你的可下载项目的链接
    【解决方案2】:

    call() 和 endcall() 函数对我来说也很好用。但还有另一种不使用 iTelephony.aidl 的工作方式。它发表在这篇文章中。顺便说一句,我认为谷歌已经知道了,但由于某种原因,他们没有对其他功能做任何事情,这很好!!!

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

    【讨论】:

    • 如博客所述,现在已被屏蔽。
    【解决方案3】:

    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();
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-24
      • 1970-01-01
      相关资源
      最近更新 更多