11

直到 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.andromigsm.fscifree&hl=en

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

谢谢你。

4

3 回答 3

16

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

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

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

于 2012-04-07T21:17:25.467 回答
3

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

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

于 2012-07-28T20:20:36.243 回答
1

私人无效endCall(最终字符串截止时间){

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

}
于 2014-01-13T10:50:02.243 回答