Подтвердить что ты не робот

Как программно завершить вызов на 2.3+?

До Android 2.2 Я знаю, что могу использовать отражение и прекратить вызов через getITelephony.

Однако, начиная с версии 2.3, это больше не работает, потому что даже если вы предоставляете разрешение MODIFY_PHONE_STATE для своего приложения, теперь это разрешение только для системного приложения: qaru.site/info/110442/...

Тем не менее, это возможно, потому что множество приложений на игровом рынке google отлично справляются с ICS, например:

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

Итак, вопрос в том, как они это делают? Я знаю, что могу подобрать звонок, используя имитацию крючка гарнитуры, но я не могу понять, как закончить вызов.

Спасибо.

4b9b3361

Ответ 1

После долгих поисков души я понимаю что-то действительно, действительно, действительно немое. На положительной стороне никто из StackOverflow тоже не заметил этого. MODIFY_PHONE_STATE больше не работает на silenceRinger() с версии 2.3+, но endCall просто отлично.

Итак, решение состоит в том, чтобы прокомментировать вызов silentRinger().

Не могу поверить, что я потратил неделю на это! Я попытаюсь обновить другие вопросы, так как, похоже, на SO есть тонны ошибок, так как "невозможно использовать отражение для прекращения вызовов больше".

Ответ 2

Функции call(), endcall() отлично работают и для меня. Но есть и другой способ, который работает без использования iTelephony.aidl. Его опубликовано в этом посте. BTW Я думаю, что google уже знает, но по какой-то причине они ничего не сделали с остальными функциями, которые хороши!!!

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

Ответ 3

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

}