1. 程式人生 > >基於linphone android sdk 的voip語音、視訊通話 教程二、sip語音撥打、接聽

基於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