天天看點

中秋禮物!開源即時通信GGTalk安卓版全新源碼!

經過連續兩個多月的努力(開發、調試、測試、改bug),我們終于趕在中秋國慶之前能釋出GGTalk 7.0,并把全新的功能完整的GGTalk Android版獻給大家。祝大家中秋國慶雙節快樂!

       經過連續兩個多月的努力(開發、調試、測試、改bug),我們終于趕在中秋國慶之前能把全新的GGTalk Android版本獻給大家。

       4年之前我們就推出了GGTalk Android的第一個版本,但是功能太簡單,界面很粗糙,代碼也很糟糕。後面了,因為一直忙着做項目,也沒有太多時間去完善它。

       很多使用GGTalk的朋友經常問新的Android版什麼時候出來,我們也是不好意思地一拖再拖,到了今年7月份,終于再也拖不下去了,必須要釋出一個功能相對完整的版本,才能對得住關注的朋友們。

       終于,在今天GGTalk 7.0 對應的安卓全新版本終于和小夥伴們見面了,它與剛釋出的GGTalk 7.0 的PC用戶端可以是互通的,是以它當然也就可以與我們PC端互相通信,互相聊天了。下面我們先來看看它的真面目吧!

      ( 想要直接下載下傳GGTalk Android全新源碼的朋友請點選:源碼下載下傳中心)

一、GGTalk 安卓版截圖

  

中秋禮物!開源即時通信GGTalk安卓版全新源碼!
中秋禮物!開源即時通信GGTalk安卓版全新源碼!
中秋禮物!開源即時通信GGTalk安卓版全新源碼!
中秋禮物!開源即時通信GGTalk安卓版全新源碼!
中秋禮物!開源即時通信GGTalk安卓版全新源碼!
中秋禮物!開源即時通信GGTalk安卓版全新源碼!
中秋禮物!開源即時通信GGTalk安卓版全新源碼!

二、源碼實作

      接下來,我們概要的介紹一下GGTalk Android源碼項目的結構,以及源碼實作中比較重要和難以了解的部分,以友善大家能更快地上手GGTalk 安卓端源碼。

1、項目結構

中秋禮物!開源即時通信GGTalk安卓版全新源碼!

2、消息發送與接收

  與服務端的通信互動還是與PC端一緻,都是采用的ESFramework的通信架構來實作的。先建立一個用戶端用戶端引擎IRapidPassiveEngine,再調用引擎的initialize方法即可完成登入的操作。 代碼如下

  CustomizeHandler handler = new CustomizeHandler();
  engine = RapidEngineFactory.CreatePassiveEngine();
  engine.setEngineEventListener(GGApplication.getInstance());
  engine.getBasicOutter().addBasicEventListener(GGApplication.getInstance());
  LogonResponse resp = engine.initialize(getUserName, getPassWord, host, port, handler, getApplication());      

  登入成功後的消息都是在GGApplication這個類中收到并處理,主要有如下2個回調方法

