Как программно завершить вызов на 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
Итак, вопрос в том, как они это делают? Я знаю, что могу подобрать звонок, используя имитацию крючка гарнитуры, но я не могу понять, как закончить вызов.
Спасибо.
Ответы
Ответ 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();
}
}