如何實現監控手機屏幕?(附源碼)


  最近做了一個項目,里面有涉及到監控PC桌面和監視手機屏幕的功能,客戶需要在PC電腦上和安卓手機上都能夠觀看對方的屏幕,而對方的設備既可以是PC電腦,也可以是安卓手機。

       為了便於以后復習,我把這個屏幕監控的功能單獨提出來做了個Demo名為ScreenMonitor來記錄備忘,順便也分享給大家。

       該Demo一個包括3個項目:服務端、PC客戶端、安卓客戶端。

       文末除了將ScreenMonitor整個項目的源碼提供下載,也專門給出了可以直接部署的版本,供大家直接部署測試。

       接下來,我將給大家介紹整個功能的實現原理和代碼邏輯,大家可以從文末下載源碼后,對照源碼再來看下面的介紹就會更清晰些。  

一.服務端實現

  服務端主要用來轉發數據(被監控的屏幕圖像的編碼數據),並不涉及其它復雜的業務邏輯。

       這個實現起來很簡單,只需要幾句代碼就OK,它主要做的就是將客戶端的消息的處理與數據的轉發。這里不做過多的介紹,其關鍵核心代碼只有一句,就是創建OMCS多媒體服務器實例。 

Program.MultimediaServer = MultimediaServerFactory.CreateMultimediaServer(9900, userVerifier, config, bool.Parse(ConfigurationManager.AppSettings["SecurityLogEnabled"]));

      第一個參數是提供服務的TCP端口,第二個參數用於驗證登錄的用戶帳號密碼。服務端運行界面如下所示:

    

二.PC客戶端實現

  客戶端中我們也分為了2種身份:控制端、被控端

  

  我們在登錄時,我們需要初始化多媒體管理器 來連接服務端進行通信,其實也很簡單,我們也只需要調用一句話就OK。 

multimediaManager.Initialize(loginForm.CurrentUserID, "", ConfigurationManager.AppSettings["ServerIP"], int.Parse(ConfigurationManager.AppSettings["ServerPort"])); 

1.PC控制端:主要包括遠程觀看對方的桌面、監聽對方的麥克風 2個功能 

   

  實現中主要是用到了DesktopConnector這個自定義控件,我們也只需簡單的調用一個BeginConnect 方法就可以直接連接到對方桌面。將控件還提供了2個事件 ConnectEnded、Disconnected 來知道當前連接的結果和狀態 

     public DesktopForm(string friendID,bool audioEnabled)
        {
            InitializeComponent();
            
            this.ownerID = friendID;
            this.Text = string.Format("正在訪問{0}的桌面", this.ownerID);          
            this.desktopConnector1.ConnectEnded += new CbGeneric<ConnectResult>(desktopConnector1_ConnectEnded);
            this.desktopConnector1.Disconnected += DesktopConnector1_Disconnected;
            this.desktopConnector1.BeginConnect(this.ownerID);
            if (audioEnabled)
            {
                this.microphoneConnector1.BeginConnect(this.ownerID);
            }
        }

        private void DesktopConnector1_Disconnected(ConnectorDisconnectedType type)
        {
            if (this.InvokeRequired)
            {
                this.BeginInvoke(new CbGeneric<ConnectorDisconnectedType>(this.DesktopConnector1_Disconnected), type);
            }
            else
            {
                if (type == ConnectorDisconnectedType.OwnerActiveDisconnect || type == ConnectorDisconnectedType.GuestActiveDisconnect)
                {
                    return;
                }
                MessageBox.Show("斷開連接!原因:" + type);
                this.Close();
            }
        }


        void desktopConnector1_ConnectEnded(ConnectResult result)
        {
            if (this.InvokeRequired)
            {
                this.BeginInvoke(new CbGeneric<ConnectResult>(this.desktopConnector1_ConnectEnded), result);
            }
            else
            {
                if (result != ConnectResult.Succeed)
                {
                    MessageBox.Show("連接失敗!" + result.ToString());
                }    
            }
        }

   以下為在PC端遠程觀看手機屏幕的截圖: 

    

2.PC被控端:顯示正在被哪些用戶觀看

   

三.安卓端實現

    安卓客戶端就與PC客戶端的實現原理差不多了,只是其中一些細節不一樣而已

    安卓端同樣也是分為2種身份:監控端、被控端

    

    同PC客戶端一樣我們也要初始化多媒體管理器 來連接服務端進行通信 

LogonResponse omcsResp = MultimediaManagerFactory.GetSingleton().initialize(id, password, ipaddStr, 9900, getApplication());//登錄OMCS服務器

1.安卓控制端:功能同PC一樣,可觀看目標用戶的屏幕和監聽麥克風

     

   這里我們用到了一個自定義組件 DesktopSurfaceView 用來顯示對方桌面的圖像 ,我們通過桌面連接器 DesktopConnector 去連接對方的桌面將獲取的桌面圖像數據用於該組件來顯示

     //顯示對方數據view  
       DesktopSurfaceView otherView = (DesktopSurfaceView) findViewById(R.id.Desk_surface_remote);
        desktopConnector.setOtherVideoPlayerSurfaceView(otherView);
        desktopConnector.setConnectorEventListener(new IConnectorEventListener() {
            @Override
            public void connectEnded(ConnectResult connectResult) {
                if( connectResult!= ConnectResult.Succeed){
                    Message msg = Message.obtain(); // 實例化消息對象
                    msg.what = 1; // 消息標識
                    msg.obj = "遠程桌面連接失敗:" + connectResult.toString(); // 消息內容存放
                    myHandler.sendMessage(msg);
                }
            }
            @Override
            public void disconnected(ConnectorDisconnectedType connectorDisconnectedType) {
                if(connectorDisconnectedType==ConnectorDisconnectedType.OwnerActiveDisconnect||connectorDisconnectedType==ConnectorDisconnectedType.GuestActiveDisconnect)
                {
                    return;
                }
                Message msg = Message.obtain(); // 實例化消息對象
                msg.what = 2; // 消息標識
                msg.obj = "遠程桌面連接斷開:" + connectorDisconnectedType.toString();// 消息內容存放
                myHandler.sendMessage(msg);
            }
        });

        desktopConnector.beginConnect(targetUid);

  下圖為手機監控PC桌面 

   

2.安卓被控端:需要采集本手機的桌面圖像、麥克風聲音發送給控制方

   核心點在采集本手機的整個桌面的圖像,這一點在OMCS框架中已經為我們處理好了,我們只是需要設置一下相關權限來允許錄制屏幕即可,剩下的事情都可以交給omcs內部去處理了。 

    MultimediaManagerFactory.GetSingleton().setDesktopRecordActivity(this);//this 為當前Activity
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        MultimediaManagerFactory.GetSingleton().setDesktopRecordActivityResult(requestCode, resultCode, data);//設置授權結果給多媒體管理器

    }

  當控制方請求觀看安卓的桌面時,被控端會彈出如下權限申請提示,點擊“立即開始”對方就可以開始采集屏幕並將數據發送給 控制方用於顯示。(若勾選了始終允許分享屏幕 的選項,之后控制端請求訪問該被控端時就不會再次彈出權限的對話框了,可直接看得到該屏幕)

   

四、ScreenMonitor 源碼下載

1. 項目源碼下載 ScreenMonitor.rar

2. 部署版本下載 ScreenMonitor_Deploy.rar 

 

另外:GGTalk V7.0 已於2020.09.30發布,全新的 服務端+PC端+Android端 源碼,快來下載吧!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM