iSpy 有一個 iSpyConnect 可以作為 iSpyServer 的 Android client 端. 雖然 iSpy 是 open source, 但是, android 的這一個 app 卻沒有 source code. 這裡記錄製作 Android 上 app 來連上 iSpyServer 的注意事項.
程式部份, 因為包含好幾個檔案, 在還沒有放到公開的伺服器之前, 沒有打算在網頁上貼原始碼, 視覺效果不好. 不過有興趣可以 mail 給我 :) 程式是可以正常動作的. 有圖有真相嘛, 貼上手機上的截圖. 這邊只說明程式需要那些組成, 以及 coding 的時候, 所需要注意的一些事項.
以及 iSpyServer 的截圖
程式基本組成
AndroidManifest.xml
URL
Socket
SurfaceView
Thread
Buffer management
AndroidManifest.xml
要加入網路存取的權限
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
URL
iSpyServer 提供的連線網址, 像是 http://192.168.1.150:80/?camid=1, 但是如果用 Android 的 HttpGet 是不能轉出 iSpyServer 所需要的
GET /camid=1 HTTP/1.1
Host: 192.168.1.150這樣的格式, 所以, 只好從 Socket 開始 coding.
另外, Android 不允許在程式的 UI Thread 中, 去做有關網路的存取, 因此, 這部份也必需另外以 Thread 實作.
SurfaceView
由於畫面更新的速度要求比較高, 因此必需實作 SurfaceView 的衍生類別, 在 SurfaceView 中, 再實作一個 Thread, 專職收取畫面, 並且更新.
Activity 的訊息傳遞
Activity 的 onPause/onResume 必須傳遞到 SurfaceView.
Receive Buffer 管理
socket 所收到的資料, 不會是剛好一張圖片, 因此, 必需先把收到的資料放到 buffer, 再到 buffer 中去剖析圖片資料. 如果是以 C++ 實作, 這部份的 overhead 比較小, 但是 Java 並沒有指標型態, 物件都需要透過記憶體傳遞. 這部份的實作效率會有很大的影響.