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)
编辑:为可怕的格式化道歉,我仍然无法弄清楚如何在这里正确地执行代码块:/
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权限保护,并且在没有权限的情况下不能通过反射由非系统应用程序调用(否则将触发安全异常).
| 归档时间: |
|
| 查看次数: |
36047 次 |
| 最近记录: |