基於linphone android sdk 的voip語音、視訊通話 教程二、sip語音撥打、接聽
1.在實現撥打之前我們先把註冊狀態顯示到view上
讓LinphoneMiniManager extends Service 便於傳送訊息到MainActivity.java 別忘了AndroidManifest.xml的註冊service
<service android:name=".LinphoneMiniManager"></service>
在把manger的程式碼改改
public LinphoneMiniManager(Context c) { mContext = c; LinphoneCoreFactory.instance().setDebugMode(true, "Linphone Mini"); try { String basePath = mContext.getFilesDir().getAbsolutePath(); copyAssetsFromPackage(basePath); mLinphoneCore = LinphoneCoreFactory.instance().createLinphoneCore(this, basePath + "/.linphonerc", basePath + "/linphonerc", null, mContext); initLinphoneCoreValues(basePath); setUserAgent(); setFrontCamAsDefault(); startIterate(); mInstance = this; mLinphoneCore.setNetworkReachable(true); // Let's assume it's true } catch (LinphoneCoreException e) { } catch (IOException e) { } } //上面的改為 private LinphoneCoreFactory lcFactory; public static boolean isReady() { return mInstance != null; } @Override public void onCreate() { super.onCreate(); mContext = this; lcFactory = LinphoneCoreFactory.instance(); lcFactory.setDebugMode(true, "lilinaini 1"); try { String basePath = mContext.getFilesDir().getAbsolutePath(); copyAssetsFromPackage(basePath); mLinphoneCore = lcFactory.createLinphoneCore(this, basePath + "/.linphonerc", basePath + "/linphonerc", null, mContext); initLinphoneCoreValues(basePath); setUserAgent(); setFrontCamAsDefault(); startIterate(); mInstance = this; mLinphoneCore.setNetworkReachable(true); // Let's assume it's true } catch (LinphoneCoreException e) { } catch (IOException e) { } } public static LinphoneMiniManager getInstance() { return mInstance; } public static LinphoneCore getLC() { if(null==mInstance){ return null; } return mInstance.mLinphoneCore; }
完了在activity_main.xml新增顯示的文字
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/id_text_status"
android:textSize="20dip"
android:text="狀態" />
在MainActivity.java新增廣播接受者並在onCreate註冊
public class MainActivityReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getStringExtra("action");
switch (action) {
case "reg_state":
id_text_status.setText(intent.getStringExtra("data") );
break;
default:
break;
}
}
}
public static final String RECEIVE_MAIN_ACTIVITY = "receive_main_activity";
private MainActivityReceiver mReceiver;
protected void onCreate(Bundle savedInstanceState) {
。。。
//廣播
IntentFilter intentFilter = new IntentFilter(RECEIVE_MAIN_ACTIVITY);
mReceiver = new MainActivityReceiver();
registerReceiver(mReceiver, intentFilter);
。。。
}
再到LinphoneMiniManager.java裡面的
@Override
public void registrationState(LinphoneCore lc, LinphoneProxyConfig cfg,
RegistrationState cstate, String smessage) {
//Log.e("lilin Registration state: " + cstate + "(" + smessage + ")");
Intent intent = new Intent(MainActivity.RECEIVE_MAIN_ACTIVITY);
intent.putExtra("action", "reg_state");intent.putExtra("data",smessage );
sendBroadcast( intent);
}
重新啟動就可以看到註冊的狀態了
2.實現撥打電話
<Button
android:layout_width="wrap_content"
android:layout_marginTop="5dip"
android:layout_height="wrap_content"
android:id="@+id/id_btn_boda"
android:text="語音撥打"
/>
在MainActivity.java新增實現點選
instance.lilin_call(id_etext_dail.getText().toString(),host,false);
在LinphoneMiniManager.java新增方法
public void lilin_call(String username,String host,boolean isVideoCall) throws LinphoneCoreException{
LinphoneAddress address = mLinphoneCore.interpretUrl(username+ "@" + host);
address.setDisplayName(username);
LinphoneCallParams params = mLinphoneCore.createCallParams(null);
if (isVideoCall) {
params.setVideoEnabled(true);
params.enableLowBandwidth(false);
} else {
params.setVideoEnabled(false);
}
LinphoneCall call = mLinphoneCore.inviteAddressWithParams(address, params);
if (call == null) {
Log.e("lilin error", "Could not place call to " + username);
return;
}
}
好了 註冊成功後 可以點選撥打了 測試的話找另外一個sip 客戶端接聽就行了
3. 接聽
<Button
android:layout_width="match_parent"
android:layout_marginTop="5dip"
android:layout_height="wrap_content"
android:id="@+id/id_btn_jie"
android:text="接電話"
/>
點選事件
instance.lilin_jie();
在LinphoneMiniManager.java新增方法
public void lilin_jie() throws LinphoneCoreException{
//instance.getLC().setVideoPolicy(true, instance.getLC().getVideoAutoAcceptPolicy());/*設定初始話視訊電話,設定了這個你撥號的時候就預設為使用視訊發起通話了*/
getLC().setVideoPolicy(getLC().getVideoAutoInitiatePolicy(), true);/*設定自動接聽視訊通話的請求,也就是說只要是視訊通話來了,直接就接通,不用按鍵確定,這是我們的業務流,不用理會*/
/*這是允許視訊通話,這個選了false就徹底不能接聽或者撥打視訊電話了*/
getLC().enableVideo(true, true);
LinphoneCall currentCall = getLC().getCurrentCall();
if (currentCall != null) {
LinphoneCallParams params = getLC().createCallParams(currentCall);
getLC().acceptCallWithParams(currentCall,params );
}
}
鈴聲需要將
private void initLinphoneCoreValues(String basePath) {
。。。
mLinphoneCore.setRing( basePath + "/oldphone_mono.wav");//null gai
。。。
}
好了 現在可以更具註冊的 接聽電話
未完待續 更多到部落格列表
對此感興趣的可以加群261074724