無影Android SDK是用於串連雲電腦、雲應用、雲手機的無影Android端開放介面。通過整合Android SDK,您可以根據業務需求快速定製和搭建Android用戶端。
1. 快速開始
1.1 擷取SDK和DEMO
擷取方式
本平台所有文檔、SDK、用戶端程式僅限於本人或本企業使用,未經阿里雲同意不會轉寄給第三方個人或企業。
Integration Environment要求
最低支援Android版本:5.1
以整合AAR包方式接入SDK
將下載得到的 aspengine-third-release.aar、aspengine-player-release.aar和wytrace-release.aar拷貝到app/libs目錄下。
在應用模組的build.gradle加入:
dependencies {
implementation fileTree(include: ['*.jar', '*.aar'], dir: 'libs')
// aspengine-sdk依賴的ini配置解析庫
implementation 'org.ini4j:ini4j:0.5.4'
// wytrace依賴的庫
implementation 'com.squareup.okhttp3:okhttp:5.0.0-alpha.8'
implementation 'com.google.code.gson:gson:2.10.1'
implementation 'io.github.aliyun-sls:aliyun-log-android-sdk:2.7.0@aar'
}AndroidManifest 聲明必要的許可權:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.VIBRATE"/>1.2 對接流程
1.3 最佳實務
方案詳見無影雲手機快速整合最佳實務。 雲手機整合的總體方案如下圖所示
有多種登入方式,擷取整合SDK所需要的串連雲手機Ticket憑證,流程圖為:
具體整合代碼可以參考生命週期介面的參考代碼。
2. 生命週期介面
2.1 初始化建立StreamView
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.activity_stream_view_demo);
mStreamView = findViewById(R.id.stream_view);
mStreamView.enableDesktopMode(false);
mStreamView.scaleStreamVideo(pref.getBoolean("fit_video_content", true) ?
mStreamView.ScaleType.FIT_STREAM_CONTENT : StreamView.ScaleType.FILL_STREAM_VIEW);
mStreamView.getASPEngineDelegate().setAlignStreamResolutionWithSurfaceSize(false);
}<?xml version="1.0" encoding="utf-8"?>
<android.widget.RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".StreamViewDemoActivity">
<com.aliyun.wuying.aspsdk.aspengine.ui.StreamView
android:id="@+id/stream_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:focusableInTouchMode="true"
android:focusable="true"
android:focusedByDefault="true" />
</android.widget.RelativeLayout>2.2 建立串連
mConfigs取值參考4.1 Config
mStreamView.start(mConfigs);2.3 中斷連線
mStreamView.stop();2.4 銷毀執行個體StreamView
mStreamView.dispose();
mStreamView = null;2.5 多StreamView模式
此模式支援一個串流在多個View之間無縫切換顯示。可按照如下步驟來實現:
參照2.1 定義並初始化StreamView
使用IAspEngine來建立串連,參數與4.1 Config定義一致
IASPEngine engine = mBuilder.enableRTC(true).build(context); //開啟資料統計 engine.enableStatistics(true, true); ConnectionConfig cc = new ConnectionConfig(); cc.id = CONFIG_DESKTOP_ID; cc.connectionTicket = CONFIG_CONNECTION_TICKET; cc.useVPC = CONFIG_USE_VPC; cc.type = OS_TYPE; cc.user = CONFIG_USER; cc.uuid = CONFIG_UUID; engine.start(cc);將StreamView與IAspEngine綁定(該介面會將串流在當前View進行渲染)
mStreamView.bindASPEngine(engine);恢複StreamView與IAspEngine綁定(該介面會讓View重新接管串流進行渲染)
mStreamView.resumeASPEngine();
更多細節請參考DEMO的實現。
2.6 回調說明
串連回調代理IASPEngineListener
代理介面說明:
介面 | 描述 |
onConnectionSuccess(int connectionId) | 串連雲手機成功回調,返回串連的標識 |
onConnectionFailure(int errorCode, String errorMsg) | 串連雲手機失敗回調,返回錯誤碼和錯誤資訊 |
onEngineError(int errorCode, String errorMsg) | SDK內部發生異常回調,返回錯誤碼和錯誤資訊 |
onDisconnected(int reason) | 雲手機串連被斷開,返回被斷開原因 |
onReconnect(int errorCode) | 雲手機串連發生重連動作,返回導致重連的錯誤碼 |
onFirstFrameRendered(long timeCostMS) | 雲手機顯示第一幀畫面回調,返回耗時情況 |
onPolicyUpdate(String policy) | 雲手機策略回調,返回策略配置 |
onSessionSuccess() | 雲手機串連會話建立成功回調 |
效能資料回調代理IStatisticsListener
代理介面說明:
介面 | 描述 |
onStatisticsInfoUpdate(StatisticsInfo statisticsInfo) | 雲手機效能資料回調,返回效能資料對象 |
申請系統許可權回調代理IRequestSystemPermissionListener
代理介面說明:
介面 | 描述 |
bool OnRequestSystemPermission(SystemPermission permission) | 申請系統許可權回調,返回申請系統權限類別型 |
註冊與反註冊回調程式碼範例:
//監聽串連回調
mStreamView.getASPEngineDelegate().registerASPEngineListener(IASPEngineListener var1);
mStreamView.getASPEngineDelegate().unregisterASPEngineListener(IASPEngineListener var1);
//監聽效能資料回調
mStreamView.getASPEngineDelegate().registerStatisticsListener(IStatisticsListener var1);
mStreamView.getASPEngineDelegate().unregisterStatisticsListener(IStatisticsListener var1);
//監聽申請系統許可權
mStreamView.registerSystemPermissionListener(IRequestSystemPermissionListener listener);
mStreamView.unregisterSystemPermissionListener(IRequestSystemPermissionListener listener);3. 業務介面
介面 | 說明 |
enableVDAgentCheck(boolean enabled) | 建連時是否強制檢查VDAgent的可用性,預設是進行檢查。 當該值設定為True時,若在建連時發現VDAgent不可用,則會報錯並斷開當前串連。 不建議設定為false,通常只有在進行內部調試時才會這麼做。 |
enableRTC(boolean enabled) | 設定是否使用RTC傳輸串流化資料內容,預設使用RTC傳輸串流化資料內容 |
enableDesktopMode(boolean enabled) | 設定是否以桌面圖案運行,設定為enabled後,會將所有Touch訊息轉換為Mouse事件向服務端發送。雲手機建議設定為false |
scaleStreamVideo(ScaleType scaleType) | 指定對流化映像內容進行相應的縮放處理,ScaleType取值參考枚舉類型5.1 ScaleType |
setVideoProfile(int width, int height, int fps, IRemoteResult result) | 設定視頻流的解析度及幀率,幀率暫不支援 |
boolean sendKeyEvent(KeyEvent event) 和 sendKeyboardEvent(KeyEvent event, IRemoteResult result) | 向雲上發送鍵盤按鍵訊息 |
boolean simulateMouseClick(boolean leftButton) | 類比向雲上發送滑鼠點擊事件,參數true表示類比滑鼠左鍵點擊事件,false表示類比滑鼠右鍵點擊事件 |
boolean enableMouseMode(boolean enabled) | 啟用或關閉滑鼠模式 |
boolean sendMouseEvent(MotionEvent motionEvent) 和 sendMouseEvent(MotionEvent motionEvent, IRemoteResult result) | 向雲上發送滑鼠按鍵訊息 |
reconnect(String connectionToken) | 發生串連異常斷開時,可通過該介面執行重連動作。 通常針對disconnect reason=2200執行該動作,應用程式需要通過OpenAPI重新擷取串連雲手機的token並交給重串連口執行重連動作。 |
boolean setMediaStreamPlayer(MediaStreamPlayer player) | 使用應用自訂的媒體引擎替換SDK中預設的媒體引擎實現,該方法只能在發起串流之前,或串流斷開之後調用。 |
void setAlignStreamResolutionWithSurfaceSize(boolean aligned) | 設定是否在串流開始時,自動將流解析度同步為端側用於渲染映像的SurfaceView的大小,預設開啟該功能。雲手機建議關閉。 |
void mute(boolean muted) | 設定是否進入靜音。 |
void enableStatistics(boolean enabled) | 是否開啟效能資料統計 |
mStreamView.getASPEngineDelegate().requestIFrame() | 請求主要畫面格 |
mStreamView.getASPEngineDelegate()下的 registerFileTransferListener(IFileTransferListener var1) 和 unregisterFileTransferListener(IFileTransferListener var1) 和 mStreamView.getASPEngineDelegate().uploadFiles(pathList, "/sdcard/Download/"); | 檔案上傳和下載,demo也有對應的實現 |
mStreamView.getASPEngineDelegate()下的 addDataChannel(DataChannel var1) 和 removeDataChannel(DataChannel var1) | 與鏡像接發自訂資料通道,demo也有對應的實現 |
mStreamView.getASPEngineDelegate()下的 addLyncChannel(LyncChannel var1) 和 removeLyncChannel(LyncChannel var1) | adb發送命令通道,實現參考demo裡的AspAdbUtil |
void setToQualityFirst() | 設定畫質優先模式,該模式下所支援的最高幀率為 30 FPS,最高畫質為優質。雲手機暫不支援。 |
void setToFpsFirst() | 設定流暢優先模式,該模式下所支援最高幀率為 60 FPS,最高畫質為良好。雲手機暫不支援。 |
void setToCustomPicture(int fps, int quality); | 使用者自訂模式,使用者可以自訂幀率和畫質。 參數 fps 值為 0 到 60 區間,代表幀率設定,值越高越流暢。 參數 quality 值為 0 到 4 區間,0:無損,1:優質 2:良好 3:一般 4:自動。雲手機暫不支援。 |
mStreamView.getASPEngineDelegate()下的 registerIMEListener、unregisterIMEListener、setImeType、enableRelativeMouse等 | 雲手機暫不支援。 |
4. 參數詳細說明
4.1 Config
建立串連的配置參數。
配置Key | 取值的類型 | 配置說明 |
StreamView.CONFIG_DESKTOP_ID | string | 執行個體ID,DescribeUserResources API返回的ResourceId。 |
StreamView.CONFIG_CONNECTION_TICKET | string | 串連鑒權Ticket,通過GetConnectionTicket API擷取。 |
StreamView.CONFIG_PREFER_RTC_TRANSPORT | boolean | 使用RTC通道,雲手機推薦true。 |
StreamView.CONFIG_ENABLE_VDAGENT_CHECK | boolean | 是否在建連過程中檢查VDAgent可用性,雲手機推薦true。 |
StreamView.CONFIG_ENABLE_STATISTICS | boolean | 是否啟用效能統計,若啟用,將在視頻流上額外呈現效能資料,雲手機推薦true。 |
OSType | string | 雲手機取值為android |
4.2 StatisticsInfo
效能資料
介面 | 類型 | 說明 |
mReceiveFps | int | 接收到的幀率 |
mRenderFps | int | 渲染幀率 |
mDownstreamBandwithMBPerSecond | double | 下行頻寬 |
mUpstreamBandwithMBPerSecond | double | 上行頻寬 |
mP2pFullLinkageLatencyMS | long | 端到端全鏈路時延,已廢棄 |
mNetworkLatencyMS | long | 網路rtt時延 |
mPingGatewayRttMS | long | ping rtt時延 |
mLostRate | double | 丟包率 |
mServerRenderLatencyMS | long | 雲側渲染延遲 |
mServerEncoderLatencyMS | long | 雲側編碼延遲 |
mServerTotalLatencyMS | long | 雲側總延遲 |
mTotalDownstreamBandwidth | long | 總頻寬 |
mGuestCpuUsage | long | 鏡像CPU使用率 |
mStreamType | String | 流協議類型 |
5. 枚舉類型
5.1 ScaleType
流化映像內容縮放處理類型。
名稱 | 含義 |
FILL_STREAM_VIEW | 總是將流化映像展開至與StreamView相同大小。當StreamView的長寬比例與流化映像長寬比例不相等時。採用該策略可能導致映像有明顯的變形 |
FIT_STREAM_CONTENT | 對StreamView的渲染地區進行調整,使得StreamView總是能以相同的長寬比例渲染流化映像內容。採用該策略時,流化映像可能無法填滿整個StreamView |
5.1 SystemPermission
系統權限類別型
名稱 | 含義 |
RECORDAUDIO | 請求錄音許可權 |
6. 自訂MediaStreamPlayer
若沒有自訂多媒體的訴求,可忽略,SDK有預設多媒體實現。
6.1 使用自訂媒體引擎處理媒體資料
通過實現com.aliyun.wuying.aspsdk.aspengine.MediaStreamPlayer,應用程式可使用自訂的媒體引擎處理串流媒體資料,這些資料主要包括:
視頻流資料 - 以H264/H265壓縮幀為主的視頻裸流
自適應圖片流資料 - 以位元影像為主的映像流
音頻下行資料 - 以Opus/PCM為主的音頻下行資料流
游標資料 - 啟用虛擬滑鼠模式時,應用程式可接收到游標映像及位置資料,應用程式可使用這些資料自行繪製虛擬游標
應用程式可以通過調用IASPEngine.setMediaStreamPlayer介面向無影SDK提供自訂的媒體引擎實現。
6.2 MediaStreamPlayer
MediaStreamPlayer是一個抽象類別,它要求應用程式實現全域的初始化/銷毀方法,並提供處理不同媒體資料的自訂實現:

