Alibaba Cloud Workspace SDK for Android は、Android クライアントからクラウドコンピュータ、クラウドアプリ、クラウドフォンに接続するためのオープンインターフェイスを提供します。 SDK を統合することで、ビジネスニーズに合わせてカスタマイズされた Android クライアントを効率的にカスタマイズおよびデプロイできます。
1. クイックスタート
1.1 SDK とデモを入手する
方法
AndroidSDK_aar をダウンロードします。
AndroidSDK_demo をダウンロードします。
ドキュメント、SDK、クライアントプログラムを含むすべてのプラットフォームリソースは、お客様または組織の内部使用に限定されます。 Alibaba Cloud からの事前の書面による同意なしに、第三者または他の組織と不正に共有することは禁止されています。
環境要件
Android バージョン: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 ベストプラクティス
実装の詳細については、「クラウドフォン統合のベストプラクraクティス」をご参照ください。次の図は、クラウドフォン統合プロセスの概要です。
SDK 統合に必要なクラウドフォンへのアクセス用のチケット認証情報を取得するために、複数のログイン方法がサポートされています。次のフローチャートをご参照ください。
統合コードのサンプルについては、「ライフサイクルインターフェイス」セクションをご参照ください。
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 設定」をご参照ください。
mStreamView.start(mConfigs);2.3 セッションから切断する
mStreamView.stop();2.4 StreamView インスタンスを破棄する
mStreamView.dispose();
mStreamView = null;2.5 Multi-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);IAspEngineをStreamViewインスタンスにバインドします。この呼び出しにより、指定されたViewでストリームのレンダリングが開始されます。mStreamView.bindASPEngine(engine);表示を切り替えるには、
IAspEngineを別のStreamViewインスタンスにバインドします。これにより、新しいViewがストリームのレンダリングを引き継ぐことができます。mStreamView.resumeASPEngine();
完全な実装については、提供されているデモアプリケーションをご参照ください。
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 です。 値を true に設定すると、接続中に VDAgent が利用できない場合、エラーが報告され、接続が終了します。 内部デバッグ目的でない限り、値を false に設定しないでください。 |
enableRTC(boolean enabled) | ストリーミングデータ転送にリアルタイムコミュニケーション (RTC) を使用するかどうかを指定します。デフォルトでは、RTC が使用されます。 |
enableDesktopMode(boolean enabled) | デスクトップモードで実行するかどうかを指定します。デスクトップモードが有効な場合、すべてのタッチイベントはマウスイベントに変換されてサーバーに送信されます。クラウドフォンでは、この値を false に設定することを推奨します。 |
scaleStreamVideo(ScaleType scaleType) | ストリーミングビデオコンテンツのスケーリング動作を指定します。「5.1 列挙型」で有効な値を参照してください。 |
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) | 異常切断後に再接続します。 ほとんどの場合、このメソッドを呼び出して「切断理由=2200」エラーを処理できます。アプリケーションは API 操作を呼び出して接続トークンを取得し、クラウドフォンに再接続する必要があります。 |
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/"); | ファイルをアップロードまたはダウンロードします。これもデモに実装されています。 |
mStreamView.getASPEngineDelegate() の下: addDataChannel(DataChannel var1) および removeDataChannel(DataChannel var1) | 画像がカスタムデータを受信するためのチャネルを指定します。これもデモに実装されています。 |
mStreamView.getASPEngineDelegate() の下: addLyncChannel(LyncChannel var1) および removeLyncChannel(LyncChannel var1) | ADB コマンドを送信するためのチャネルを指定します。実装については、デモの「AspAdbUtil」を参照してください。 |
void setToQualityFirst() | 高画質と最大 30 fps のフレームレートを提供できる画質優先モードを構成します。この機能は現在、クラウドフォンではサポートされていません。 |
void setToFpsFirst() | 中画質と最大 60 fps のフレームレートを提供できる滑らかさ優先モードを構成します。この機能は現在、クラウドフォンではサポートされていません。 |
void setToCustomPicture(int fps, int quality); | カスタムフレームレートと画質を許可するカスタムモードを構成します。 この機能は、現在クラウドフォンではサポートされていません。 quality の有効な値: 0~4。0: 無損失。1: 高。2: 中。3: 標準。4: 自動。この機能は、現在クラウドフォンではサポートされていません。 |
mStreamView.getASPEngineDelegate() の下: registerIMEListener、unregisterIMEListener、setImeType、enableRelativeMouse など | この機能は現在、クラウドフォンではサポートされていません。 |
4. パラメーター
4.1 Config
次の表に、接続を確立するために必要なパラメーターを示します。
パラメーター | 型 | 説明 |
StreamView.CONFIG_DESKTOP_ID | 文字列 | インスタンス ID。DescribeUserResources によって返される ResourceId の値です。 |
StreamView.CONFIG_CONNECTION_TICKET | 文字列 | 接続認証チケット。GetConnectionTicket を使用して取得します。 |
StreamView.CONFIG_PREFER_RTC_TRANSPORT | ブール値 | RTC チャンネルを有効にします。クラウドフォンでは、この値を true に設定することを推奨します。 |
StreamView.CONFIG_ENABLE_VDAGENT_CHECK | ブール値 | クラウドフォンに接続する際に VDAgent の可用性をチェックするかどうかを指定します。クラウドフォンでは、この値を true に設定することを推奨します。 |
StreamView.CONFIG_ENABLE_STATISTICS | ブール値 | パフォーマンス統計をレポートするかどうかを指定します。パフォーマンス統計がレポートされる場合、追加のパフォーマンスデータがビデオストリームで提供されます。クラウドフォンでは、この値を true に設定することを推奨します。 |
OSType | 文字列 | OS タイプを指定します。クラウドフォンの場合、この値を 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 インスタンスの表示領域全体を埋め尽くさない場合があります。 |
5.1 SystemPermission
次の表に、システム権限タイプを示します。
パラメータ | 説明 |
RECORDAUDIO | 録音権限をリクエストします。 |
6. MediaStreamPlayer のカスタマイズ
カスタムマルチメディア要件がない場合は、SDK にデフォルトのマルチメディア実装が含まれているため、これを無視できます。
6.1 カスタムメディアエンジンでメディアデータを処理する
com.aliyun.wuying.aspsdk.aspengine.MediaStreamPlayer を実装することで、アプリはカスタムメディアエンジンを使用してストリーミングメディアデータを処理できます。これには主に以下が含まれます。
ビデオストリームデータ:主に H.264/H.265 圧縮フレームで構成される生のビデオストリーム。
適応型グラフィックストリームデータ:主にビットマップで構成されるグラフィックストリーム。
オーディオダウンストリームデータ:主に Opus/PCM 形式のオーディオダウンストリームストリーム。
カーソルデータ:仮想マウスモードが有効になっている場合、アプリはカーソルイメージと位置データを受信できるため、仮想カーソルを個別にレンダリングできます。
アプリは、IASPEngine.setMediaStreamPlayer インターフェイスを使用して、Alibaba Cloud Workspace SDK にカスタムメディアエンジンを実装できます。
6.2 MediaStreamPlayer
MediaStreamPlayer は、アプリがグローバルな初期化とクリーンアップメソッドを実装する必要がある抽象クラスです。また、さまざまなタイプのメディアデータを処理するためのカスタム実装も提供します。

