繁体   English   中英

SIP注册失败-超时-清单中包含的所有权限,但APP中未包含来自互联网许可的接收数据

[英]SIP registration fails - TIME OUT - ALL PERMISSIONS included in the manifest BUT the RECEIVE DATA FROM INTERNET PERMISSION not included in the APP

我正在尝试用我的SIP帐户注册。 我怀疑这是一个编程问题,因为我从头开始重写了SIP程序两次,并从不同的来源那里得到了启发。 和!! 我在Android手机的设置选项中查看了APP中的权限,而权限“ RECEIVE DATA FROM INTERNET”不存在! 即使我在清单文件中使用了android.permission.INTERNET权限。 我不明白! 此外,我正在使用此APP通过Internet使用Firebase数据库,并且可以对其进行读写。 这怎么可能??

问题的更具体说明:APP调用onRegistering,然后调用onRegistrationFailed并出现错误:SIP错误MSG:localProfileUri = sip:rafael.hogue@sip2sip.info errorCode =超时! errorMessage =注册超时

使用此源代码:

private Builder builder = null;
private void log_and_register()
{
    try
    {
        c.DEBUG().ftrace("VOIP Supported: " + SipManager.isVoipSupported(c.ma()));
        c.DEBUG().ftrace("SIP API Supported: " + SipManager.isApiSupported(c.ma()));

        mSipManager = SipManager.newInstance(c.ma());
        builder = new Builder(c.config().getSIP_UserName(), c.config().getSIP_Domain());
        builder.setPassword(c.config().getSIP_Password());
        //builder.setProtocol("UDP"); //"TCP");
        //builder.setPort(5060);   //5080  5070
        builder.setAutoRegistration(true);
        mSipProfile = builder.build();
    }
    catch (ParseException pe)
    {
        c.DEBUG().ftrace("incapable of parsing domain name, username or password!");
        c.DEBUG().ASSERT(0 == 1);
    }
    try
    {
        Intent intent = new Intent();
        intent.setAction("android.SipDemo.INCOMING_CALL");
        PendingIntent pendingIntent = PendingIntent.getBroadcast(c.ma(), 0, intent, Intent.FILL_IN_DATA);
        mSipManager.open(mSipProfile, pendingIntent, null);
    }
    catch (SipException se)
    {
        c.DEBUG().ftrace("WALKIE TALKIE NOT WORKING - Sip Exception!!");
        c.DEBUG().ASSERT(0 == 1);
    }
    if (ContextCompat.checkSelfPermission(c.ma(), Manifest.permission.USE_SIP) == PackageManager.PERMISSION_GRANTED)
        c.DEBUG().ftrace("GRANTED!!!");
    else
        ActivityCompat.requestPermissions(c.ma(), new String[]{Manifest.permission.USE_SIP}, 1);
    try
    {
        if (mSipManager.isRegistered(mSipProfile.getUriString()))
        {
            c.DEBUG().ftrace("already registered !!" + mSipManager.isRegistered(mSipProfile.getUriString()));
            return;
        }
    }
    catch (Exception e)
    {
        c.DEBUG().ftrace("NO!!");
    }
    try
    {
        //mSipManager.register(mSipProfile, 30, new SipRegistrationListener(){
        //mSipManager.register(mSipProfile, 30000, new SipRegistrationListener(){
        c.DEBUG().ftrace("THIS IS THE TRACE BEFORE REGISTATION : " + mSipProfile.getUriString());
        mSipManager.setRegistrationListener(mSipProfile.getUriString(), new SipRegistrationListener()
        {
            public void onRegistering(String localProfileUri)
            {
                c.DEBUG().ftrace("Registering with SIP Server...");
            }
            // next version has it!!
            public void onRegistrationTimeout()
            {
            }
            public void onRegistrationDone(String localProfileUri, long expiryTime)
            {
                c.DEBUG().ftrace("SIP Ready");
            }
            public void onRegistrationFailed(String localProfileUri, int errorCode, String errorMessage)
            {
                // -9 signifie qu'il y a un appel en cours
                c.DEBUG().ftrace("CANNOT REGISTER domain=" + c.config().getSIP_Domain() + " / username=" + c.config().getSIP_UserName());
                c.DEBUG().ftrace("SIP ERROR MSG : localProfileUri=" + localProfileUri + "   errorCode=" + errCode(errorCode) + "  errorMessage=" + errorMessage);
            }
        });
    }
    catch (Exception e)
    {
        c.DEBUG().ftrace("Cannot initialise wakie talkie!");
        c.DEBUG().ASSERT(0 == 1);
    }
    // https:github.com/aosp-mirror/platform_development/commit/a025796211f15c2796f8ea3208c066801aa250b6
}

我包括那些许可:

<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.CAPTURE_AUDIO_OUTPUT" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />

<uses-permission android:name="android.permission.CALL_PHONE" />
<uses-permission android:name="android.permission.USE_SIP" />
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.MODIFY_PHONE_STATE" tools:ignore="ProtectedPermissions" />

<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.REBOOT" tools:ignore="ProtectedPermissions" />
<uses-permission android:name="android.permission.STATUS_BAR" tools:ignore="ProtectedPermissions" />
<uses-permission android:name="android.permission.WAKE_LOCK" />