/**
     * 對方通過engin.sendMessage()方法發送的消息,會進入到該回調中
     * */
    @Override
    public void messageReceived(String sourceUserID, int messageType, byte[] message, String tag) {
        switch (ContractType.getContractTypeByCode(messageType)) {
            case CHAT:
                try {
                    RichChatMessage richChatMessage = new RichChatMessage();
                    richChatMessage.deserialize(BufferUtils.wrappedBuffer(message));
                    EventBus.getDefault().post(new ChatEvent(tag, tag, richChatMessage, false));
                    GGApplication.getInstance().ringForMessage();
                } catch (Exception e) {
                    e.printStackTrace();
                }
                break;
      ...
  }

  /**
   * 對方通過engin.ICustomizeOutter.send()方法發送的消息,會進入到該回調中
   * */
  @Override
  public void handleInformation(String sourceUserID, int messageType, byte[] bytes) {
    try {
        switch (ContractType.getContractTypeByCode(messageType)) {
            case UserStatusChanged:
                UserStatusChangedContract userStatusChangedContract = new UserStatusChangedContract();
                userStatusChangedContract.deserialize(bytes);
                EventBus.getDefault().post(new UserStatusChanagedEvent(userStatusChangedContract.getUserID(), userStatusChangedContract.getStatus()));
                break;
      ...
  }      

  發送消息方式同樣有2種:1. 直接通過engin.sendMessage,2.通過ICustomizeOutter接口發送    它們調用的方式都大同小異, 我們就以第一種方式來做介紹

public void sendChatMessage(String targetUserID,  RichChatMessage message) {
        byte[] msg = null;
        try {
            msg = message.serialize();
        } catch (Exception ee) {
            ee.printStackTrace();
        }
        this.engine.sendMessage(null, ContractType.CHAT.getType(), msg, targetUserID);
    }      
  void sendMessage(String targerID, int type, byte[] data, String tag);      

  第一個參數 targerID 為接收者ID(null 表示接收者為服務端),第二個參數type 為消息類型,第三個參數data 為消息内容 序列化後的資料,第四個參數tag為附帶的字元串(可為空字元串)

3、主要控件介紹

(1)視訊控件:CameraSurfaceView、OMCSSurfaceView。

  CameraSurfaceView:主要功能是顯示本機的預覽界面,通過ICamOpenOverCallback接口的回調注入到OMCS架構中

@Override
    public void cameraHasOpened() {
        try {
            //預覽camera所用holder,不可為null或是隐藏,否則不能從攝像頭擷取資料
            SurfaceHolder holder = myView.getSurfaceHolder();
            //觸發預覽事件
            MultimediaManagerFactory.GetSingleton().startCameraPreview(holder);
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }      

  OMCSSurfaceView:主要功能是連接配接對方的攝像頭并顯示圖像。使用起來也比較簡單,我們隻需要通過setOtherVideoPlayerSurfaceView将它注入到攝像頭連接配接器CameraConnector 中就可以了,當cameraConnector調用其beginConnect方法時就會自動去連接配接對方的攝像頭,并将圖像内容顯示到OMCSSurfaceView控件上。

  CameraConnector cameraConnector = new CameraConnector();
  OMCSSurfaceView otherView = (OMCSSurfaceView) findViewById(R.id.opposite_surface);
  cameraConnector.setOtherVideoPlayerSurfaceView(otherView);
  cameraConnector.setVideoUniformScale(true,true);
  cameraConnector.beginConnect(uerid);      

(2)音頻連接配接器 MicrophoneConnector 

  這個就比較簡單了,隻需調用其beginConnect方法即可,這樣就可以連接配接到對方的麥克風,監聽對方的語音

  MicrophoneConnector microphoneConnector = new MicrophoneConnector();
  microphoneConnector.beginConnect(uerid);      

(3)語音消息 AudioMessage

  首先是初始化,并注冊播放的回調方法

@Override
    protected void onResume() {
        super.onResume();
        if (!MultimediaManagerFactory.GetSingleton().getAudioMessageController().isInitialized()) {
            MultimediaManagerFactory.GetSingleton().getAudioMessageController().initialize();
            MultimediaManagerFactory.GetSingleton().getAudioMessageController().setAudioMessageHandler(GGApplication.getInstance());
            MultimediaManagerFactory.GetSingleton().getAudioMessageController().getAudioMessagePlayer().setAudioPlayerCallback(this);
        }
    }

    //region IAudioPlayerCallback 播放回調
    @Override
    public void playFinished(AudioMessage message) {
        message.setAnimation(false);
       // Log.i("ChatLVAdapter", "playFinished:"+message);
        Message msg = mHandler.obtainMessage(1);
        mHandler.sendMessage(msg);
    }

    @Override
    public void playInterrupted(AudioMessage message) {
        message.setAnimation(false);
      //  Log.i("ChatLVAdapter", "playInterrupted:"+message);
        Message msg = mHandler.obtainMessage(1);
        mHandler.sendMessage(msg);
    }
    //endregion
      

  錄制和發送語音消息給對方,startCapture()方法開始采集,stopCapture()方法停止采集并傳回已采集的AudioMessage對象,再通過send方法将 AudioMessage對象發送給指定的好友。

  if (event.getAction() == MotionEvent.ACTION_UP) {
    if (SDKUtil.checkConnection()) {
      AudioMessage message = MultimediaManagerFactory.GetSingleton().getAudioMessageController().stopCapture();
      if (message != null) {
        //沒有一秒不發送
        if (message.spanInMSecs > 1000) {
          ChatInfo info = getChatInfo(GGApplication.getInstance().getMySelf().getUserID(), message, true);
          addChatinfoAndDisplay(info);
          MultimediaManagerFactory.GetSingleton().getAudioMessageController().send(message, TalkingID);
        } else {
          ToastUtils.showShort(ChatActivity.this.getApplication(), "時間太短!");
        }
      }
    }
    buttonSpeak.setText("按住說話");
    //發出采集資料,并展現再界面中
  } else if (event.getAction() == MotionEvent.ACTION_DOWN) {
    if (SDKUtil.checkConnection()) {
      MultimediaManagerFactory.GetSingleton().getAudioMessageController().startCapture();
    }
    buttonSpeak.setText("松開結束");
  }      

  接收語音消息,需要實作 IAudioMessageHandler 接口 ,并調用setAudioMessageHandler 方法注入到OMCS架構中,當收到其他好友發來的語音消息時就會觸發 handleAudioMessage,我們隻需在該方法内做相關接收消息的處理即可。

public interface IAudioMessageHandler {
        void handleAudioMessage(AudioMessage var1);
    }

    @Override
    public void handleAudioMessage(AudioMessage message) {
        try {
            EventBus.getDefault().post(new ChatEvent(message.creatorID, message.creatorID, message, false));
            GGApplication.getInstance().ringForMessage();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

      
  MultimediaManagerFactory.GetSingleton().getAudioMessageController().setAudioMessageHandler(GGApplication.getInstance());      

   語音消息的播放和停止,通過getAudioMessagePlayer()擷取播放器,調用其play或stop 方法即可完成播放語音和停止播放的功能

  IAudioMessagePlayer audioPlayer=MultimediaManagerFactory.GetSingleton().getAudioMessageController().getAudioMessagePlayer();
  audioPlayer.play(audioMessage);
  audioPlayer.stop();      

  語音消息頁面關掉時,記住要釋放語音消息控制器,不然會一直占用麥克風

  MultimediaManagerFactory.GetSingleton().getAudioMessageController().dispose();      

三、GGTalk Android 源碼下載下傳

最新源碼下載下傳以及部署說明文檔,請轉到這裡。

注意:全新的GGTalk Android源碼,要配合最新的GGTalk 7.0(服務端+PC端),才可以正常互通的。

________________________________________________________________________

歡迎和我探讨關于GGTalk的一切,我的QQ:2027224508,多多交流!  

大家有什麼問題和建議,可以留言,也可以發送email到我郵箱:[email protected]。 

如果你覺得還不錯,請粉我,順便再頂一下啊

繼續閱讀