このうち:
IVideoStreamHandler は、ビデオストリームデータを処理するためのメソッドを提供します。
IAdaptiveGraphicStreamHandler は、アダプティブグラフィックストリームデータを処理するためのメソッドを提供します。
IAudioPlaybackStreamHandler は、オーディオ再生データを処理するためのメソッドを提供します。
ICursorBitmap は、カーソルデータを処理するためのメソッドを提供します。
アプリは、上記のインターフェイスを 1 つ以上実装できます。実装されたインターフェイスに基づいて、Alibaba Cloud Workspace SDK は、以下のルールに従って使用するクラウドストリーミングのタイプを決定します。
アプリが IVideoStreamHandler と IAdaptiveGraphicStreamHandler の両方を実装する場合、ストリーミングモードは「混合」に設定されます。この場合、Alibaba Cloud Workspace は現在のシナリオに基づいて、適応型グラフィックストリーミングとビデオストリーミングを自動的に切り替えます。
アプリが IVideoStreamHandler のみを実装している場合、ストリーミングモードは「ビデオストリームのみ」に設定され、サーバーはビデオストリームデータのみを送信します。
アプリが IAudioPlaybackStreamHandler のみを実装している場合、ストリーミングモードはイメージストリームのみに設定されます。つまり、サーバーはイメージストリームデータのみを送信します。
アプリケーションは、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 メソッドは、ストリーミングセッション中に 1 回だけ実行されます。
主要メソッドの呼び出しプロセス:
6.2.1 initialize
このメソッドはアプリによって実装され、カスタムメディアエンジンに関連するグローバル初期化タスクを実行するために使用できます。
このメソッドは、各ストリーミングプロセスで一度実行されます。
public ErrorCode initialize()戻り値:
型 | 説明 |
ErrorCode | 初期化が成功した場合は ErrorCode.OK を返します。それ以外の場合は、初期化は失敗しました。 |
6.2.2 リリース
このメソッドはアプリによって実装され、カスタムメディアエンジンに関連するグローバル リリース タスクを実行するために使用できます。
このメソッドは、各ストリーミングプロセスで一度実行されます。
public ErrorCode release() // 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 になります。アプリは、デコーダーとレンダリングプロセスのフォールトトレランスを適切に処理する必要があります。
Alibaba Cloud Workspace SDK が提供するイベント処理インターフェイスは、IVideoStreamHandler.setEventHandler メソッドを実装することでアプリで取得できます。 このインターフェイスを介して、アプリはカスタムメディアエンジンからの特定のビデオ処理イベントを 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 は、フレーム ID に基づいてクライアント側でエンドツーエンドの待機時間を計算します。
mHandler.callback(event);
}
}6.3.1 setEventHandler
このメソッドはアプリによって実装されます。Alibaba Cloud Workspace SDK によってカスタムメディアエンジンがロードされると、SDK はこのメソッドを使用してアプリにイベントハンドラを提供します。アプリはこのハンドラを使用して、ビデオストリーム処理イベントを送信できます。
public void setEventHandler(EventHandler handler) // SDK から提供されるハンドラ。アプリは、このハンドラを使用して SDK にビデオストリーム処理イベントを送信できます。パラメータ:
パラメータ | タイプ | 説明 |
handler | EventHandler | SDK によって提供されるハンドラ。アプリはこのハンドラを使用して、ビデオストリーム処理イベントを SDK に送信できます。 |
6.3.2 addVideoTrack
このメソッドはアプリによって実装されます。ビデオストリームが作成されたときにアプリに通知します。
現在、1回のストリーミングセッション中に存在できるビデオストリームは1つだけです。
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 リリース
このメソッドはアプリによって実装されます。 SDK は、すべてのビデオ ストリームが破棄されたときにクリーンアップ操作を実行するようにアプリに通知するために、このメソッドを使用します。
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 | 実行が成功した場合は 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); // ErrorCode updateAudioPlaybackVol(int ボリューム);パラメータ:
パラメータ | 型 | 説明 |
volume | int | クラウドフォンのシステム音量。有効な値: 0 ~ USHRT_MAX。0 は、クラウドフォンがミュート状態であることを示します。 |
戻り値:
型 | 説明 |
ErrorCode | 実行に成功した場合は ErrorCode.OK を返します。それ以外の場合は、実行に失敗しました。 |
6.4.7 updateAudioPlaybackMute
このメソッドはアプリによって実装されます。クラウドフォンがミュートまたはミュート解除されると、このメソッドを介してアプリに通知されます。
ErrorCode updateAudioPlaybackMute(int mute);パラメータ:
パラメータ | 型 | 説明 |
mute | int | クラウドフォンをミュートするかどうかを指定します。有効な値: 1 と 0 。 1 はクラウドフォンがミュートされていることを示し、 0 はクラウドフォンがミュート解除されていることを示します。 |
戻り値:
型 | 説明 |
ErrorCode | 実行が成功した場合は ErrorCode.OK を返します。それ以外の場合は、実行は失敗しました。 |
6.4.8 release
このメソッドはアプリによって実装されます。SDK は、オーディオ チャンネルが破棄されたときにクリーンアップ 操作を実行するようにアプリに通知するためにこれを使用します。
ErrorCode release(); // ErrorCode を返します戻り値:
型 | 説明 |
ErrorCode | 実行に成功した場合は ErrorCode.OK を返します。それ以外の場合は、実行は 失敗しました。 |
6.5 IAdaptiveGraphicStreamHandler
このインターフェイスは、イメージストリームデータを扱うための主要なメソッドを定義し、その主なワークフローは次のとおりです:
アプリで取得される画像フレームの現在のフォーマットは、Bitmap ARGB8888 です。
ストリーミング処理中は、一度に 1 つのイメージ ストリームのみが存在します。
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 リリース
このメソッドはアプリによって実装されます。 SDK は、すべてのアダプティブ グラフィック ストリームが破棄されたときにクリーンアップ操作を実行するようにアプリに通知するために、このメソッドを使用します。
ErrorCode release(); // ErrorCode を返します戻り値:
型 | 説明 |
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 リリース
このメソッドはアプリによって実装されます。SDK はこれを使用して、接続が切断され、カーソル表示がキャンセルされたときにクリーンアップ操作を実行するようにアプリに通知します。
ErrorCode release(); // ErrorCode を解放します戻り値:
種類 | 説明 |
ErrorCode | 実行が成功した場合は ErrorCode.OK を返します。それ以外の場合は、実行は失敗しました。 |
7. エラーコード
エラーコード | エラーメッセージ( | 定義済みモジュール | 原因 |
コード 2 ~ 26 は、主にネットワークの問題に関連しています。 | |||
2 | %s への接続に失敗しました。 | ASP SDK | 無効な MAGIC です。 |
3 | %s への接続に失敗しました。 | ASP SDK | 不正なデータです。 |
4 | クライアントバージョンがサーバーバージョンと一致しません。 | ASP SDK | バージョンが一致しません。 |
5 | 接続には Transport Layer Security ( TLS ) が必要です。 | ASP SDK | TLS が必要です。 |
6 | 接続に TLS は必要ありません。 | ASP SDK | TLS が適用されています。 |
7 | %s に接続する権限がありません。 | ASP SDK | 権限の問題です。 |
8 | ASP SDK | 移行中に無効なクライアント ID です。 | |
9 | %s への接続に失敗しました。 | ASP SDK | チャネルが見つかりません。 |
20 | ASP サーバーへの接続に失敗しました。 | ASP SDK | チャネル接続エラーです。 |
21 | TLS 認証エラーです。 | ASP SDK | TLS 認証に失敗しました。 |
22 | %s への接続に失敗しました。 | ASP SDK | チャネルリンクエラーです。 |
23 | %s への接続に失敗しました。 | ASP SDK | 接続認証エラーです。 |
24 | %s への接続に失敗しました。 | ASP SDK | 接続 I/O エラーです。 |
25 | %s への接続に失敗しました。 | ASP SDK | チケットの検証に失敗しました。このエラーは、前のセッションが切断された後、同じチケットを使用して新しい接続を要求した場合にもトリガーされます。 |
26 | ASP SDK | Xquic ハンドシェイクの失敗です。 | |
接続が中断された場合、またはエラーが発生した場合 | |||
2000 | %s のデータ取得がタイムアウトしたため、サーバーへの接続に失敗しました。 | ASP SDK | 通常の切断です。 |
2001 | %s プロセスが強制的に一時停止されたため、%s をサーバーに接続できませんでした。 | ASP SDK | この問題は通常、クライアントアプリが終了したときに発生します(たとえば、Android アプリがホームボタンでユーザーによって閉じられた場合)。 |
2002 | 別のユーザーが別の端末から現在の %s に接続しました。 後ほどもう一度お試しください。 | ASP SDK | インスタンスは別のユーザーに引き継がれました。 |
2003 | %s はシャットダウンまたは再起動中です(通常は管理者によって開始されます)。 後ほどもう一度お試しください。 | ASP SDK | クラウドフォンは、通常は管理者によってシャットダウンまたは再起動されます。 |
2004 | ユーザー接続が終了しました。 | ASP SDK | クライアントが開始した切断、またはサーバーが開始した操作 (標準の切断または強制終了/キック)。 |
2005 | 管理者が設定した使用期間制限に達したため、%s はタイムアウトにより切断されました。 | ASP SDK | 管理者が設定した使用期間制限のため、%s は切断されました。 |
2010 | %s への接続に失敗しました。 | ASP SDK | Vdagent 接続エラーです。 |
2011 | 渡された接続パラメーターが正しくありません。 | ASP SDK | 接続パラメーターの受け渡し時にエラーが発生しました。 |
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 サーバーへの接続がタイムアウトしました。 後ほどもう一度お試しください。 | アプリ側 | クライアントは、指定された時間内に接続イベントを受信しませんでした。 |
5102 | タイムアウトエラーのため、%s のデータを取得できませんでした。 後ほどもう一度お試しください。 | アプリ側 | クライアントは接続イベントを受信しましたが、指定された時間内に表示イベントを受信しませんでした。 |
5004 | クライアントでエラーが発生しました。 クライアントをもう一度開いてください。 | アプリ側 | クライアントに渡された起動パラメーターが正しくありません(通常は開発中に発生します)。 |
5200 | クライアントの再接続がタイムアウトしました。 後ほどもう一度お試しください。 | アプリ側 | |
8. よくある質問
クラウドフォンを再起動するにはどうすればよいですか?
クラウドフォンを再起動するには、RebootAndroidInstancesInGroup API 操作を呼び出します。クラウドフォンへのアクティブなクライアント接続は、再起動中に一時的に切断されることに注意してください。再起動が完了したら、クライアント側から再接続するだけです。
Maven サポート
パブリック Maven ホスティングは現在利用できません。ただし、お客様は AAR ライブラリを独自の Maven リポジトリにアップロードすることで、SDK を手動で統合できます。
一般的な ADB コマンド
機能 | コマンド |
戻るボタン | input keyevent KEYCODE_BACK |
ホームボタン | 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 |