日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android VNC Server New

發(fā)布時間:2023/12/4 Android 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android VNC Server New 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

?Android VNC Server New

關(guān)于VNC請參見維基百科:http://zh.wikipedia.org/wiki/VNC

? ? ? ???關(guān)于執(zhí)行Android VNC Server,請參見前一篇文章:點擊鏈接

一、VNC下載 1)fastdroid-vnc

? ? ? ???Android VNC Server開源項目

http://code.google.com/p/fastdroid-vnc/ 2)TightVNC 免費的VNC軟件(這個都不需要填郵箱^^) http://www.tightvnc.com/download.php 二、程序執(zhí)行 這種方式看手機了==。Google HTC上倒是可以,詳細的說明看注釋了。 1)簡易UI 布局一點沒變動… VNCServerNewActivity.java
  • public?class?VNCServerNewActivity?extends?Activity?{?
  • ?
  • ????private?static?final?String?TAG?=?"VNCServer";?
  • ????private?static?final?boolean?LOGD?=?true;?
  • ?
  • ????/**?assets目錄下的VNCServer文件名?*/?
  • ????private?static?final?String?VNC_SERV_NAME?=?"fastdroid-vnc";?
  • ?
  • ????/**?Shell工具類?*/?
  • ????private?ShellUtil?mShellUtil;?
  • ?
  • ????/**?dialog基礎(chǔ)標識值?*/?
  • ????private?static?final?int?DLG_BASE?=?0;?
  • ????/**?獲root權(quán)限失敗的dialog?id?*/?
  • ????private?static?final?int?DLG_ROOT_FAILED?=?DLG_BASE?+?1;?
  • ????/**?開啟VNC服務(wù)失敗的dialog?id?*/?
  • ????private?static?final?int?DLG_EXEC_FAILED?=?DLG_BASE?+?2;?
  • ?
  • ????/**?VNC服務(wù)端口:5901?*/?
  • ????private?static?final?String?VNC_SERV_PORT?=?"5901";?
  • ?
  • ????/**?按鈕?*/?
  • ????private?Button?startBtn,?stopBtn;?
  • ????/**?標簽?*/?
  • ????private?TextView?statusView,?connectView;?
  • ?
  • ????/**?'ps?-l?VNC_SERV_NAME'命令?*/?
  • ????private?static?final?String[]?PS_VNC_SERVER?=?new?String[]?{?"ps",?"-l",?
  • ????????????VNC_SERV_NAME?};?
  • ????/**?執(zhí)行上述命令獲取的pid結(jié)果集?*/?
  • ????private?ArrayList<String>?pidList;?
  • ?
  • ????@Override?
  • ????public?void?onCreate(Bundle?savedInstanceState)?{?
  • ????????super.onCreate(savedInstanceState);?
  • ????????setContentView(R.layout.main);?
  • ?
  • ????????mShellUtil?=?ShellUtil.getInstance();?//?獲取實例?
  • ?
  • ????????initApp();?//?初始化應(yīng)用?
  • ????????initViews();?//?初始化組件?
  • ????}?
  • ?
  • ????/**?初始化組件?*/?
  • ????private?void?initViews()?{?
  • ????????startBtn?=?(Button)?findViewById(R.id.startBtn);?
  • ????????stopBtn?=?(Button)?findViewById(R.id.stopBtn);?
  • ????????statusView?=?(TextView)?findViewById(R.id.statusView);?
  • ????????connectView?=?(TextView)?findViewById(R.id.connectView);?
  • ????????updateViews(isServerOn());?//?由服務(wù)狀態(tài)更新界面?
  • ????}?
  • ?
  • ????/**?初始化應(yīng)用?*/?
  • ????private?void?initApp()?{?
  • ????????boolean?result?=?mShellUtil.root();?//?獲取ROOT權(quán)限?
  • ????????if?(LOGD)?
  • ????????????Log.d(TAG,?"獲取Root權(quán)限:"?+?result);?
  • ????????if?(result)?{?
  • ????????????copyVNCServer();?//?檢查VNCServer文件?
  • ????????}?else?{?
  • ????????????showDialog(DLG_ROOT_FAILED);?//?提示DLG_ROOT_FAILED對話框?
  • ????????}?
  • ????}?
  • ?
  • ????/**?檢查VNCServer文件,不存在時復(fù)制進去?*/?
  • ????private?void?copyVNCServer()?{?
  • ????????String?filePath?=?"/data/local/"?+?VNC_SERV_NAME;?
  • ????????File?file?=?new?File(filePath);?
  • ?
  • ????????/*?文件不存在時,從assets復(fù)制進去?*/?
  • ????????if?(!file.exists())?{?
  • ????????????/*?/data/local/目錄增加所有用戶的寫權(quán)限?*/?
  • ????????????boolean?result?=?mShellUtil.rootCommand("chmod?a+x?/data/local/");?
  • ????????????if?(LOGD)?
  • ????????????????Log.d(TAG,?"/data/local/增加寫權(quán)限:"?+?result);?
  • ?
  • ????????????//?避免某些機子new?FileOutputStream(file)時報System.err==?
  • ????????????result?=?mShellUtil.rootCommand("touch?"?+?filePath);?
  • ????????????if?(LOGD)?
  • ????????????????Log.d(TAG,?"創(chuàng)建一個空文件:"?+?result);?
  • ?
  • ????????????/*?VNCServer文件設(shè)為777權(quán)限?*/?
  • ????????????result?=?mShellUtil.rootCommand("chmod?777?"?+?filePath);?
  • ????????????if?(LOGD)?
  • ????????????????Log.d(TAG,?"/data/local/設(shè)為777權(quán)限:"?+?result);?
  • ?
  • ????????????if?(result)?{?
  • ????????????????try?{?
  • ????????????????????/*?將VNCServer文件復(fù)制入/data/local/?*/?
  • ????????????????????InputStream?is?=?getAssets().open(VNC_SERV_NAME);?
  • ????????????????????FileOutputStream?fos?=?new?FileOutputStream(file);?
  • ????????????????????byte[]?buffer?=?new?byte[4096];?
  • ????????????????????int?count?=?0;?
  • ????????????????????while?((count?=?is.read(buffer))?>?0)?{?
  • ????????????????????????fos.write(buffer,?0,?count);?
  • ????????????????????}?
  • ????????????????????fos.close();?
  • ????????????????????is.close();?
  • ????????????????????if?(LOGD)?
  • ????????????????????????Log.d(TAG,?VNC_SERV_NAME?+?"文件寫入/data/local/!");?
  • ????????????????}?catch?(IOException?e)?{?
  • ????????????????????e.printStackTrace();?
  • ????????????????}?
  • ????????????}?
  • ????????}?else?{?
  • ????????????if?(LOGD)?
  • ????????????????Log.d(TAG,?VNC_SERV_NAME?+?"文件已存在/data/目錄下!");?
  • ????????}?
  • ????}?
  • ?
  • ????/**?startBtn點擊事件?*/?
  • ????public?void?startBtn(View?v)?{?
  • ????????/*?執(zhí)行VNCServer文件?*/?
  • ????????String?cmd?=?"/data/local/"?+?VNC_SERV_NAME?+?"?&";?
  • ????????boolean?result?=?mShellUtil.rootCommand(cmd);?
  • ????????if?(LOGD)?
  • ????????????Log.d(TAG,?cmd?+?":"?+?result);?
  • ????????if?(isServerOn())?{?//?否開啟了服務(wù)?
  • ????????????updateViews(true);?
  • ????????}?else?{?
  • ????????????/**?
  • ?????????????*?1)有些ROM執(zhí)行開啟不了T^T(ps進程顯示Done,再一會就沒了)?
  • ?????????????*?2)用其他VNC文件發(fā)現(xiàn)未開啟也好提示用戶?
  • ?????????????*/?
  • ????????????showDialog(DLG_EXEC_FAILED);?//?提示DLG_EXEC_FAILED對話框?
  • ????????}?
  • ????}?
  • ?
  • ????/**?stopBtn點擊事件?*/?
  • ????public?void?stopBtn(View?v)?{?
  • ????????boolean?result;?
  • ????????/**?直到關(guān)閉為止。避免kill進程僅改變了狀態(tài)(遇到S->Z的情況)?*/?
  • ????????while?(isServerOn())?{?
  • ????????????for?(String?pid?:?pidList)?{?
  • ????????????????result?=?mShellUtil.rootCommand("kill?"?+?pid);?
  • ????????????????if?(LOGD)?
  • ????????????????????Log.d(TAG,?"kill?"?+?pid?+?":"?+?result);?
  • ????????????}?
  • ????????}?
  • ????????updateViews(false);?//?更新服務(wù)關(guān)閉時的界面狀態(tài)?
  • ????}?
  • ?
  • ????@Override?
  • ????protected?void?onDestroy()?{?
  • ????????super.onDestroy();?
  • ????????boolean?result?=?mShellUtil.rootRelease();?//?釋放占用資源?
  • ????????if?(LOGD)?
  • ????????????Log.d(TAG,?"釋放占用資源:"?+?result);?
  • ????}?
  • ?
  • ????/**?由服務(wù)狀態(tài)更新界面?*/?
  • ????private?void?updateViews(boolean?isServerOn)?{?
  • ????????/*?更新按鈕狀態(tài)?*/?
  • ????????startBtn.setEnabled(!isServerOn);?
  • ????????stopBtn.setEnabled(isServerOn);?
  • ????????/*?更新標簽顯示?*/?
  • ????????if?(isServerOn)?{?
  • ????????????statusView.setText(R.string.status_run);?
  • ????????????connectView.setText(getLocalIpAddress()?+?":"?+?VNC_SERV_PORT);?
  • ????????}?else?{?
  • ????????????statusView.setText(R.string.status_stop);?
  • ????????????connectView.setText(R.string.address);?
  • ????????}?
  • ????}?
  • ?
  • ????/**?是否開啟了服務(wù),并處理得到pid列表?*/?
  • ????private?boolean?isServerOn()?{?
  • ????????mShellUtil.setFilter(new?PsLineFilter());?//?設(shè)置過濾器?
  • ????????//?獲取ps命令的pid列表?
  • ????????pidList?=?mShellUtil.execCommand(PS_VNC_SERVER,?null,?true);
  • mShellUtil.resetFilter();?//?重置過濾器?
  • ????????boolean?result?=?(null?!=?pidList)?&&?(pidList.size()?>=?1);?
  • ????????if?(LOGD)?
  • ????????????Log.d(TAG,?"VNC服務(wù)開啟狀態(tài):"?+?result);?
  • ????????return?result;?
  • ????}?
  • ?
  • ????/**?獲取IP地址?*/?
  • ????private?String?getLocalIpAddress()?{?
  • ????????try?{?
  • ????????????//?遍歷網(wǎng)絡(luò)接口?
  • ????????????for?(Enumeration<NetworkInterface>?en?=?NetworkInterface?
  • ????????????????????.getNetworkInterfaces();?en.hasMoreElements();)?{?
  • ????????????????NetworkInterface?intf?=?en.nextElement();?
  • ????????????????//?遍歷IP地址?
  • ????????????????for?(Enumeration<InetAddress>?enumIpAddr?=?intf?
  • ????????????????????????.getInetAddresses();?enumIpAddr.hasMoreElements();)?{?
  • ????????????????????InetAddress?inetAddress?=?enumIpAddr.nextElement();?
  • ????????????????????//?非回傳地址時返回?
  • ????????????????????if?(!inetAddress.isLoopbackAddress())?{?
  • ????????????????????????return?inetAddress.getHostAddress().toString();?
  • ????????????????????}?
  • ????????????????}?
  • ????????????}?
  • ????????}?catch?(SocketException?e)?{?
  • ????????????e.printStackTrace();?
  • ????????}?
  • ????????return?null;?
  • ????}?
  • ?
  • ????@Override?
  • ????protected?Dialog?onCreateDialog(int?id)?{?
  • ????????省略……?
  • ????}?
  • ?
  • }?
  • 2)Shell工具類 ShellUtil.java
  • /**?Shell工具類?*/?
  • public?final?class?ShellUtil?{?
  • ?
  • ????/**?內(nèi)部類ShellUtilHolder?*/?
  • ????static?class?ShellUtilHolder?{?
  • ????????static?ShellUtil?instance?=?new?ShellUtil();?
  • ????}?
  • ?
  • ????/**?返回ShellUtil的單例?*/?
  • ????public?static?ShellUtil?getInstance()?{?
  • ????????return?ShellUtilHolder.instance;?
  • ????}?
  • ?
  • ????/**?\link?#root()\endlink后的進程?*/?
  • ????private?Process?process;?
  • ?
  • ????/**?\link?#root()\endlink后的父進程的標準輸入?*/?
  • ????private?DataOutputStream?dos;?
  • ?
  • ????/**?標準輸出的過濾?*/?
  • ????private?IStdoutFilter<String>?mIStdoutFilter;?
  • ?
  • ????/**?設(shè)置標準輸出的過濾器?*/?
  • ????public?void?setFilter(IStdoutFilter<String>?filter)?{?
  • ????????this.mIStdoutFilter?=?filter;?
  • ????}?
  • ?
  • ????/**?重置過濾器為空?*/?
  • ????public?void?resetFilter()?{?
  • ????????this.mIStdoutFilter?=?null;?
  • ????}?
  • ?
  • ????/**?
  • ?????*?@brief?切換至ROOT用戶?
  • ?????*?@details?執(zhí)行su命令,變更為root用戶?
  • ?????*?@pre?設(shè)備已經(jīng)破解,否則su不可用?
  • ?????*??
  • ?????*?@return?是否成功?
  • ?????*/?
  • ????public?boolean?root()?{?
  • ????????try?{?
  • ????????????//?執(zhí)行su變更用戶身份為root?
  • ????????????process?=?Runtime.getRuntime().exec("su");?
  • ????????????//?轉(zhuǎn)成DataOutputStream方便寫入字符串?
  • ????????????dos?=?new?DataOutputStream(process.getOutputStream());?
  • ????????}?catch?(Exception?e)?{?
  • ????????????e.printStackTrace();?
  • ????????????return?false;?
  • ????????}?
  • ????????return?true;?
  • ????}?
  • ?
  • ????/**?
  • ?????*?@brief?ROOT權(quán)限下執(zhí)行命令?
  • ?????*?@pre?執(zhí)行\(zhòng)link?#root()\endlink?
  • ?????*??
  • ?????*?@param?cmd?命令?
  • ?????*/?
  • ????public?boolean?rootCommand(String?cmd)?{?
  • ????????if?(null?!=?dos)?{?
  • ????????????try?{?
  • ????????????????dos.writeBytes(cmd?+?"\n");?
  • ????????????????dos.flush();?
  • ????????????}?catch?(IOException?e)?{?
  • ????????????????e.printStackTrace();?
  • ????????????????return?false;?
  • ????????????}?
  • ????????????return?true;?
  • ????????}?
  • ????????return?false;?
  • ????}?
  • ?
  • ????//?/**?
  • ????//?*?@brief?\link?#rootCommand()\endlink后的結(jié)果?
  • ????//?*?@pre?執(zhí)行\(zhòng)link?#rootCommand()\endlink?
  • ????//?*?
  • ????//?*?@warning?不能在stdin流輸入命令后再從stdout獲輸出結(jié)果?
  • ????//?*?(之前測試版也放在不同位置試過,都不成,死鎖?沒找到更多資料)?
  • ????//?*?
  • ????//?*?@return?輸出結(jié)果的集合?
  • ????//?*/?
  • ????//?public?ArrayList<String>?getStdout()?{?
  • ????//?ArrayList<String>?lineArray?=?new?ArrayList<String>();?
  • ????//?try?{?
  • ????//?handleStdout(lineArray,?process);?
  • ????//?}?catch?(IOException?e)?{?
  • ????//?e.printStackTrace();?
  • ????//?}?
  • ????//?return?lineArray;?
  • ????//?}?
  • ?
  • ????/**?釋放占用資源?*/?
  • ????public?boolean?rootRelease()?{?
  • ????????try?{?
  • ????????????dos.writeBytes("exit\n");?
  • ????????????dos.flush();?
  • ????????????process.waitFor();?//?等待執(zhí)行完成?
  • ????????}?catch?(Exception?e)?{?
  • ????????????e.printStackTrace();?
  • ????????????return?false;?
  • ????????}?finally?{?
  • ????????????try?{?
  • ????????????????if?(null?!=?process)?{?
  • ????????????????????process.destroy();?
  • ????????????????}?
  • ????????????????if?(null?!=?dos)?{?
  • ????????????????????dos.close();?
  • ????????????????}?
  • ????????????}?catch?(Exception?e)?{?
  • ????????????????e.printStackTrace();?
  • ????????????}?
  • ????????}?
  • ????????return?true;?
  • ????}?
  • ?
  • ????/**?
  • ?????*?@brief?執(zhí)行一個shell命令?
  • ?????*??
  • ?????*?@param?cmd?命令&參數(shù)組成的數(shù)組?
  • ?????*?@param?workDir?命令工作目錄?
  • ?????*?@param?isStdout?是否輸出結(jié)果?
  • ?????*?@return?輸出結(jié)果的集合?
  • ?????*/?
  • ????public?ArrayList<String>?execCommand(String[]?cmd,?String?workDir,?
  • ????????????boolean?isStdout)?{?
  • ????????ArrayList<String>?lineArray?=?null;?
  • ????????try?{?
  • ????????????//?創(chuàng)建操作系統(tǒng)進程(也可以由Runtime.exec()啟動)?
  • ????????????ProcessBuilder?builder?=?new?ProcessBuilder(cmd);?
  • ????????????//?設(shè)置命令工作目錄?
  • ????????????if?(workDir?!=?null)?{?
  • ????????????????builder.directory(new?File(workDir));?
  • ????????????}?
  • ????????????//?合并標準錯誤和標準輸出?
  • ????????????builder.redirectErrorStream(true);?
  • ????????????//?啟動一個新進程?
  • ????????????Process?process?=?builder.start();?
  • ?
  • ????????????//?如果輸出結(jié)果的話?
  • ????????????if?(isStdout)?{?
  • ????????????????lineArray?=?new?ArrayList<String>();?//?創(chuàng)建對象?
  • ????????????????handleStdout(lineArray,?process);?
  • ????????????}?
  • ????????}?catch?(Exception?e)?{?
  • ????????????e.printStackTrace();?
  • ????????}?
  • ????????return?lineArray;?
  • ????}?
  • ?
  • ????/**?
  • ?????*?處理標準輸出內(nèi)容?
  • ?????*??
  • ?????*?@throws?IOException?
  • ?????*/?
  • ????private?void?handleStdout(ArrayList<String>?lineArray,?Process?process)?
  • ????????????throws?IOException?{?
  • ????????InputStream?is?=?process.getInputStream();?//?獲得標準輸出流?
  • ????????if?(null?!=?mIStdoutFilter)?{?//?如果設(shè)置了過濾?
  • ????????????//?判斷是否是行過濾器?
  • ????????????if?(mIStdoutFilter?instanceof?AbstractLineFilter)?{?
  • ????????????????//?轉(zhuǎn)成BufferedReader?
  • ????????????????BufferedReader?br?=?new?BufferedReader(?
  • ????????????????????????new?InputStreamReader(is));?
  • ????????????????String?line;?
  • ????????????????while?(null?!=?(line?=?br.readLine()))?{?
  • ????????????????????/*?如果未被過濾,則將處理后內(nèi)容加入List?*/?
  • ????????????????????if?(!mIStdoutFilter.filter(line))?{?
  • ????????????????????????lineArray.add(mIStdoutFilter.handle());?
  • ????????????????????}?
  • ????????????????}?
  • ????????????????if?(br?!=?null)?{?
  • ????????????????????br.close();?
  • ????????????????}?
  • ????????????}?else?{?
  • ????????????????//?默認把流直接轉(zhuǎn)成字符串返回?
  • ????????????????lineArray.add(inputStream2Str(is));?
  • ????????????}?
  • ????????}?else?{?
  • ????????????//?默認把流直接轉(zhuǎn)成字符串返回?
  • ????????????lineArray.add(inputStream2Str(is));?
  • ????????}?
  • ????????if?(is?!=?null)?{?
  • ????????????is.close();?
  • ????????}?
  • ????}?
  • ?
  • ????/**?
  • ?????*?輸入流轉(zhuǎn)成字符串?
  • ?????*??
  • ?????*?@throws?IOException?
  • ?????*/?
  • ????public?String?inputStream2Str(InputStream?is)?throws?IOException?{?
  • ????????StringBuffer?out?=?new?StringBuffer();?
  • ????????byte[]?b?=?new?byte[4096];?
  • ????????for?(int?n;?(n?=?is.read(b))?!=?-1;)?{?
  • ????????????out.append(new?String(b,?0,?n));?
  • ????????}?
  • ????????return?out.toString();?
  • ????}?
  • ?
  • }?
  • 3)過濾器 IStdoutFilter.java
  • /**?標準輸出過濾接口?*/?
  • public?interface?IStdoutFilter<T>?{?
  • ?
  • ????/**?
  • ?????*?@brief?過濾操作?
  • ?????*?@param?stdout?
  • ?????*????????????標準輸出的內(nèi)容?
  • ?????*?@return?true:過濾;false:保留?
  • ?????*/?
  • ????boolean?filter(T?stdout);?
  • ?
  • ????/**?
  • ?????*?@brief?處理操作?
  • ?????*?@return?處理后的內(nèi)容?
  • ?????*/?
  • ????T?handle();?
  • ?
  • }?
  • AbstractLineFilter.java
  • /**?
  • ?*?@brief?抽象的行過濾器?
  • ?*?@details?以行的方式遍歷標準輸出,都進行一次過濾判斷?
  • ?*/?
  • public?abstract?class?AbstractLineFilter?implements?IStdoutFilter<String>?{?
  • ?
  • ????/**?行內(nèi)容?*/?
  • ????protected?String?line;?
  • ?
  • ????/**?
  • ?????*?@brief?行過濾操作?
  • ?????*?@param?line?
  • ?????*????????????標準輸出的某行內(nèi)容?
  • ?????*?@return?true:過濾;false:保留?
  • ?????*/?
  • ????protected?abstract?boolean?lineFilter(String?line);?
  • ?
  • ????@Override?
  • ????public?boolean?filter(String?stdout)?{?
  • ????????this.line?=?stdout;?
  • ????????return?lineFilter(stdout);?
  • ????}?
  • ?
  • ????@Override?
  • ????public?String?handle()?{?
  • ????????return?line;?//?默認返回原行?
  • ????}?
  • ?
  • }?
  • PsLineFilter.java(應(yīng)該加個單例==)
  • /**?
  • ?*?ps命令的行過濾及處理成pid的實現(xiàn)?
  • ?*/?
  • public?final?class?PsLineFilter?extends?AbstractLineFilter?{?
  • ?
  • ????@Override?
  • ????protected?boolean?lineFilter(String?line)?{?
  • ????????//?過濾空行及標題行?
  • ????????if?(null?==?line?||?"".endsWith(line)?||?line.startsWith("USER"))?{?
  • ????????????return?true;?
  • ????????}?
  • ????????return?false;?
  • ????}?
  • ?
  • ????@Override?
  • ????public?String?handle()?{?
  • ????????try?{?
  • ????????????return?line.trim().split("\\s+")[1];?//?獲取PID列?
  • ????????}?catch?(Exception?e)?{?//?null和越界異常?
  • ????????????return?line;?
  • ????????}?
  • ????}?
  • ?
  • }?
  • 三、后記 這個東西貌似還得動手改源碼么T^T。小弟告罄了,不想碰那個東西==。 附件工程,隨便看看了…… ps:Doxygen簡單生成了個chm幫助文件,在docs目錄下。

    我是不是很無聊了-_-!

    ?

    轉(zhuǎn)載于:https://blog.51cto.com/vaero/815264

    總結(jié)

    以上是生活随笔為你收集整理的Android VNC Server New的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。