直到Android 2.2我知道我可以使用反射并通过getITelephony终止调用。
但是,从2.3开始,这不再有效,因为即使你授予你的应用MODIFY_PHONE_STATE权限,它现在只是一个系统应用程序权限: https://stackoverflow.com/a/5095956/821423
也就是说,它可能仍然是因为谷歌游戏市场上的无数应用程序在ICS上做得很好,例如,这个:
https://play.google.com/store/apps/details?id=com.androminigsm.fscifree&hl=en
所以问题是,他们是如何做到的?我知道我可以使用模拟耳机挂机接听电话,但我无法弄清楚如何结束通话。
谢谢。
答案 0 :(得分:17)
经过多次反省,我发现了一些非常,非常,非常愚蠢的东西。从好的方面来看,StackOverflow上没有人注意到它。自2.3+以来,MODIFY_PHONE_STATE不再使用silenceRinger(),但endCall就好了。
所以解决方案就是注释掉对silentRinger()的调用。
不敢相信我刚刚花了一个星期!我会尝试更新其他问题,因为似乎有太多的欺骗,因为'不可能再使用反射终止呼叫'。
答案 1 :(得分:3)
call(),endcall()函数也适用于我。但是还有另一种方法可以在不使用iTelephony.aidl的情况下工作。它发表在这篇文章中。 BTW我认为谷歌已经知道但由于某种原因他们没有做任何其他功能,这很好!!!
http://androidbridge.blogspot.com/2011/05/how-to-answer-incoming-call-in-android.html
答案 2 :(得分:1)
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();
}
}