首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android 10上的Portsip SDK。注册或刷新没有返回响应

Android 10上的Portsip SDK。注册或刷新没有返回响应
EN

Stack Overflow用户
提问于 2019-10-28 18:39:07
回答 1查看 252关注 0票数 1

这是我的登录函数:

代码语言:javascript
复制
 fun login(
        userName: String, password: String, serverHost: String?, serverPort: Int, transportType: Int, displayName: String, authName: String, userDomain: String,
        srtpPolicy: Int, localP: Int?, loginHandler: SIPLoginHandler?) {
    App.retryRegistrationOnFailure = true
    isLoginInProgress = true
    this.userName = null

    broadcastAuthUpdate()

    this.loginHandler = loginHandler

    val rm = Random()
    var localPort = 5060 + rm.nextInt(60000)
    if (localP != null && localP != -1) {
        localPort = localP
    }
    val prefs = androidx.preference.PreferenceManager.getDefaultSharedPreferences(this@SIPManager)
    val editor = prefs.edit()
    editor.putInt(getString(R.string.keySIPLocalPort), localPort)
    editor.apply()
    var result = 0
    try {
        portSipSdk!!.DeleteCallManager()
    } catch (e: Exception) {
        FL.e(TAG, "handleIncomingCall Error trying to delete the call manager. Was not registered? Error: " + e.message)
    }

    portSipSdk!!.CreateCallManager(this)
    portSipSdk!!.setOnPortSIPEvent(this)

    val dataPath = getExternalFilesDir(null)!!.absolutePath
    result = portSipSdk!!
            .initialize(transportType, "0.0.0.0", localPort, PortSipEnumDefine.ENUM_LOG_LEVEL_NONE, dataPath, MAX_SESSIONS, agentName, 0, 0, dataPath, "",
                    false, null)
    if (result != PortSipErrorcode.ECoreErrorNone) {
        FL.d(TAG, "handleIncomingCall Error initializing, code = $result")
        val message = "Error initializing, code = $result"
        portSipSdk!!.DeleteCallManager()
        sessions.clear()
        isLoginInProgress = false
        loginHandler?.onLoginFailure(message)
        broadcastAuthUpdate()
        return
    }

    val stunServerPort = 0
    val stunServer = ""

    result = portSipSdk!!.setLicenseKey(licenceKey)
    if (result != PortSipErrorcode.ECoreErrorNone) {
        FL.d(TAG, "handleIncomingCall Failed to set licence, code = $result")
    }
    if (result == PortSipErrorcode.ECoreWrongLicenseKey) {
        val message = "Failed to set licence, code = $result"
        portSipSdk!!.DeleteCallManager()
        sessions.clear()
        isLoginInProgress = false
        loginHandler?.onLoginFailure(message)
        broadcastAuthUpdate()
        return
    }

    result = portSipSdk!!.setUser(userName, displayName, authName, password, userDomain, serverHost, serverPort, stunServer, stunServerPort, "", 0)
    if (result != PortSipErrorcode.ECoreErrorNone) {
        FL.d(TAG, "handleIncomingCall setUser failure ErrorCode = $result")
        val message = "setUser failure ErrorCode = $result"
        portSipSdk!!.DeleteCallManager()
        sessions.clear()
        isLoginInProgress = false
        loginHandler?.onLoginFailure(message)
        broadcastAuthUpdate()
        return
    }
    portSipSdk!!.setVideoDeviceId(1)
    portSipSdk!!.setSrtpPolicy(srtpPolicy)
    val preferences = PreferenceManager.getDefaultSharedPreferences(this)
    ConfigPreferences(this, preferences, portSipSdk!!)

    portSipSdk!!.enable3GppTags(false)
    initialiseKeepAlive()

    portSipSdk!!.setInstanceId(instanceId)
    FL.d(TAG, "*******************************DATA is: \nUN $userName, \nPASS $password, \nSERVERHOST $serverHost, \nSERVERPORT $serverPort ,\nTransortTYPE $transportType, \nDisplay $displayName, \nAUTH $authName, \nuserDpm $userDomain, \nsrtp $srtpPolicy, \nhandler $loginHandler, \nlocalPort $localPort, \nstunserver $stunServer, \nstunport $stunServerPort")
    if (!portSIPRegisterRegisterServer(loginHandler))
    //if it fails, I return, not setting the username
    {
        FL.d(TAG, "*******************************FAILED TO REREGISTER SERVERL ")
        return
    }

    this.userName = userName
}

portSIPREgisterRegisterServer函数为:

代码语言:javascript
复制
  private fun portSIPRegisterRegisterServer(loginHandler: SIPLoginHandler?): Boolean {
    val result: Int
    result = portSipSdk!!.registerServer(3600, 3)
    FL.d("handleIncoming portSIPRegisterRegisterServer Called")
    if (result != PortSipErrorcode.ECoreErrorNone) {
        val message = "handleIncomingCall registerServer failure ErrorCode =$result"
        portSipSdk!!.unRegisterServer()
        portSipSdk!!.DeleteCallManager()
        sessions.clear()
        isLoginInProgress = false
        loginHandler?.onLoginFailure(message)
        broadcastAuthUpdate()
        FL.d(TAG, "*******************************FAILED portSIPRegisterRegisterServer" + result)
        return false
    }
    registrationTimePassed = System.currentTimeMillis()
    registrationType = SIPREGISTRATION.LOGIN
    return true
}

我用这个参数调用:

代码语言:javascript
复制
  SIPManager.instance!!
            .login(userName!!, password!!, hostName, portNumber, transportType, "", "", "", srtpPolicy, localPortNumber, object : SIPLoginHandler {
                override fun onLoginSuccess(message: String) {
                    FL.d(TAG, "handleIncomingCall Login TRIED and SUCCESS: $message")
                    sipLoginHandler.onLoginSuccess(message)
                }

                override fun onLoginFailure(errorMessage: String) {
                    FL.d(TAG, "handleIncomingCall Login TRIED and FAILED: $errorMessage")
                    SIPManager.instance!!.loginToXelionServer(sipLoginHandler)
                }
            })

这是我发送给登录的数据:

代码语言:javascript
复制
 DATA is: 
UN <myuser>, 
PASS <mypass>, 
SERVERHOST <myserver>, 
SERVERPORT 5060 ,
TransortTYPE 0, 
Display , 
AUTH , 
userDpm , 
srtp 0, 
handler com.xelion.android.pushmessages.IncomingPhoneCallPushHandler$tryToReRegisterBecauseRefreshFailed$1@cb36a8d, 
localPort 29292, 
stunserver , 
stunport 0

通常我会得到这样的回复:

代码语言:javascript
复制
handleIncomingCall Login TRIED and SUCCESS: Status: none code: 200

但是当我尝试Pixel 3,没有连接到PC (没有调试)并且屏幕关闭超过4-5分钟时,它将调用注册函数,我在日志中看到:

代码语言:javascript
复制
    FL.d("handleIncoming portSIPRegisterRegisterServer Called")

但我没有从注册中心得到响应,无论是成功还是失败。

你知道怎么解决这个问题吗?我的货单里有这个:

代码语言:javascript
复制
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />

当屏幕关闭时,我感觉它忽略了注册调用?如果我打开屏幕,我会看到onLoginSuccess

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-10-30 15:48:45

我注意到的是,它只会等待,只有当我收到未接来电通知时,才会实际发出网络呼叫。因此,我从我的FCM创建了一个基本通知,让用户知道VOIP服务正在注册。在用户有了视觉输入后,注册voip服务就能完美地工作,它会在大约200-300毫秒内收到回复。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58589429

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档