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

Mid*_*est 33 android phone-call

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

编辑:我读过我的应用程序必须是系统应用程序的地方.那么如何制作系统,系统和用户应用程序之间有什么区别?

bgs*_*gse 45

您不需要是系统应用程序.首先,com.android.internal.telephony在项目中创建包,并将其放在名为" ITelephony.aidl" 的文件中:

package com.android.internal.telephony; 

interface ITelephony {      

boolean endCall();     

void answerRingingCall();      

void silenceRinger(); 

}
Run Code Online (Sandbox Code Playgroud)

完成后,您可以使用此代码结束通话:

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();
Run Code Online (Sandbox Code Playgroud)

例如,您可以在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" />
Run Code Online (Sandbox Code Playgroud)

编辑:为可怕的格式化道歉,我仍然无法弄清楚如何在这里正确地执行代码块:/

  • 代码显示我"ITelephony"无法解决. (7认同)
  • @WijaySharma这段代码曾经在2013年开始工作,它基本上做的是使用[反射](/sf/ask/2633991/)来获得对android电话的内部功能的访问权限,否则不会公开.很多内部组件自2013年以来发生了变化,因此几乎保证不再起作用(至少很可能不是这里显示的确切方式),从我的头脑中我认为Android 4.0.3仍在工作,不确定关于以后的版本. (3认同)
  • 这仅在minSdkVersion为14或更小时有效.如果将minSdkVersion设置为15或更高,它将停止工作. (2认同)

hea*_*uck 13

对于Android P(自Beta 2以来)及以上,最终有一个正式的endCall API:

https://developer.android.com/reference/android/telecom/TelecomManager#endCall()

ANSWER_PHONE_CALLS许可清单中要求:

<uses-permission android:name="android.permission.ANSWER_PHONE_CALLS" />
Run Code Online (Sandbox Code Playgroud)

获得API级别28或以上的许可:

TelecomManager tm = (TelecomManager) mContext.getSystemService(Context.TELECOM_SERVICE);

if (tm != null) {
    boolean success = tm.endCall();
    // success == true if call was terminated.
}
Run Code Online (Sandbox Code Playgroud)

同时,原始endCall()方法TelephonyManager现在受MODIFY_PHONE_STATE权限保护,并且在没有权限的情况下不能通过反射由非系统应用程序调用(否则将触发安全异常).

  • 它已在 API 级别 29 中被正式弃用。 (2认同)