以编程方式在android中结束调用

我看到很多问题,在Android中以编程方式结束调用是不可能的。 同时,我在googleplay市场上看到很多拨号器应用程序,您可以在其中激活电话并将其放下。 他们如何工作?

编辑 :我读过的地方,我的应用程序必须是系统应用程序。 那么如何使系统和系统和用户应用程序有什么区别呢?

你不需要是一个系统应用程序。 首先,在你的项目中创build包com.internal.android.telephony ,并把它放在一个名为“ ITelephony.aidl ”的文件中:

 package com.android.internal.telephony; interface ITelephony { boolean endCall(); void answerRingingCall(); void silenceRinger(); } 

一旦你有了,你可以使用这个代码来结束一个调用:

 TelephonyManager telephonyManager = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE); Class clazz = Class.forName(telephonyManager.getClass().getName()); Method method = clazz.getDeclaredMethod("getITelephony"); method.setAccessible(true); ITelephony telephonyService = (ITelephony) method.invoke(telephonyManager); telephonyService.endCall(); 

例如,你可以在PhoneStateListener中使用它。 为了这个工作,你需要清单中的权限:

 <uses-permission android:name="android.permission.MODIFY_PHONE_STATE" /> <uses-permission android:name="android.permission.CALL_PHONE" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> 

编辑:道歉可怕的格式,我仍然不知道如何正确地做代码块在这里:/

随着添加android电话接口和广播接收器,您还需要添加android清单接收器条目与动作android.intent.action.PHONE_STATE为您想要处理intent的接收者。

如果您添加,您将得到编译时错误

 uses-permission android:name="android.permission.MODIFY_PHONE_STATE` 

在你的清单文件中。 但是,即使我们删除它,它会自动拒绝来电。

SilenceRinger()不适用于Android 2.3+版本。 只是评论它,其他代码将正常工作。 希望这对你有用!

 public static boolean isCallActive(Context context){ AudioManager manager = (AudioManager)context.getSystemService(Context.AUDIO_SERVICE); if(manager.getMode()==AudioManager.MODE_IN_CALL || manager.getMode()==AudioManager.MODE_IN_COMMUNICATION){ return true; } return false; }