liblinphone-Android的簡單應(yīng)用

官網(wǎng):http://www.linphone.org

源碼:https://github.com/BelledonneCommunications/linphone-android

API:http://www.linphone.org/docs/liblinphone-javadoc

如果官網(wǎng)提供的SDK無法滿足需求铣缠,可以下載完整版進(jìn)行編譯门粪,使用git命令(提示:因編碼方式不同钓觉,下載的源碼復(fù)制到不同的系統(tǒng)下將無法編譯)

git clone git://git.linphone.org/linphone-android.git --recursive

一离赫、下載SDK并引用

1.從官網(wǎng)下載sdk壓縮包并解壓,獲得三個文件呈础,其中l(wèi)inphone-android-liblinphone-tester-javadoc.jar為API,linphone-android-liblinphone-tester-sources.jar為java源碼橱健,liblinphone-sdk.aar為帶資源的SDK文件而钞。

壓縮包內(nèi)文件

2.AndroidStudio引用aar文件

方法一:將liblinphone-sdk.aar放到Module的libs目錄下,并在bulid.gradle里添加

repositories { flatDir { dirs 'libs' } }

并在dependencies中添加

compile(name:'liblinphone-sdk',ext:'aar')

bulid.gradle配置

之后Reduild project重新構(gòu)建就能使用拘荡。

方法二:new Module選擇import JAR/.AAR Package選項臼节,選擇liblinphone-sdk.aar文件后會直接生成一個lib庫,其他Module直接引用就能使用珊皿。

導(dǎo)入aar文件
生成的lib庫

二网缝、初始化

1.自定義Service實現(xiàn)LinphoneCoreListener接口,創(chuàng)建LinphoneCore并進(jìn)行注冊登錄蟋定。

@Override

public void onCreate() {

????try{

? ? ? ? //創(chuàng)建LinphoneCore

????????LinphoneCore?lc = LinphoneCoreFactory.instance().createLinphoneCore(this, this);

????????TimerTask lTask = new TimerTask() {

????????????@Override

????????????public void run() {

????????????????lc.iterate();

????????????}

????????};

????????mTimer = new Timer("LinphoneMini scheduler");

????????mTimer.schedule(lTask, 0, 20);


? ??????String sipAddress = "sip:賬號@服務(wù)器地址"; //你的sip地址

????????String password = ""; //你的密碼

????????LinphoneAddress address = LinphoneCoreFactory.instance().createLinphoneAddress(sipAddress);

????????String username = address.getUserName();

????????String domain = address.getDomain();

????????LinphoneAuthInfo authInfo = LinphoneCoreFactory.instance().createAuthInfo(username, password, null, domain);????????LinphoneProxyConfig proxyConfig = getLc().createProxyConfig(sipAddress, domain, null, true);

????????lc.addProxyConfig(proxyConfig);

????????lc.addAuthInfo(authInfo);

????????lc.setDefaultProxyConfig(proxyConfig);

????}catch(LinphoneCoreException e){

????????e.printStackTrace();

????}

}

2.利用registrationState()回調(diào)監(jiān)聽注冊狀態(tài)

@Override

public void registrationState(LinphoneCore linphoneCore, LinphoneProxyConfig linphoneProxyConfig, LinphoneCore.RegistrationState registrationState, String s) {

Log.i("registrationState","registration: " + registrationState + " ---" + linphoneProxyConfig.getAddress() + " - " + s);

}

三粉臊、LinphoneChatMessage文本消息

1.使用LinphoneChatRoom和LinphoneChatMessage進(jìn)行文本消息的發(fā)送

public void sendMessage() {

????try {

????????//對方的sip地址

????????String to = "sip:對方賬號@服務(wù)器地址";

????????LinphoneAddress toAddress = lc.interpretUrl(to);

????????//建立對話

????????LinphoneChatRoom cr = lc.getChatRoom(toAddress);

????????//創(chuàng)建消息

????????LinphoneChatMessage msg = cr.createLinphoneChatMessage("你好");

????????//發(fā)送消息

????????cr.sendChatMessage(msg);

????} catch (LinphoneCoreException e) {

????????e.printStackTrace();

????}

}

2.利用messageReceived()回調(diào)接收消息

@Override

public void messageReceived(LinphoneCore lpc, LinphoneChatRoom cr, LinphoneChatMessage msg) {

Toast.makeText(getApplicationContext(), "接收到來自" + msg.getFrom().getUserName() + "的消息: " + msg.getText(), Toast.LENGTH_SHORT).show();

}

四、LinphoneCall語音視頻通話(單通話)

1.撥打電話