其中:
IVideoStreamHandler介面定義了用於處理視頻流資料的方法
IAdaptiveGraphicStreamHandler介面定義了用於處理自適應圖片流資料的方法
IAudioPlaybackStreamHandler介面定義了用於處理音頻下行資料的方法
ICursorBitmap介面定義了用於處理游標資料的方法
應用程式可自行選擇實現上述介面中的一個或多個,無影SDK最終會根據應用程式提供的介面實現設定雲上下發流的類型,規則如下:
若應用程式同時提供了IVideoStreamHandler及IAdaptiveGraphicStreamHandler的實現,則串流被設定為混合模式,無影將根據當前使用的情境自動在自適應圖片流及視頻流之間進行切換
若應用程式僅提供IVideoStreamHandler的實現,則串流將被設定為Video stream only,此時服務端只會提供視頻流資料
若應用程式僅提供IAudioPlaybackStreamHandler的實現,則串流將被設定為Image stream only,此時服務端只會提供圖片流資料
應用程式可通過實現MediaStreamPlayer的一系列onCreateXXXHandler方法向SDK提供針對不同媒體資料的自訂實現:
@Override
protected IVideoStreamHandler onCreateVideoStreamHandler() {
return new VideoStreamHandler();
}
@Override
protected IAdaptiveGraphicStreamHandler onCreateAdaptiveGraphicStreamHandler() {
return null;
}
@Override
protected IAudioPlaybackStreamHandler onCreateAudioPlaybackStreamHandler() {
return new AudioPlaybackStreamHandler();
}
@Override
protected ICursorBitmapHandler onCreateCursorBitmapHandler() {
return null;
}在上面的例子中,自訂媒體引擎提供了IVideoStreamHandler及IAudioPlaybackStreamHandler的實現,onCreateXXXHandler方法在一次串流過程中只會被執行一次。
主要方法調用流程:
6.2.1 initialize
由應用程式實現該方法,可用於執行自訂媒體引擎相關的全域初始化動作。
該方法在每次串流過程中將被執行一次。
public ErrorCode initialize()傳回值:
類型 | 說明 |
ErrorCode | ErrorCode.OK表明執行初始化成功,否則表示初始化失敗 |
6.2.2 release
由應用程式實現該方法,可用於執行自訂媒體引擎相關的全域釋放動作。
該方法在每次串流過程中將被執行一次。
public ErrorCode release()傳回值:
類型 | 說明 |
ErrorCode | ErrorCode.OK表明執行釋放成功,否則表示釋放失敗 |
6.2.3 enableStatistics
由應用程式實現該方法,可用於啟用/關閉效能統計資料擷取。
public void enableStatistics(boolean enabled)參數:
參數 | 類型 | 說明 |
enabled | boolean | True表明開啟效能資料採集。 False關閉效能資料採集。 |
6.2.4 onCreateVideoStreamHandler
由應用程式實現該方法,用於向SDK提供處理視頻流資料的媒體引擎實現。
該方法在每次串流過程中將被執行一次。
public IVideoStreamHandler onCreateVideoStreamHandler()傳回值:
類型 | 說明 |
IVideoStreamHandler | 由應用程式提供的用於處理視頻流資料的媒體引擎實現。 若應用不提供視頻流處理實現,則返回null,在這種情況下視頻流資料不會得到任何處理。 |
6.2.5 onCreateAdaptiveGraphicStreamHandler
由應用程式實現該方法,用於向SDK提供處理自適應圖片流資料的媒體引擎實現。
該方法在每次串流過程中將被執行一次。
public IAdaptiveGraphicStreamHandler onCreatAdaptiveGraphicStreamHandler()傳回值:
類型 | 說明 |
IAdaptiveGraphicStreamHandler | 由應用程式提供的用於處理自適應圖片流資料的媒體引擎實現。 若應用不提供自適應圖片流處理實現,則返回null,在這種情況下,圖片流資料不會得到任何處理。 |
6.2.6 onCreateAudioPlaybackStreamHandler
由應用程式實現該方法,用於向SDK提供處理音頻下行資料的媒體引擎實現。
該方法在每次串流過程中將被執行一次。
public IAudioPlaybackStreamHandler onCreatAudioPlaybackStreamHandler()傳回值:
類型 | 說明 |
IAudioPlaybackStreamHandler | 由應用程式提供的用於處理音頻下行資料的媒體引擎實現。 若應用不提供音頻下行資料處理實現,則返回null,在這種情況下音頻下行資料不會得到任何處理。 |
6.2.7 onCreateCursorBitmapHandler
由應用程式實現該方法,用於向SDK提供處理游標資料的媒體引擎實現。
該方法在每次串流過程中將被執行一次。
通過該方法提供的介面實現僅在虛擬滑鼠模式啟用時被使用。
public ICursorBitmapHandler onCreatCursorBitmapHandler()傳回值:
類型 | 說明 |
ICursorBitmapHandler | 由應用程式提供的用於處理游標資料的媒體引擎實現。 若應用不提供游標資料處理實現,則返回null,在這種情況下,即使虛擬滑鼠模式被啟用,游標位置資料也不會得到任何處理。 |
6.3 IVideoStreamHandler
該介面定義了處理視頻流資料的主要方法,其主要工作流程如下:
當應用發生前後台切換時,用於渲染的Surface將被銷毀或重建,在這種情況下,IVideoStreamHandler.setVideoSurface將被多次調用,當Surface被銷毀時,通過setVideoSurface傳入的surface對象為null,應用程式需要處理好decoder及render的容錯工作。
應用程式通過實現IVideoStreamHandler.setEventHandler方法可擷取無影SDK提供的事件處理介面,通過該介面,應用程式可以將自訂媒體引擎內的一些視頻處理事件通知給無影SDK內部,目前主要用於效能資料統計:
@Override
public void setEventHandler(EventHandler handler) {
Log.i(TAG, "setEventHandler handler " + handler);
VideoStreamEventHandler.getInstance().reset(handler);
}
...
public synchronized void onVideoFrameRendered() {
VFrame frame = mVideoFrame.remove();
if (mEnabled && mHandler != null) {
Event event = new Event();
event.type = EventType.RENDER_PERF_INFO;
event.decodePerfInfo = new VDecodePerfInfo();
event.renderPerfInfo = new VRenderPerfInfo();
event.renderPerfInfo.frameId = frame.frameId;
event.renderPerfInfo.sessionId = frame.sessionId;
// 通知無影SDK一幀視頻映像完成渲染,SDK內部根據frameId計算端側全鏈路時延
mHandler.callback(event);
}
}6.3.1 setEventHandler
由應用程式實現該方法,當自訂媒體引擎被無影SDK載入時,SDK通過該方法嚮應用程式提供EventHandler,應用程式可通過該handler發送視頻流處理事件。
public void setEventHandler(EventHandler handler)參數:
參數 | 類型 | 說明 |
handler | EventHandler | 由無影SDK提供的handler對象,應用程式通過該對象向SDK發送視頻流處理事件 |
6.3.2 addVideoTrack
由應用程式實現該方法,當一路視頻流建立時,通過該方法通知應用程式。
目前一次串流過程中最多隻存在一路視頻。
ErrorCode addVideoTrack(int trackId, VProfile profile);參數:
參數 | 類型 | 說明 |
trackId | int | 視頻流Id |
profile | VProfile | 視頻流資訊 |
傳回值:
類型 | 說明 |
ErrorCode | ErrorCode.OK表明執行成功,否則表示失敗 |
6.3.3 setVideoSurface
由應用程式實現該方法,當用於渲染視頻的Surface狀態發生變化時,通過該方法通知應用程式。
ErrorCode setVideoSurface(int trackId, Surface surface);參數:
參數 | 類型 | 說明 |
trackId | int | 視頻流Id |
surface | android.view.Surface | 用於渲染視頻的Surface對象。 當應用程式切換到後台或發生鎖屏動作時,該對象可能為null |
傳回值:
類型 | 說明 |
ErrorCode | ErrorCode.OK表明執行成功,否則表示失敗 |
6.3.4 playVideo
由應用程式實現該方法,當用視頻流準備就緒時,通過該方法通知應用程式。
ErrorCode playVideo(int trackId);參數:
參數 | 類型 | 說明 |
trackId | int | 視頻流Id |
傳回值:
類型 | 說明 |
ErrorCode | ErrorCode.OK表明執行成功,否則表示失敗 |
6.3.5 removeVideoTrack
由應用程式實現該方法,當視頻流被銷毀時,通過該方法通知應用程式。
ErrorCode removeVideoTrack(int trackId);參數:
參數 | 類型 | 說明 |
trackId | int | 視頻流Id |
傳回值:
類型 | 說明 |
ErrorCode | ErrorCode.OK表明執行成功,否則表示失敗 |
6.3.6 pushVideoFrame
由應用程式實現該方法,當用於接收到新的視訊框架時,通過該方法通知應用程式。
ErrorCode setVideoSurface(int trackId, Surface surface);參數:
參數 | 類型 | 說明 |
trackId | int | 視頻流Id |
frame | VFrame | 新接收到的視訊框架資訊 |
傳回值:
類型 | 說明 |
ErrorCode | ErrorCode.OK表明執行成功,否則表示失敗 |
6.3.7 getVideoTracks
由應用程式實現該方法,SDK通過該方法從應用程式擷取當前正在處理所有視頻流資訊。
HashMap<Integer, VProfile> getVideoTracks();傳回值:
類型 | 說明 |
HashMap<Integer, VProfile> | 應用程式擷取當前正在處理所有視頻流資訊 |
6.3.8 release
由應用程式實現該方法,當所有的視頻流被銷毀時,通過該方法通知應用程式執行清理動作。
ErrorCode release();傳回值:
類型 | 說明 |
ErrorCode | ErrorCode.OK表明執行成功,否則表示失敗 |
6.4 IAudioPlaybackStreamHandler
該介面定義了處理音頻流資料的主要方法,其主要工作流程如下:
6.4.1 initAudio
由應用程式實現該方法,當SDK內的音頻通道建立時,通過該方法通知應用程式。
ErrorCode initAudio();傳回值:
類型 | 說明 |
ErrorCode | ErrorCode.OK表明執行成功,否則表示失敗 |
6.4.2 deInitAudio
由應用程式實現該方法,當SDK內的音頻通道被銷毀時,通過該方法通知應用程式。
ErrorCode deInitAudio();傳回值:
類型 | 說明 |
ErrorCode | ErrorCode.OK表明執行成功,否則表示失敗 |
6.4.3 startAudioPlayback
由應用程式實現該方法,當雲手機將要開始下發音頻流時,通過該方法通知應用程式。
ErrorCode startAudioPlayback();傳回值:
類型 | 說明 |
ErrorCode | ErrorCode.OK表明執行成功,否則表示失敗 |
6.4.4 stopAudioPlayback
由應用程式實現該方法,當雲手機停止下發音頻流時,通過該方法通知應用程式。
ErrorCode stopAudioPlayback();傳回值:
類型 | 說明 |
ErrorCode | ErrorCode.OK表明執行成功,否則表示失敗 |
6.4.5 pushAudioPlaybackFrame
由應用程式實現該方法,當接收到新的下行音訊框架時,通過該方法通知應用程式。
ErrorCode pushAudioPlaybackFrame(AFrame pbData);參數:
參數 | 類型 | 說明 |
pbData | AFrame | 新接收到的音訊框架資訊 |
傳回值:
類型 | 說明 |
ErrorCode | ErrorCode.OK表明執行成功,否則表示失敗 |
6.4.6 updateAudioPlaybackVol
由應用程式實現該方法,當雲手機裡的系統音量大小發生變化時,通過該方法通知應用程式。
ErrorCode updateAudioPlaybackVol(int volume);參數:
參數 | 類型 | 說明 |
volume | int | 雲手機裡的系統音量值,最大值為USHRT_MAX,0表示靜音。 |
傳回值:
類型 | 說明 |
ErrorCode | ErrorCode.OK表明執行成功,否則表示失敗 |
6.4.7 updateAudioPlaybackMute
由應用程式實現該方法,當雲手機被靜音/解除靜音時,通過該方法通知應用程式。
ErrorCode updateAudioPlaybackMute(int mute);參數:
參數 | 類型 | 說明 |
mute | int | 1表示雲手機進入靜音狀態,0表示解除靜音 |
傳回值:
類型 | 說明 |
ErrorCode | ErrorCode.OK表明執行成功,否則表示失敗 |
6.4.8 release
由應用程式實現該方法,當音頻通道被銷毀時,通過該方法通知應用程式執行清理動作。
ErrorCode release();傳回值:
類型 | 說明 |
ErrorCode | ErrorCode.OK表明執行成功,否則表示失敗 |
6.5 IAdaptiveGraphicStreamHandler
該介面定義了處理映像流資料的主要方法,其主要工作流程如下:
目前應用程式擷取到的圖片框架格式為位元影像ARGB8888。
一次串流過程中最多存在一個圖片流。
6.5.1 setAdaptiveGraphicSurface
由應用程式實現該方法,當用於渲染圖片的Surface狀態發生變化時,通過該方法通知應用程式
ErrorCode setAdaptiveGraphicSurface(Surface surface);參數:
參數 | 類型 | 說明 |
surface | android.view.Surface | 用於渲染圖片的Surface對象。 當應用程式切換到後台或發生鎖屏動作時,該對象可能為null |
傳回值:
類型 | 說明 |
ErrorCode | ErrorCode.OK表明執行成功,否則表示失敗 |
6.5.2 invalidateAdaptiveGraphicSurface
由應用程式實現該方法,當用於接收到新的圖片幀資料時,通過該方法通知應用程式
ErrorCode invalidateAdaptiveGraphicSurface(Region region, byte[] buffer, BitmapFormat format);參數:
參數 | 類型 | 說明 |
region | Region | 圖片幀繪製地區資訊 |
buffer | byte[] | 圖片幀資料 |
format | BitmapFormat | 圖片框架格式資訊,預設為ARGB8888 |
傳回值:
類型 | 說明 |
ErrorCode | ErrorCode.OK表明執行成功,否則表示失敗 |
6.5.3 release
由應用程式實現該方法,當圖片流被銷毀時,通過該方法通知應用程式執行清理動作。
ErrorCode release();傳回值:
類型 | 說明 |
ErrorCode | ErrorCode.OK表明執行成功,否則表示失敗 |
6.6 ICursorBitmapHandler
該介面定義了處理游標資料的主要方法,在虛擬滑鼠模式啟用時,應用程式向SDK提供該介面的實現用於游標映像的繪製,其主要工作流程如下:
6.6.1 setCursorBitmap
由應用程式實現該方法,當雲手機裡的游標形狀發生變化時,通過該方法通知應用程式。
ErrorCode setCursorBitmap(CursorBitmap bitmap);參數:
參數 | 類型 | 說明 |
bitmap | CursorBitmap | 雲手機游標圖形資料 |
傳回值:
類型 | 說明 |
ErrorCode | ErrorCode.OK表明執行成功,否則表示失敗 |
6.6.2 unsetCursorBitmap
由應用程式實現該方法,當雲手機裡的游標被隱藏時,通過該方法通知應用程式。
ErrorCode unsetCursorBitmap();傳回值:
類型 | 說明 |
ErrorCode | ErrorCode.OK表明執行成功,否則表示失敗 |
6.6.3 setCursorPosition
由應用程式實現該方法,當雲手機裡的游標形狀生變化時,通過該方法通知應用程式。
ErrorCode setCursorPosition(float x, float y);參數:
參數 | 類型 | 說明 |
x | float | 游標的X座標 |
y | float | 游標的Y座標 |
傳回值:
類型 | 說明 |
ErrorCode | ErrorCode.OK表明執行成功,否則表示失敗 |
6.6.4 release
由應用程式實現該方法,當串連斷開,取消游標顯示時,通過該方法通知應用程式執行清理動作。
ErrorCode release();傳回值:
類型 | 說明 |
ErrorCode | ErrorCode.OK表明執行成功,否則表示失敗 |
7. 錯誤碼
錯誤碼 | 錯誤訊息( | 定義模組 | 原因 |
2~26主要是網路相關問題 | |||
2 | 串連%s失敗 | ASP SDK | 無效MAGIC |
3 | 串連%s失敗 | ASP SDK | 資料有誤 |
4 | 用戶端與服務端版本不匹配 | ASP SDK | 版本不匹配 |
5 | 串連需要 TLS | ASP SDK | 需要TLS |
6 | 串連不需要 TLS | ASP SDK | 不需要TLS而實際使用了TLS |
7 | 您沒有許可權串連當前%s | ASP SDK | 許可權問題 |
8 | ASP SDK | 遷移過程中client ID無效 | |
9 | 串連%s失敗 | ASP SDK | channel不存在 |
20 | 串連ASP伺服器失敗。 | ASP SDK | channel 串連錯誤 |
21 | TLS認證出錯了 | ASP SDK | TLS 認證錯誤 |
22 | 串連%s失敗 | ASP SDK | channel link 錯誤 |
23 | 串連%s失敗 | ASP SDK | 串連認證錯誤 |
24 | 串連%s失敗 | ASP SDK | 串連IO錯誤 |
25 | 串連%s失敗 | ASP SDK | Ticket校正失敗。使用者串連被斷開後,若使用同一個Ticket再次請求建連,也將觸發此錯誤。 |
26 | ASP SDK | xquic 握手失敗 | |
串連中斷開或遇到某些錯誤的情況 | |||
2000 | 擷取%s資料逾時,與服務端中斷連線 | ASP SDK | 正常斷開 |
2001 | %s已與服務端中斷連線。可能是因為%s進程已被強制終止。 | ASP SDK | 一般是端上應用被終止進程了,如Android應用使用者通過按下Home鍵終止 |
2002 | 已有使用者從其他終端串連當前%s。請稍後重試。 | ASP SDK | 其他人搶佔了端 |
2003 | %s正在關機或重啟,一般由管理員操作,請稍後重試。 | ASP SDK | 雲手機被關機或重啟,一般是管理員操作 |
2004 | 目前使用者串連被斷開。 | ASP SDK | 用戶端發起斷流,或服務端發起踢人或斷流 |
2005 | %s已逾時中斷連線,因為已達到管理員設定的使用時間長度限制。 | ASP SDK | 管理員設定使用時間長度被關 |
2010 | 串連%s失敗 | ASP SDK | Vdagent串連失敗 |
2011 | 串連參數傳遞錯誤。 | ASP SDK | 串連server參數傳遞錯誤 |
2027 | 拉流模式已切換。 | ASP SDK | 拉流模式由搶佔模式切換為協同模式,或由協同模式切換為搶佔模式 |
2100 | 剪下板許可權,禁止從%s到本地 | ASP SDK | 剪貼簿許可權,禁止從VM到本地 |
2101 | 剪下板許可權,禁止從本地到%s | ASP SDK | 剪貼簿許可權,禁止從本地到 VM |
2200 | %s正在嘗試重連... | ASP SDK | 因為網路問題斷開了,ASP SDK正在重連 |
2201 | 您的裝置出現網路異常,導致%s已中斷連線。 | ASP SDK | 因為網路問題斷開了,ASP SDK因為鏡像原因不支援重連,應用側開始重連 |
2202 | %s重連逾時,請檢查裝置網路後重試。 | ASP SDK | ASP SDK重連逾時 |
端側邏輯錯誤 | |||
5100 | %s串連ASP Server逾時,請稍後重試。 | 應用側 | 端側在一段時間內未接收到connected事件 |
5102 | 擷取%s資料逾時,請稍後重試。 | 應用側 | 端側在一段時間內接收到了connected但未接收到display事件 |
5004 | 用戶端出現錯誤,請重新開啟 | 應用側 | 傳入端側啟動參數有誤,一般出現在開發階段 |
5200 | 用戶端重連逾時,請稍後重試。 | 應用側 | |
8. 常見問題
怎麼重啟雲手機
調用管控重啟API 重啟執行個體 進行重啟,調用重啟API後,端側串連的雲手機會斷開,重啟完成後,端側再串連雲手機。
對外Maven
暫不支援,客戶有需要使用,可以將SDK的aar庫上傳自己的Maven倉庫進行使用。
常用ADB命令
功能 | 命令 |
返回鍵 | input keyevent KEYCODE_BACK |
Home鍵 | input keyevent KEYCODE_HOME |
切換鍵 | input keyevent KEYCODE_APP_SWITCH |
靜音 | input keyevent 164 |
音量增大 | input keyevent KEYCODE_VOLUME_UP |
音量減小 | input keyevent KEYCODE_VOLUME_DOWN |
隱藏導覽列 | setprop persist.wy.hasnavibar false; killall com.android.systemui |
顯示導覽列 | setprop persist.wy.hasnavibar true; killall com.android.systemui |
截圖 | screencap -p /sdcard/Download/abc.png |