SipAudioCall没有注册本地SipProfile

时间:2013-11-20 16:51:31

标签: android sip

我正在尝试使用原生Android SIP堆栈在局域网内进行直接SIP呼叫。看来,在本机堆栈中,您需要注册本地配置文件才能进行SIP呼叫。

以下是我(尝试)用于注册个人资料的代码。我在这个网络上没有SIP服务器,所以我只使用localhost作为域名。

    if (mSipManager == null) {
        mSipManager = SipManager.newInstance(mContext);

        try {
            SipProfile.Builder builder = new SipProfile.Builder("foo", "localhost");
            builder.setPassword("bar");

            mSipProfile = builder.build();
            mSipManager.register(mSipProfile, 30000, new SipRegistrationListener() {

                public void onRegistering(String localProfileUri) {
                    Log.v(TAG, "Registering with profile with SIP Server. URI: " + localProfileUri);
                }

                public void onRegistrationDone(String localProfileUri, long expiryTime) {
                    Log.v(TAG, "Registered with profile with SIP Server. URI: " + localProfileUri);
                }

                public void onRegistrationFailed(String localProfileUri, int errorCode,
                                                 String errorMessage) {
                    Log.e(TAG, "Registration failed.  Code: " + Integer.toString(errorCode));
                    Log.e(TAG, errorMessage);
                }
            });
        } catch (ParseException e) {
            Log.e(TAG, "Unable to set up local SipProfile.", e);
        } catch (SipException e) {
            Log.e(TAG, "Unable to open local SipProfile.", e);
        }
    }

在其他地方,这是我打电话的代码:

try {
        Log.v(TAG, "VOIP Supported: " + SipManager.isVoipSupported(mActivity));
        Log.v(TAG, "SIP API Supported: " + SipManager.isApiSupported(mActivity));

        SipProfile.Builder builder = new SipProfile.Builder(mSipUri);
        SipProfile remote = builder.build();

        SipAudioCall.Listener listener = new SipAudioCall.Listener() {
            @Override
            public void onCalling(SipAudioCall call) {
                Log.d(TAG, "SIP Call initiating...");
            }

            @Override
            public void onCallEstablished(SipAudioCall call) {
                Log.d(TAG, "SIP Call established.");

                call.startAudio();
                call.setSpeakerMode(true);
                call.toggleMute();
            }

            @Override
            public void onCallEnded(SipAudioCall call) {
                Log.d(TAG, "SIP Call ended.");
            }

            @Override
            public void onError(SipAudioCall call, int errorCode, String errorMessage) {
                Log.e(TAG, "SIP Call Error. Code: " + Integer.toString(errorCode));
                Log.e(TAG, errorMessage);
            }
        };

        mSipCall = mSipManager.makeAudioCall(mSipProfile, remote, listener, 10);

    } catch (ParseException e) {
        Log.e(TAG, "Unable to set up remote SipProfile.", e);
    } catch (SipException e) {
        Log.e(TAG, "SipAudioCall error.", e);
    }

这都导致以下logcat输出:

 11-20 11:46:33.150    1412-1412/package.name E/XmlTest﹕ 1- Unable to open local SipProfile.
         android.net.sip.SipException: SipService.createSession() returns null
         at android.net.sip.SipManager.register(SipManager.java:481)

我无法找到有关为什么createSession返回null的更多细节;是因为我没有为配置文件注册提供有效的服务器?如果是这样,有没有办法使用本机SIP堆栈而无需注册服务器?

1 个答案:

答案 0 :(得分:0)

事实证明,Android的SIP堆栈似乎需要您提供给SIPManager的本地SIP配置文件(在上面的第一个代码块中,由buildermSipProfile表示)才能生效提供给它的IP地址。

在我最初指定“localhost”的地方,您必须实际提供您正在进行SIP呼叫的任何接口的IP地址;如果您使用的是VPN,则必须提供VPN接口的IP。