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

До 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

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

Спасибо.

Ответы на вопрос(3)

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

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

 29 янв. 2013 г., 10:33
Как говорится в блоге, сейчас он заблокирован.
Решение Вопроса

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

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

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

 Stephan Tual17 апр. 2012 г., 15:32
На 2.3.6 endCall () через iTelephony делает именно это. Это действительно silenceRinger (), который вызывает проблему с разрешением. Вы можете просто прокомментировать silenceRinger () в своем фактическом коде, оставив AIDL как таковой. Я не проверял это на 1,5-2,2, но собираюсь сделать это в ближайшее время. Даст вам знать на этой странице.
 26 июл. 2012 г., 18:08
Ух ты ... У меня на самом деле был endCall () в моем коде, но он не был поврежден из-за некоторых операторов if. Я просто предположил, что это не работает, потому что API был отключен. Я испытываю желание пометить ваш ответ для удаления, поэтому Google не может решить эту проблему! :) +1
 25 окт. 2012 г., 19:36
Не вызовет ли endCall () звонок, чтобы заставить замолчать? Я думаю, что это будет так же хорошо ...
 26 мая 2013 г., 03:30
@ stephan Tual Можете ли вы загрузить весь свой код или опубликовать ссылку на загружаемый вами проект
 17 апр. 2012 г., 14:54
Вы имеете в виду, что мы все еще можем использовать технику ITelephony.aidl для программного приема и отклонения вызовов, но она не работает только для silenceRinger? Тогда единственное решение остается, это прокомментировать silenceRinger в файле aidl? Просьба предложить, поскольку ваше открытие позволит мне использовать эту технику при разработке нового приложения.

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

}

Ваш ответ на вопрос