public synchronized void callOut(){

? ? try {

? ? ? ? //對方的sip地址

? ? ? ? String to = "sip:對方賬號@服務(wù)器地址";

????????LinphoneProxyConfig lpc = lc.getDefaultProxyConfig();

????????if (lpc != null){

? ? ? ? ? ? to = lpc.normalizePhoneNumber(to);

????????}

? ? ? ? LinphoneAddress toAddress = lc.interpretUrl(to);

????????if (lpc != null && toAddress.asStringUriOnly().equals(lpc.getIdentity())){

? ? ? ? ? ? //判斷下?lián)艽虻奶柎a是否是自己注冊登錄的號碼

? ? ? ? ? ? return;

????????}

? ? ? ? if (lc.isNetworkReachable()){

? ? ? ? ? ? //創(chuàng)建通話參數(shù)

? ? ? ? ? ? LinphoneCallParams params = lc.createCallParams(null);

????????????//是否啟用視頻

? ? ? ? ? ? params.setVideoEnabled(false);

????????????//設(shè)置音頻帶寬

? ? ? ? ? ? params.setAudioBandwidth(40);

????????????//建立通話

? ? ? ? ? ? lc.inviteAddressWithParams(toAddress,params);

????????} else {

? ? ? ? ? ? Log.e("Error: no network");

????????}

? ? } catch (LinphoneCoreException e){

? ? ? ? e.printStackTrace();

????}

}

2.接聽電話

public synchronized void callAnswer(){

? ? LinphoneCall mCall = null;

????ArrayList calls = new ArrayList<>(Arrays.asList(lc.getCalls()));

????for (LinphoneCall call : calls){

? ? ? ? LinphoneCall.State cstate = call.getState();

????????if (LinphoneCall.State.IncomingReceived == cstate){

? ? ? ? ? ? mCall = call;

????????????break;

????????}

????}

? ? if (mCall == null){

? ? ? ? return;

????}

? ? LinphoneCallParams params = lc.createCallParams(mCall);

????if (params != null){

? ? ? ? try {

? ? ? ? ? ? lc.acceptCallWithParams(mCall,params);

????????} catch (LinphoneCoreException e){

? ? ? ? ? ? lc.enableSpeaker(false);

????????????Log.i(e,"Accept call failed");

????????}

? ? } else {

? ? ? ? Toast.makeText(this,"An error occurred while accepting the call",Toast.LENGTH_LONG).show();

????}

}

3.掛斷電話

lc.terminateAllCalls();

4.利用callState()回調(diào)監(jiān)聽電話狀態(tài)

@Override

public void callState(LinphoneCore linphoneCore,LinphoneCall call,LinphoneCall.State state,String s){

? ? Log.i("callState","與你通話的是: " + call.getRemoteAddress()+ " - " + state + " - " + s);

????if (state == LinphoneCall.State.IncomingReceived){

? ? ? ? //來電

? ? }

? ? if (state == LinphoneCall.State.OutgoingRinging){

? ? ? ? //去電

? ? }

? ? if (state == LinphoneCall.State.Connected){

? ? ? ? //來去電接通

? ? }

? ? if (state == LinphoneCall.State.CallEnd || state == LinphoneCall.State.CallReleased || state == LinphoneCall.State.Error){

? ? ? ? //結(jié)束釋放驶兜、錯誤通話

? ? }

}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末扼仲,一起剝皮案震驚了整個濱河市远寸,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌屠凶,老刑警劉巖驰后,帶你破解...
    沈念sama閱讀 212,718評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異矗愧,居然都是意外死亡灶芝,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評論 3 385
  • 文/潘曉璐 我一進(jìn)店門唉韭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來夜涕,“玉大人,你說我怎么就攤上這事纽哥∧品Γ” “怎么了?”我有些...
    開封第一講書人閱讀 158,207評論 0 348
  • 文/不壞的土叔 我叫張陵春塌,是天一觀的道長晓避。 經(jīng)常有香客問我,道長只壳,這世上最難降的妖魔是什么俏拱? 我笑而不...
    開封第一講書人閱讀 56,755評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮吼句,結(jié)果婚禮上锅必,老公的妹妹穿的比我還像新娘。我一直安慰自己惕艳,他們只是感情好搞隐,可當(dāng)我...
    茶點故事閱讀 65,862評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著远搪,像睡著了一般劣纲。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上谁鳍,一...
    開封第一講書人閱讀 50,050評論 1 291
  • 那天癞季,我揣著相機與錄音,去河邊找鬼倘潜。 笑死绷柒,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的涮因。 我是一名探鬼主播废睦,決...
    沈念sama閱讀 39,136評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼蕊退!你這毒婦竟也來了郊楣?” 一聲冷哼從身側(cè)響起憔恳,我...
    開封第一講書人閱讀 37,882評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎净蚤,沒想到半個月后钥组,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,330評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡今瀑,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,651評論 2 327
  • 正文 我和宋清朗相戀三年程梦,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片橘荠。...
    茶點故事閱讀 38,789評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡屿附,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出哥童,到底是詐尸還是另有隱情挺份,我是刑警寧澤,帶...
    沈念sama閱讀 34,477評論 4 333
  • 正文 年R本政府宣布贮懈,位于F島的核電站匀泊,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏朵你。R本人自食惡果不足惜各聘,卻給世界環(huán)境...
    茶點故事閱讀 40,135評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望抡医。 院中可真熱鬧躲因,春花似錦、人聲如沸忌傻。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽水孩。三九已至箱靴,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間荷愕,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評論 1 267
  • 我被黑心中介騙來泰國打工棍矛, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留安疗,地道東北人。 一個月前我還...
    沈念sama閱讀 46,598評論 2 362
  • 正文 我出身青樓够委,卻偏偏與公主長得像荐类,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子茁帽,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,697評論 2 351

推薦閱讀更多精彩內(nèi)容