我正在尝试使用原生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堆栈而无需注册服务器?
答案 0 :(得分:0)
事实证明,Android的SIP堆栈似乎需要您提供给SIPManager的本地SIP配置文件(在上面的第一个代码块中,由builder
和mSipProfile
表示)才能生效提供给它的IP地址。
在我最初指定“localhost”的地方,您必须实际提供您正在进行SIP呼叫的任何接口的IP地址;如果您使用的是VPN,则必须提供VPN接口的IP。