<uses-feature android:name="android.hardware.sip.voip" android:required="true" />
<uses-feature android:name="android.hardware.wifi" android:required="true" />
<uses-feature android:name="android.hardware.microphone" android:required="true" />

下面是我第一个问题的参考,我尝试使用在本地WIFI网络上运行良好的音频流解决方案来解决,但看不到我的移动IP。 我不想只有本地WIFI对讲机(和电话),所以以前的解决方案对我不起作用!

参考: SIP注册失败-尝试了3次差异。 帐户

首先,当我们得到错误代码“进行中”时,这意味着有一个调用在进行中,该调用是由程序的先前执行启动的。 然后,我们必须进行设置,然后删除通话。 开关在不同智能手机上的不同位置(因此您必须搜索设置)在“ zenfone 3”分机上(例如),开关位于:“设置->连接->呼叫->呼叫帐户-> SIP帐户”,则您必须单击该sip帐户并将其删除。 sip帐户信息下写有“ [appname]应用当前正在使用此帐户”。

同样,在删除上一个调用之后,您可能会继续超时,但是这次将在超时之前调用onRegistering()方法。 因此,为了解决该问题,您将必须登录sip2sip.info帐户(或您的sip帐户)并进行搜索。 在sip2sip.info中,您会发现需要使用代理使用风箱(例如),但是每个帐户都有所不同。 这些是该Sip帐户的设置,例如:

        SipProfile.Builder builder = new SipProfile.Builder(c.config().getSIP_UserName(), c.config().getSIP_Domain());
        builder.setPassword(c.config().getSIP_Password());

        // this line is needed for the "sip2sip.info" sip account
        builder.setOutboundProxy("proxy.sipthor.net");

        mSipProfile = builder.build();

这些验证也可以使用:

    c.ft().forcePermission(Manifest.permission.USE_SIP);
    c.ft().forcePermission( Manifest.permission.INTERNET);
    c.DEBUG().ftrace("VOIP Supported: " + SipManager.isVoipSupported(c.ma()));
    c.DEBUG().ftrace("SIP API Supported: " + SipManager.isApiSupported(c.ma()));


void forcePermission(String permission)
{
    if (ContextCompat.checkSelfPermission(c.ma(), permission) == PackageManager.PERMISSION_GRANTED)
    {
        c.DEBUG().ftrace(permission + " GRANTED !!!");
    }
    else
    {
        c.DEBUG().ftrace("FORCING GRANTING "+permission+" !!!");
        ActivityCompat.requestPermissions(c.ma(), new String[]{permission}, 1);
    }
}

注意:c.ma()是指向我的MainActivity类的指针。

这对于在注册失败时了解返回码也很有用:

// FOR MORE DETAILS SEE
// https://stackoverflow.com/questions/20563566/sip-error-while-registration
// https://stackoverflow.com/questions/19502482/how-to-send-instant-message-via-sip/20443357#20443357
// https://developer.android.com/reference/android/net/sip/SipErrorCode
// https://en.wikipedia.org/wiki/List_of_SIP_response_codes#4xx.E2.80.94Client_Failure_Responses
private String errCode(int iErrorCode)
{
    String sErr = "";
    switch (iErrorCode)
    {
        case CLIENT_ERROR:
            sErr = "client error!!";
            break;
        case CROSS_DOMAIN_AUTHENTICATION:
            sErr = "cross domain authentification!!";
            break;
        case DATA_CONNECTION_LOST:
            sErr = "data connection lost!!";
            break;
        case INVALID_CREDENTIALS:
            sErr = "invalid credentials!!";
            break;
        case INVALID_REMOTE_URI:
            sErr = "invalid remote uri!!";
            break;
        case IN_PROGRESS:
            sErr = "In progress!!";
            break;
        case NO_ERROR:
            sErr = "No error!!";
            break;
        case PEER_NOT_REACHABLE:
            sErr = "peer not reachable!!";
            break;
        case SERVER_ERROR:
            sErr = "server error!!";
            break;
        case SERVER_UNREACHABLE:
            sErr = "server unreachable!!";
            break;
        case SOCKET_ERROR:
            sErr = "socket error!!";
            break;
        case TIME_OUT:
            sErr = "time out!!";
            break;
        case TRANSACTION_TERMINTED:
            sErr = "No transaction terminated!!";
            break;
        default:
            sErr = "No error detected!!";
            break;
    }
    return (sErr);
}



            @Override
            public void onRegistrationFailed(String localProfileUri, int errorCode, String errorMessage)
            {
                // -9 signifie qu'il y a un appel en cours
                c.DEBUG().ftrace("CANNOT REGISTER domain=" + c.config().getSIP_Domain() + " / username=" + c.config().getSIP_UserName());
                c.DEBUG().ftrace("SIP ERROR MSG : localProfileUri=" + localProfileUri + " err=" + errorCode + "   errorCode=" + errCode(errorCode) + "  errorMessage=" + errorMessage);
                updateStatus(STATE_CONNECTED_FAILURE);
                if (errorCode == -9)
                    closeLocalProfile();
            }

此外,当您登录自己的sip帐户时,必须将某些服务的sip帐户设置为true,有时我们还必须回复自动生成的电子邮件以激活该帐户。

然后,sip呼叫系统的注册即可!

祝好运!!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM