微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用 TelecomManager.placeCall 进行自定义呼叫

如何解决使用 TelecomManager.placeCall 进行自定义呼叫

我正在尝试使用 TelecomManager 在已在其设备上安装我的应用的两个用户之间自定义实现呼叫

this guide之后,我实现了连接服务,Connection的子类,添加了权限,注册一个PhoneAccount等等......

第三周我一直在努力理解如何在不使用电话号码但使用用户名或 userId 的情况下在我的应用程序的用户之间拨打电话。

下面的代码开始从我的设备拨打电话,但此电话从未到达最终用户设备

b

需要提及的是,在我的 broadcastReceiver 实现中,我可以检测到来自其他应用程序的来电,因此似乎我处理的呼叫检测是正确的,并且来自上述代码的呼叫从未真正发送到它打算发送给用户的设备。

现在是问题。我觉得我错过了一些重要的东西。具有相同应用程序的设备如何在没有电话号码的情况下相互通信?仅仅将用户名传递给 TelecomManager.placeCall 真的就足够了吗,它应该设法找到安装了应用程序的正确设备并调用它吗?电信管理器如何区分拨打电话的位置?

抱歉,我的问题不清楚,这是我第一次做与电话相关的事情,我觉得我很幸运能理解这个主题,很难让问题更具体,因为我不知道我错过了什么。

我会在下面放一些我现在正在使用的代码

开始拨出电话

telecomManager.placeCall(Uri.fromParts(/*tried also with PhoneAccount.SCHEME_SIP and PhoneAccount.SCHEME_TEL*/
                        TripmateConnectionService.SCHEME_AG,"userId",null),extras)

在连接服务中

 private fun placeSystemCall(myUid: String,peerUid: String,channel: String,role: Int) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            val extras = Bundle()
            extras.putInt(TelecomManager.EXTRA_START_CALL_WITH_VIDEO_STATE,VideoProfile.STATE_BIDIRECTIONAL)
            val extraBundle = Bundle()
            extraBundle.putString(Constants.CS_KEY_UID,myUid)
            extraBundle.putString(Constants.CS_KEY_SUBSCRIBER,peerUid)
            extraBundle.putString(Constants.CS_KEY_CHANNEL,channel)
            extraBundle.putInt(Constants.CS_KEY_ROLE,Constants.CALL_ID_OUT)
            extras.putBundle(TelecomManager.EXTRA_OUTGOING_CALL_EXTRAS,extraBundle)
            try {
                val telecomManager = applicationContext.getSystemService(TELECOM_SERVICE) as TelecomManager
                val pa: PhoneAccount = telecomManager.getPhoneAccount(
                        config().phoneAccountOut?.accountHandle)
                extras.putBoolean(TelecomManager.EXTRA_START_CALL_WITH_SPEAKERPHONE,true);
                extras.putParcelable(TelecomManager.EXTRA_PHONE_ACCOUNT_HANDLE,pa.accountHandle)
                telecomManager.placeCall(Uri.fromParts(
                        TripmateConnectionService.SCHEME_AG,peerUid,extras)
            } catch (e: SecurityException) {
                e.printstacktrace()
            }
        }
    }

创建电话帐户

override fun onCreateOutgoingConnection(phoneAccount: PhoneAccountHandle?,request: ConnectionRequest): Connection {
        Log.i(TAG,"onCreateOutgoingConnection: called. $phoneAccount $request")
        val extras = request.extras
        val uid = extras.getString(Constants.CS_KEY_UID) ?: "0"
        val channel = extras.getString(Constants.CS_KEY_CHANNEL) ?: "0"
        val subscriber = extras.getString(Constants.CS_KEY_SUBSCRIBER) ?: "0"
        val role = extras.getInt(Constants.CS_KEY_ROLE)
        val videoState = extras.getInt(TelecomManager.EXTRA_START_CALL_WITH_VIDEO_STATE)
        val connection = TripmateConnection(applicationContext,uid,channel,subscriber,role)
        connection.setVideoState(videoState)
        connection.setAddress(Uri.fromParts(SCHEME_AG,TelecomManager.PRESENTATION_ALLOWED)
        connection.setCallerdisplayName(subscriber,TelecomManager.PRESENTATION_ALLOWED)
        connection.setRinging()
        TMApplication.getInstance().config().setConnection(connection)
        return connection
    }

感谢您的时间!任何可以帮助我了解更多信息的建议和链接将不胜感激!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。