Account提供正在使用該應(yīng)用程序的用戶的身份(或身份)。一個(gè)帳戶有一個(gè)與之相關(guān)的SIP統(tǒng)一資源標(biāo)識(shí)符(URI)。
必須在應(yīng)用程序中創(chuàng)建至少一個(gè)Account,因?yàn)槿魏瓮獍l(fā)請(qǐng)求都需要一個(gè)Account上下文。如果不需要用戶關(guān)聯(lián),應(yīng)用程序可以通過(guò)調(diào)用Account.create()來(lái)創(chuàng)建一個(gè)無(wú)用戶帳戶。無(wú)用戶帳戶識(shí)別本地端點(diǎn)而不是特定用戶,并且它對(duì)應(yīng)于特定的傳輸ID。
還有一個(gè)Account必須設(shè)置為默認(rèn)Account,當(dāng)pjsua使用更嚴(yán)格的匹配規(guī)則無(wú)法將傳入請(qǐng)求與任何帳戶匹配時(shí),用作帳戶身份。
自定義Account類
要使用Account類,通常根據(jù)需求來(lái)自定義自己的實(shí)現(xiàn)類,以便接收該帳戶的通知。例如:
public MyBuddy addBuddy(BuddyConfig bud_cfg) {
/* Create Buddy */
MyBuddy bud = new MyBuddy(bud_cfg);
try {
bud.create(this, bud_cfg);
} catch (Exception e) {
bud.delete();
bud = null;
}
if (bud != null) {
buddyList.add(bud);
if (bud_cfg.getSubscribe())
try {
bud.subscribePresence(true);
} catch (Exception e) {
}
}
return bud;
}
public void delBuddy(MyBuddy buddy) {
buddyList.remove(buddy);
buddy.delete();
}
public void delBuddy(int index) {
MyBuddy bud = buddyList.get(index);
buddyList.remove(index);
bud.delete();
}
@Override
public void onRegState(OnRegStateParam prm) {
MyApp.observer.notifyRegState(prm.getCode(), prm.getReason(),
prm.getExpiration());
}
@Override
public void onIncomingCall(OnIncomingCallParam prm) {
System.out.println("======== Incoming call ======== ");
MyCall call = new MyCall(this, prm.getCallId());
MyApp.observer.notifyIncomingCall(call);
}
@Override
public void onInstantMessage(OnInstantMessageParam prm) {
System.out.println("======== Incoming pager ======== ");
System.out.println("From : " + prm.getFromUri());
System.out.println("To : " + prm.getToUri());
System.out.println("Contact : " + prm.getContactUri());
System.out.println("Mimetype : " + prm.getContentType());
System.out.println("Body : " + prm.getMsgBody());
}
}
在其子類中,應(yīng)用程序可以實(shí)現(xiàn)帳戶回調(diào),基本用于處理與該帳戶相關(guān)的事件,如:
- SIP注冊(cè)的狀態(tài)
- 傳入呼叫
- 傳入存在訂閱請(qǐng)求
- 不是從伙伴傳入的即時(shí)消息
應(yīng)用程序需要覆蓋派生類中的相關(guān)回調(diào)方法來(lái)處理這些特定事件。
如果未處理事件,將調(diào)用默認(rèn)操作:
- 來(lái)電將不被處理
- 傳入的存在訂閱請(qǐng)求將被接受
- 來(lái)自非伙伴的傳入即時(shí)消息將被忽略
創(chuàng)建帳號(hào)
我們需要配置AccountConfig并調(diào)用Account.create()來(lái)創(chuàng)建帳戶。至少,pjsua只需要帳戶的ID,這是一個(gè)URI來(lái)標(biāo)識(shí)帳戶(或者在SIP術(shù)語(yǔ)中,它被稱為記錄地址/ AOR)。
public MyAccount addAcc(AccountConfig cfg) {
MyAccount acc = new MyAccount(cfg);
try {
acc.create(cfg);
} catch (Exception e) {
acc = null;
return null;
}
accList.add(acc);
return acc;
}
以上創(chuàng)建的帳戶不會(huì)執(zhí)行任何操作,除非在發(fā)件人的“發(fā)件人”標(biāo)題中提供身份。該帳戶不會(huì)注冊(cè)到SIP服務(wù)器或任何東西。
通常,將希望該帳戶認(rèn)證并注冊(cè)到SIP服務(wù)器,以便可以接收來(lái)電。為此,需要在AccountConfig中配置一些更多設(shè)置,如下所示:
accCfg = new AccountConfig();
accCfg.setIdUri("sip:localhost");
accCfg.getNatConfig().setIceEnabled(true);
accCfg.getVideoConfig().setAutoTransmitOutgoing(true);
accCfg.getVideoConfig().setAutoShowIncoming(true);
帳戶配置
在AccountConfig中可以指定更多的設(shè)置,如:
- AccountRegConfig,指定注冊(cè)設(shè)置,如注冊(cè)服務(wù)器和重試間隔。
- AccountSipConfig,用于指定SIP設(shè)置,如憑證信息和代理服務(wù)器。
- AccountCallConfig,用于指定呼叫設(shè)置,例如是否需要可靠的臨時(shí)響應(yīng)(SIP 100rel)。
- AccountPresConfig來(lái)指定狀態(tài)設(shè)置,例如是否啟用在線發(fā)布(PUBLISH)。
- AccountMwiConfig,指定MWI(留言等待指示)設(shè)置。
- AccountNatConfig,用于指定NAT設(shè)置,例如是否使用STUN或ICE。
- AccountMediaConfig,用于指定媒體設(shè)置,如安全RTP(SRTP)相關(guān)設(shè)置。
- AccountVideoConfig,用于指定視頻設(shè)置,如默認(rèn)捕獲和渲染設(shè)備。
Account對(duì)象能夠進(jìn)行的操作:
- 管理注冊(cè)
- 管理好友/聯(lián)系人
- 管理在線狀態(tài)
關(guān)于上述詳細(xì)類信息參考可以參照官方文檔pjsip-book