在我使用下面的代码结束通话之前
val telecomManager = context.getSystemService(Context.TELECOM_SERVICE) as TelecomManager
if (PermissionsUtil(context).checkPermissions()) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
telecomManager.endCall()
} else {
//telecomManager.isInCall
declinePhone(context)
}
}
Run Code Online (Sandbox Code Playgroud)
但现在在 API 29 中 TelecomManager.endCall() 显示已弃用。我是否必须创建在后台 CallScreeningService 或 InCallService 中运行的服务?在没有 endCall() 直接方法的情况下,第三方应用程序无法在不成为默认调用方应用程序的情况下执行此操作。如果是这样,那么我将如何获取呼叫详细信息以及如何让我的服务在中国 rom 的后台运行
我正在使用 TelecomManager、ConnectionService 和 Connection 构建基本的呼叫应用程序。但是,当有来电时,我的incomingActivity UI 没有显示。以下是到目前为止的示例代码。
在我的 MainActivity.java
Intent intent = new Intent(TelecomManager.ACTION_CHANGE_DEFAULT_DIALER);
intent.putExtra(TelecomManager.EXTRA_CHANGE_DEFAULT_DIALER_PACKAGE_NAME, getPackageName());
startActivity(intent);
// ================================================================
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
TelecomManager manager = (TelecomManager) getSystemService(TELECOM_SERVICE);
// new ComponentName(getPackageName(), CallHandler.TAG), "myCallHandlerId");
PhoneAccountHandle phoneAccountHandle = new PhoneAccountHandle(
new ComponentName(getApplicationContext(), CallHandler.TAG), "myCallHandlerId");
PhoneAccount phoneAccount = PhoneAccount
.builder(phoneAccountHandle, "myCallHandlerId")
.setCapabilities(PhoneAccount.CAPABILITY_SELF_MANAGED)
.build();
manager.registerPhoneAccount(phoneAccount);
Log.i("Phone Account", "" + manager.getPhoneAccount(phoneAccountHandle));
Log.i("Phone Account", "" + manager.getPhoneAccount(phoneAccountHandle).isEnabled());
Log.i("Phone Account", "" + manager.getPhoneAccount(phoneAccountHandle).getClass());
Log.i("Phone Account isEnabled", "" + phoneAccount.isEnabled());
Bundle bundle = new Bundle();
Uri uri …Run Code Online (Sandbox Code Playgroud) java connection android telecom-manager android-connectionservice
我想制作一个自定义拨号器应用程序来替换我的默认拨号器应用程序。我做了一些搜索,发现可以使用ConnectionService或InCallService构建拨号器应用程序。 在这里,他们使用connectionService来创建调用应用程序,而这里使用IncallService来创建调用应用程序。
ConnectionService 的用例:
- 可以拨打电话(VoIP 或其他方式)并希望将这些呼叫集成到内置电话应用程序中。称为系统管理的 ConnectionService。
- 是一个独立的呼叫应用程序,不希望将其呼叫集成到内置电话应用程序中。称为自我管理的 ConnectionService。
InCallService 的用例:
该服务由希望提供管理电话呼叫功能的应用程序实现。
所以区别之一是视频通话。使用connectionService 可以进行视频通话。我还缺少其他差异吗?我应该使用哪一个来制作自定义拨号器应用程序?
我需要拦截设备框架发出的传出呼叫的事件。
按照android 指南,我停在第 3 点电信子系统绑定到您的应用程序的 ConnectionService 实现。,也就是说我已经走到了这一步:
通话流程
val telecomManager :TelecomManager= getSystemService(
TELECOM_SERVICE
) as TelecomManager
if (ContextCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.CALL_PHONE),
2333)
} else {
try {
val phoneAccountHandle = PhoneAccountHandle(ComponentName(
applicationContext,
MyConnectionService::class.java
), "ID999")
telecomManager.registerPhoneAccount(PhoneAccount.builder(
phoneAccountHandle,
"label"
).setCapabilities(PhoneAccount.CAPABILITY_CONNECTION_MANAGER) .build())
val extras = Bundle()
extras.putParcelable(TelecomManager.EXTRA_PHONE_ACCOUNT_HANDLE, phoneAccountHandle)
telecomManager.placeCall(Uri.parse("tel:$phoneNumber"), extras)
} catch (e: SecurityException) {
e.printStackTrace()
}
}
Run Code Online (Sandbox Code Playgroud)
连接服务
class MyConnectionService : ConnectionService() {
private val TAG = "mycnnser"
override fun onCreate() {
super.onCreate()
Log.d(TAG, …Run Code Online (Sandbox Code Playgroud)