Alibaba Cloud Workspace SDK untuk Android menyediakan antarmuka terbuka untuk menghubungkan ke komputer cloud, aplikasi cloud, dan telepon cloud dari klien Android. Dengan mengintegrasikan SDK ini, Anda dapat secara efisien menyesuaikan dan menerapkan klien Android sesuai dengan kebutuhan bisnis Anda.
1 Memulai dengan cepat
1.1 Memperoleh SDK dan demo
Metode
Unduh AndroidSDK_aar.
Unduh AndroidSDK_demo.
Semua sumber daya platform, termasuk dokumen, SDK, dan program klien, hanya untuk penggunaan internal Anda atau organisasi Anda. Berbagi tanpa izin tertulis sebelumnya dari Alibaba Cloud kepada pihak ketiga atau organisasi lain dilarang.
Persyaratan lingkungan
Versi Android: Android 5.1 atau lebih baru
Mengintegrasikan SDK menggunakan paket AAR
Salin file aspengine-third-release.aar, aspengine-player-release.aar, dan wytrace-release.aar yang telah diunduh ke direktori app/libs.
Tambahkan pustaka ke file build.gradle modul aplikasi.
dependencies {
implementation fileTree(include: ['*.jar', '*.aar'], dir: 'libs')
// INI configuration parsing library for aspengine-sdk
implementation 'org.ini4j:ini4j:0.5.4'
// Dependency for 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'
}Deklarasikan izin yang diperlukan di file AndroidManifest.
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.VIBRATE"/>1.2 Proses integrasi
1.3 Praktik terbaik
Lihat Praktik Terbaik untuk Mengintegrasikan Cloud Phone untuk detail implementasi. Gambar berikut menggambarkan proses integrasi Cloud Phone.
Beberapa metode logon didukung untuk memperoleh kredensial tiket guna mengakses Cloud Phone—yang diperlukan dalam integrasi SDK. Lihat bagan alir berikut:
Lihat bagian "Antarmuka Siklus Hidup" untuk contoh kode integrasi.
2. Antarmuka siklus hidup
2.1 Inisialisasi instans 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 Membuat sesi
Untuk informasi tentang nilai valid untuk mConfigs, lihat 4.1 Config.
mStreamView.start(mConfigs);2.3 Putuskan dari sesi
mStreamView.stop();2.4 Hapus instance StreamView
mStreamView.dispose();
mStreamView = null;2.5 Mode Multi-StreamView
Mode ini mendukung peralihan tampilan aliran tunggal secara mulus antara beberapa instans View. Untuk mengimplementasikan fitur ini, ikuti langkah-langkah berikut:
Definisikan dan inisialisasi objek
StreamViewseperti yang dijelaskan pada bagian 2.1.Gunakan
IAspEngineuntuk membuat koneksi, menggunakan parameter yang konsisten dengan definisiConfigpada bagian 4.1.IASPEngine engine = mBuilder.enableRTC(true).build(context); //Enable statistics collection 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);Bind
IAspEngineke instansStreamView. Pemanggilan ini akan memulai rendering aliran padaViewyang ditentukan.mStreamView.bindASPEngine(engine);Untuk beralih tampilan, bind
IAspEngineke instansStreamViewyang berbeda. Hal ini memungkinkanViewbaru mengambil alih rendering aliran.mStreamView.resumeASPEngine();
Untuk implementasi lengkap, silakan merujuk ke aplikasi demo yang disediakan.
2.6 Petunjuk callback
Proxy callback untuk koneksi: IASPEngineListener
Deskripsi antarmuka:
Antarmuka | Deskripsi |
onConnectionSuccess(int connectionId) | Callback dipanggil saat berhasil tersambung ke telepon cloud, dengan pengenal koneksi yang dikembalikan. |
onConnectionFailure(int errorCode, String errorMsg) | Callback dipanggil saat gagal tersambung ke telepon cloud, dengan kode kesalahan dan pesan kesalahan yang dikembalikan. |
onEngineError(int errorCode, String errorMsg) | Callback dipanggil saat terjadi pengecualian internal SDK, dengan kode kesalahan dan pesan kesalahan yang dikembalikan. |
onDisconnected(int reason) | Callback dipanggil saat koneksi telepon cloud diputus, dengan alasan pemutusan yang dikembalikan. |
onReconnect(int errorCode) | Callback dipanggil saat telepon cloud melakukan penyambungan ulang otomatis, dengan kode kesalahan yang memicu penyambungan ulang yang dikembalikan. |
onFirstFrameRendered(long timeCostMS) | Callback dipanggil saat frame pertama dari telepon cloud dirender, dengan waktu rendering yang dikonsumsi yang dikembalikan. |
onPolicyUpdate(String policy) | Callback dipanggil saat kebijakan telepon cloud diperbarui, dengan konfigurasi kebijakan yang dikembalikan. |
onSessionSuccess() | Callback dipanggil saat sesi berhasil dibuat dengan telepon cloud. |
Proxy callback untuk data performa: IStatisticsListener
Deskripsi antarmuka:
Antarmuka | Deskripsi |
onStatisticsInfoUpdate(StatisticsInfo statisticsInfo) | Callback dipanggil untuk data performa telepon, dengan objek data performa yang dikembalikan. |
Proxy Callback untuk Permintaan Izin Sistem: IRequestSystemPermissionListener
Deskripsi antarmuka:
Antarmuka | Deskripsi |
bool OnRequestSystemPermission(SystemPermission permission) | Callback dipanggil saat Anda memulai permintaan izin sistem, dengan tipe izin yang diminta yang dikembalikan. |
Kode Contoh untuk Pendaftaran dan Pembatalan Callback:
// Dengarkan callback koneksi.
mStreamView.getASPEngineDelegate().registerASPEngineListener(IASPEngineListener var1);
mStreamView.getASPEngineDelegate().unregisterASPEngineListener(IASPEngineListener var1);
// Dengarkan callback data performa.
mStreamView.getASPEngineDelegate().registerStatisticsListener(IStatisticsListener var1);
mStreamView.getASPEngineDelegate().unregisterStatisticsListener(IStatisticsListener var1);
// Dengarkan permintaan izin sistem.
mStreamView.registerSystemPermissionListener(IRequestSystemPermissionListener listener);
mStreamView.unregisterSystemPermissionListener(IRequestSystemPermissionListener listener);3. Antarmuka bisnis
Antarmuka | Deskripsi |
enableVDAgentCheck(boolean enabled) | Menentukan apakah akan menerapkan pemeriksaan ketersediaan VDAgent selama pembentukan koneksi. Nilai default: true. Jika diatur ke true dan VDAgent tidak tersedia saat koneksi, kesalahan akan dilaporkan dan koneksi akan diputus. Jangan atur nilai ke false kecuali untuk tujuan debugging internal. |
enableRTC(boolean enabled) | Menentukan apakah akan menggunakan komunikasi real-time (RTC) untuk transmisi data streaming. Secara default, RTC digunakan. |
enableDesktopMode(boolean enabled) | Menentukan apakah akan menjalankan dalam mode desktop. Saat mode desktop diaktifkan, semua event Touch dikonversi menjadi event Mouse untuk transmisi ke server. Disarankan agar Anda mengatur nilai ke false untuk Cloud Phone. |
scaleStreamVideo(ScaleType scaleType) | Menentukan perilaku penskalaan untuk konten video yang dialirkan. Lihat "5.1 Jenis Enumerasi" untuk nilai-nilai yang valid. |
setVideoProfile(int width, int height, int fps, IRemoteResult result) | Menentukan resolusi dan laju frame aliran video (laju frame saat ini tidak didukung). |
boolean sendKeyEvent(KeyEvent event) dan sendKeyboardEvent(KeyEvent event, IRemoteResult result) | Mengirimkan event input keyboard ke cloud. |
boolean simulateMouseClick(boolean leftButton) | Mensimulasikan event klik mouse di cloud (true untuk klik kiri dan false untuk klik kanan). |
boolean enableMouseMode(boolean enabled) | Mengaktifkan atau menonaktifkan mode mouse. |
boolean sendMouseEvent(MotionEvent motionEvent) dan sendMouseEvent(MotionEvent motionEvent, IRemoteResult result) | Mengirimkan event input mouse ke cloud. |
reconnect(String connectionToken) | Memulihkan koneksi setelah pemutusan abnormal. Dalam kebanyakan kasus, Anda dapat memanggil metode ini untuk menangani kesalahan "disconnect reason=2200". Aplikasi harus memanggil operasi API untuk mendapatkan token koneksi guna reconnect ke Cloud Phone. |
boolean setMediaStreamPlayer(MediaStreamPlayer player) | Mengganti mesin media default SDK dengan mesin media kustom. Anda hanya dapat memanggil antarmuka ini sebelum streaming dimulai atau setelah streaming berakhir. |
void setAlignStreamResolutionWithSurfaceSize(boolean aligned) | Menentukan apakah akan mensinkronkan resolusi aliran dengan ukuran SurfaceView sisi klien saat streaming dimulai. Secara default, fitur ini diaktifkan. Kami merekomendasikan Anda menonaktifkan fitur ini untuk telepon cloud. |
void mute(boolean muted) | Mengaktifkan atau menonaktifkan mode bisu. |
void enableStatistics(boolean enabled) | Mengaktifkan atau menonaktifkan pengumpulan statistik performa. |
mStreamView.getASPEngineDelegate().requestIFrame() | Meminta frame kunci. |
Di bawah mStreamView.getASPEngineDelegate(): registerFileTransferListener(IFileTransferListener var1) dan unregisterFileTransferListener(IFileTransferListener var1) dan mStreamView.getASPEngineDelegate().uploadFiles(pathList, "/sdcard/Download/"); | Mengunggah atau mengunduh file, yang juga diimplementasikan dalam demo. |
Di bawah mStreamView.getASPEngineDelegate(): addDataChannel(DataChannel var1) dan removeDataChannel(DataChannel var1) | Menentukan saluran untuk gambar untuk menerima data kustom, yang juga diimplementasikan dalam demo. |
Di bawah mStreamView.getASPEngineDelegate(): addLyncChannel(LyncChannel var1) dan removeLyncChannel(LyncChannel var1) | Menentukan saluran untuk mengirim perintah ADB. Lihat "AspAdbUtil" dalam demo untuk implementasi. |
void setToQualityFirst() | Mengonfigurasi mode prioritas kualitas, yang dapat memberikan kualitas gambar tinggi dan laju frame hingga 30 fps. Fitur ini saat ini tidak didukung oleh telepon cloud. |
void setToFpsFirst() | Mengonfigurasi mode prioritas kelancaran, yang dapat memberikan kualitas gambar sedang dan laju frame hingga 60 fps. Fitur ini saat ini tidak didukung oleh telepon cloud. |
void setToCustomPicture(int fps, int quality); | Mengonfigurasi mode kustom memungkinkan penyesuaian laju frame dan kualitas gambar. Fitur ini saat ini tidak didukung oleh Cloud Phone. Nilai kualitas yang valid: 0 hingga 4. 0: lossless, 1: tinggi, 2: Menengah, 3: normal, 4: otomatis. Fitur ini saat ini tidak didukung oleh ponsel cloud. |
Di bawah mStreamView.getASPEngineDelegate(): registerIMEListener, unregisterIMEListener, setImeType, enableRelativeMouse, dan lain-lain | Fitur ini saat ini tidak didukung oleh telepon cloud. |
4. Parameter
4.1 Config
Tabel berikut menjelaskan parameter yang diperlukan untuk membuat koneksi.
Parameter | Tipe | Deskripsi |
StreamView.CONFIG_DESKTOP_ID | string | ID instans, yaitu nilai ResourceId yang dikembalikan oleh DescribeUserResources. |
StreamView.CONFIG_CONNECTION_TICKET | string | Tiket autentikasi koneksi, yang diperoleh melalui GetConnectionTicket. |
StreamView.CONFIG_PREFER_RTC_TRANSPORT | boolean | Mengaktifkan saluran RTC. Kami merekomendasikan Anda mengatur nilai ini ke true untuk telepon cloud. |
StreamView.CONFIG_ENABLE_VDAGENT_CHECK | boolean | Menentukan apakah akan memeriksa ketersediaan VDAgent saat Anda tersambung ke telepon cloud. Kami merekomendasikan Anda mengatur nilai ini ke true untuk telepon cloud. |
StreamView.CONFIG_ENABLE_STATISTICS | boolean | Menentukan apakah akan melaporkan statistik performa. Jika statistik performa dilaporkan, data performa tambahan disediakan dalam aliran video. Kami merekomendasikan Anda mengatur nilai ini ke true untuk telepon cloud. |
JenisOS | string | Menentukan tipe OS. Anda harus menetapkan nilai menjadi android untuk ponsel cloud. |
4.2 StatisticsInfo
Tabel berikut menjelaskan parameter untuk mengumpulkan data performa.
Antarmuka | Tipe | Deskripsi |
mReceiveFps | int | Laju frame yang diterima. |
mRenderFps | int | Laju frame yang dirender. |
mDownstreamBandwithMBPerSecond | double | Bandwidth downstream. |
mUpstreamBandwithMBPerSecond | double | Bandwidth upstream. |
mP2pFullLinkageLatencyMS | long | (Tidak digunakan lagi) Latensi end-to-end full-link. |
mNetworkLatencyMS | long | Latensi RTT jaringan. |
mPingGatewayRttMS | long | Latensi RTT ping. |
mLostRate | double | Tingkat kehilangan paket. |
mServerRenderLatencyMS | long | Latensi rendering sisi cloud. |
mServerEncoderLatencyMS | long | Latensi encoding sisi cloud. |
mServerTotalLatencyMS | long | Total latensi sisi cloud. |
mTotalDownstreamBandwidth | long | Total bandwidth. |
mGuestCpuUsage | long | Penggunaan CPU guest. |
mStreamType | String | Tipe protokol aliran. |
5. Jenis enumerasi
5.1 ScaleType
Tabel berikut menjelaskan jenis pemrosesan penskalaan untuk konten citra streaming.
Parameter | Deskripsi |
FILL_STREAM_VIEW | Selalu meregangkan gambar yang dialirkan agar sesuai dengan ukuran instance StreamView. Jika rasio aspek instance StreamView tidak sesuai dengan gambar yang dialirkan, strategi ini dapat mengakibatkan distorsi yang terlihat. |
FIT_STREAM_CONTENT | Menyesuaikan area rendering instance StreamView untuk memastikan bahwa konten gambar yang dialirkan selalu dirender dengan rasio aspek yang sama. Jika Anda menggunakan strategi ini, gambar yang dialirkan mungkin tidak mengisi seluruh area tampilan instance StreamView. |
5.1 SystemPermission
Tabel berikut menjelaskan tipe izin sistem.
Parameter | Deskripsi |
RECORDAUDIO | Meminta izin perekaman audio. |
6. Menyesuaikan MediaStreamPlayer
Jika tidak ada persyaratan multimedia khusus, Anda dapat mengabaikan ini, karena SDK mencakup implementasi multimedia default.
6.1 Proses data media dengan mesin media kustom
Dengan mengimplementasikan com.aliyun.wuying.aspsdk.aspengine.MediaStreamPlayer, aplikasi dapat menggunakan mesin media kustom untuk memproses data streaming media, yang terutama mencakup:
Data Aliran Video: aliran video mentah yang terutama terdiri dari frame terkompresi H.264/H.265.
Data Aliran Grafik Adaptif: aliran grafik yang terutama terdiri dari bitmap.
Data Downstream Audio: aliran downstream audio yang terutama dalam format Opus/PCM.
Data Kursor: Saat mode mouse virtual diaktifkan, aplikasi dapat menerima gambar kursor dan data posisi, memungkinkannya merender kursor virtual secara independen.
Aplikasi dapat mengimplementasikan mesin media kustom di Alibaba Cloud Workspace SDK dengan menggunakan antarmuka IASPEngine.setMediaStreamPlayer.
6.2 MediaStreamPlayer
MediaStreamPlayer adalah kelas abstrak yang memerlukan aplikasi untuk mengimplementasikan metode inisialisasi global dan pembersihan. Ini juga menyediakan implementasi kustom untuk menangani berbagai jenis data media.

Di antaranya:
IVideoStreamHandler menyediakan metode untuk menangani data aliran video.
IAdaptiveGraphicStreamHandler menyediakan metode untuk menangani data aliran grafik adaptif.
IAudioPlaybackStreamHandler menyediakan metode untuk menangani data pemutaran audio.
ICursorBitmap menyediakan metode untuk mengelola data kursor.
Aplikasi Anda dapat memilih untuk mengimplementasikan satu atau lebih antarmuka yang disebutkan di atas. Berdasarkan antarmuka yang diimplementasikan, Alibaba Cloud Workspace SDK akan menentukan jenis streaming cloud yang digunakan, sesuai dengan aturan berikut:
Jika aplikasi mengimplementasikan baik IVideoStreamHandler maupun IAdaptiveGraphicStreamHandler, mode streaming akan diatur ke Mixed. Dalam hal ini, Alibaba Cloud Workspace akan beralih secara otomatis antara streaming grafik adaptif dan streaming video berdasarkan skenario saat ini.
Jika aplikasi hanya mengimplementasikan IVideoStreamHandler, mode streaming akan diatur ke Video stream only, artinya server hanya akan mengirim data aliran video.
Jika aplikasi hanya mengimplementasikan IAudioPlaybackStreamHandler, mode streaming akan diatur ke aliran gambar saja, sehingga server hanya akan mengirim data aliran gambar.
Aplikasi Anda dapat menyediakan implementasi kustom untuk berbagai jenis data media ke SDK dengan menggunakan metode onCreateXXXHandler dari MediaStreamPlayer.
@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;
}Dalam contoh di atas, mesin media kustom mengimplementasikan baik IVideoStreamHandler maupun IAudioPlaybackStreamHandler. Metode onCreateXXXHandler hanya dieksekusi satu kali selama sesi streaming.
Proses Pemanggilan Metode Utama:
6.2.1 initialize
Metode ini diimplementasikan oleh aplikasi dan dapat digunakan untuk melaksanakan inisialisasi global terkait mesin media kustom.
Metode ini dieksekusi satu kali dalam setiap proses streaming.
public ErrorCode initialize()Nilai Pengembalian:
Tipe | Deskripsi |
ErrorCode | Mengembalikan ErrorCode.OK jika inisialisasi berhasil; jika tidak, inisialisasi gagal. |
6.2.2 release
Metode ini diimplementasikan oleh aplikasi dan dapat digunakan untuk menjalankan tugas pelepasan global terkait mesin media kustom.
Metode ini dieksekusi satu kali dalam setiap proses streaming.
public ErrorCode release()Nilai Pengembalian:
Tipe | Deskripsi |
ErrorCode | Mengembalikan ErrorCode.OK jika pelepasan berhasil; jika tidak, pelepasan gagal. |
6.2.3 enableStatistics
Metode ini diimplementasikan oleh aplikasi dan dapat digunakan untuk mengaktifkan atau menonaktifkan pengumpulan statistik performa.
public void enableStatistics(boolean enabled)Parameter:
Parameter | Tipe | Deskripsi |
enabled | boolean | True: mengaktifkan pengumpulan data performa. False: menonaktifkan pengumpulan data performa. |
6.2.4 onCreateVideoStreamHandler
Metode ini diimplementasikan oleh aplikasi dan digunakan untuk menyediakan SDK dengan implementasi mesin media guna menangani data aliran video.
Metode ini dieksekusi satu kali dalam setiap proses streaming.
public IVideoStreamHandler onCreateVideoStreamHandler()Nilai Pengembalian:
Tipe | Deskripsi |
IVideoStreamHandler | Diimplementasikan oleh mesin media yang disediakan oleh aplikasi untuk pemrosesan data aliran video. Jika aplikasi tidak menyediakan implementasi untuk pemrosesan aliran video, null dikembalikan. Dalam hal ini, data aliran video tidak diproses. |
6.2.5 onCreateAdaptiveGraphicStreamHandler
Metode ini diimplementasikan oleh aplikasi dan digunakan untuk menyediakan SDK dengan implementasi mesin media guna menangani data aliran grafik adaptif.
Metode ini dieksekusi satu kali dalam setiap proses streaming.
public IAdaptiveGraphicStreamHandler onCreatAdaptiveGraphicStreamHandler()Nilai Pengembalian:
Tipe | Deskripsi |
IAdaptiveGraphicStreamHandler | Diimplementasikan oleh mesin media yang disediakan oleh aplikasi untuk pemrosesan aliran grafik adaptif. Jika aplikasi tidak menyediakan implementasi untuk pemrosesan aliran grafik adaptif, null dikembalikan. Dalam hal ini, data aliran grafik tidak diproses. |
6.2.6 onCreateAudioPlaybackStreamHandler
Metode ini diimplementasikan oleh aplikasi dan digunakan untuk menyediakan SDK dengan implementasi mesin media guna menangani data downstream audio.
Metode ini dieksekusi satu kali dalam setiap proses streaming.
public IAudioPlaybackStreamHandler onCreatAudioPlaybackStreamHandler()Nilai Pengembalian:
Tipe | Deskripsi |
IAudioPlaybackStreamHandler | Diimplementasikan oleh mesin media yang disediakan oleh aplikasi untuk pemrosesan data downstream audio. Jika aplikasi tidak menyediakan implementasi untuk pemrosesan data downstream audio, null dikembalikan. Dalam hal ini, data downstream audio tidak diproses. |
6.2.7 onCreateCursorBitmapHandler
Metode ini diimplementasikan oleh aplikasi dan digunakan untuk menyediakan SDK dengan implementasi mesin media guna menangani data kursor.
Metode ini dijalankan satu kali dalam setiap proses streaming.
Antarmuka yang disediakan oleh metode ini hanya digunakan ketika mode mouse virtual diaktifkan.
public ICursorBitmapHandler onCreatCursorBitmapHandler()Nilai Pengembalian:
Tipe | Deskripsi |
ICursorBitmapHandler | Diimplementasikan oleh mesin media yang disediakan oleh aplikasi untuk pemrosesan data kursor. Jika aplikasi tidak menyediakan implementasi untuk pemrosesan data kursor, null dikembalikan. Dalam hal ini, data kursor tidak diproses. |
6.3 IVideoStreamHandler
Antarmuka ini mendefinisikan metode utama untuk menangani data aliran video, dan alur kerja utamanya adalah sebagai berikut:
Ketika aplikasi beralih antara latar depan dan latar belakang, instance Surface yang digunakan untuk rendering akan dihancurkan atau dibuat ulang. Dalam situasi ini, metode IVideoStreamHandler.setVideoSurface akan dipanggil beberapa kali. Saat instance Surface dihancurkan, objek surface yang dilewatkan ke setVideoSurface akan menjadi null. Aplikasi harus menangani toleransi kesalahan untuk proses decoder dan rendering secara tepat.
Aplikasi dapat memperoleh antarmuka penanganan acara yang disediakan oleh Alibaba Cloud Workspace SDK dengan mengimplementasikan metode IVideoStreamHandler.setEventHandler. Melalui antarmuka ini, aplikasi dapat memberi tahu SDK tentang acara pemrosesan video dari mesin media kustomnya, yang utamanya digunakan untuk pelacakan data performa.
@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;
// Memberi tahu SDK bahwa frame gambar video telah dirender. SDK kemudian akan menghitung latensi end-to-end di sisi klien berdasarkan ID frame.
mHandler.callback(event);
}
}6.3.1 setEventHandler
Metode ini diimplementasikan oleh aplikasi. Saat mesin media kustom dimuat oleh Alibaba Cloud Workspace SDK, SDK menggunakan metode ini untuk memberikan handler event kepada aplikasi Anda. Aplikasi dapat menggunakan handler ini untuk mengirimkan event pemrosesan aliran video.
public void setEventHandler(EventHandler handler)Parameter:
Parameter | Tipe | Deskripsi |
handler | EventHandler | Handler yang disediakan oleh SDK. Aplikasi dapat menggunakan handler ini untuk mengirimkan event pemrosesan aliran video ke SDK. |
6.3.2 addVideoTrack
Metode ini diimplementasikan oleh aplikasi dan memberi tahu aplikasi Anda saat aliran video dibuat.
Saat ini, hanya satu aliran video yang dapat aktif dalam satu sesi streaming pada satu waktu.
ErrorCode addVideoTrack(int trackId, VProfile profile);Parameter:
Parameter | Tipe | Deskripsi |
trackId | int | ID aliran video. |
profile | VProfile | Informasi tentang aliran video. |
Nilai Pengembalian:
Tipe | Deskripsi |
ErrorCode | Mengembalikan ErrorCode.OK jika eksekusi berhasil; jika tidak, eksekusi gagal. |
6.3.3 setVideoSurface
Metode ini diimplementasikan oleh aplikasi. Ini memberi tahu aplikasi Anda saat status instance Surface yang digunakan untuk rendering video berubah.
ErrorCode setVideoSurface(int trackId, Surface surface);Parameter:
Parameter | Tipe | Deskripsi |
trackId | int | ID aliran video. |
surface | android.view.Surface | Objek Surface yang digunakan untuk rendering video. Objek ini mungkin menjadi null ketika aplikasi beralih ke latar belakang atau saat layar terkunci. |
Nilai Pengembalian:
Tipe | Deskripsi |
ErrorCode | Mengembalikan ErrorCode.OK jika eksekusi berhasil; jika tidak, eksekusi gagal. |
6.3.4 playVideo
Metode ini diimplementasikan oleh aplikasi. Ini memberi tahu aplikasi Anda saat aliran video siap.
ErrorCode playVideo(int trackId);Parameter:
Parameter | Tipe | Deskripsi |
trackId | int | ID aliran video. |
Nilai Pengembalian:
Tipe | Deskripsi |
ErrorCode | Mengembalikan ErrorCode.OK jika eksekusi berhasil; jika tidak, eksekusi gagal. |
6.3.5 removeVideoTrack
Metode ini diimplementasikan oleh aplikasi. Ini memberi tahu aplikasi Anda saat aliran video dihancurkan.
ErrorCode removeVideoTrack(int trackId);Parameter:
Parameter | Tipe | Deskripsi |
trackId | int | ID aliran video. |
Nilai Pengembalian:
Tipe | Deskripsi |
ErrorCode | Mengembalikan ErrorCode.OK jika eksekusi berhasil; jika tidak, eksekusi gagal. |
6.3.6 pushVideoFrame
Metode ini diimplementasikan oleh aplikasi. Ini memberi tahu aplikasi Anda saat frame video baru diterima.
ErrorCode setVideoSurface(int trackId, Surface surface);Parameter:
Parameter | Tipe | Deskripsi |
trackId | int | ID aliran video. |
frame | VFrame | Informasi tentang frame video yang baru diterima. |
Nilai Pengembalian:
Tipe | Deskripsi |
ErrorCode | Mengembalikan ErrorCode.OK jika eksekusi berhasil; jika tidak, eksekusi gagal. |
6.3.7 getVideoTracks
Metode ini diimplementasikan oleh aplikasi. SDK menggunakannya untuk mengambil informasi tentang aliran video yang sedang diproses oleh aplikasi Anda.
HashMap<Integer, VProfile> getVideoTracks();Nilai Pengembalian:
Tipe | Deskripsi |
HashMap<Integer, VProfile> | Informasi tentang semua aliran video yang sedang diproses yang diperoleh dari aplikasi Anda. |
6.3.8 release
Metode ini diimplementasikan oleh aplikasi. SDK menggunakannya untuk memberi tahu aplikasi Anda untuk melakukan tindakan pembersihan saat semua aliran video dihancurkan.
ErrorCode release();Nilai Pengembalian:
Tipe | Deskripsi |
ErrorCode | Mengembalikan ErrorCode.OK jika eksekusi berhasil; jika tidak, eksekusi gagal. |
6.4 IAudioPlaybackStreamHandler
Antarmuka ini mendefinisikan metode utama untuk menangani data aliran audio, dan alur kerja utamanya adalah sebagai berikut:
6.4.1 initAudio
Metode ini diimplementasikan oleh aplikasi. Saat saluran audio dibuat dalam SDK, aplikasi Anda diberi tahu melalui metode ini.
ErrorCode initAudio();Nilai Pengembalian:
Tipe | Deskripsi |
ErrorCode | Mengembalikan ErrorCode.OK jika eksekusi berhasil; jika tidak, eksekusi gagal. |
6.4.2 deInitAudio
Metode ini diimplementasikan oleh aplikasi. Saat saluran audio dihancurkan dalam SDK, aplikasi Anda diberi tahu melalui metode ini.
ErrorCode deInitAudio();Nilai Pengembalian:
Tipe | Deskripsi |
ErrorCode | Mengembalikan ErrorCode.OK jika eksekusi berhasil; jika tidak, eksekusi gagal. |
6.4.3 startAudioPlayback
Metode ini diimplementasikan oleh aplikasi. Saat telepon cloud akan mulai streaming audio, aplikasi Anda diberi tahu melalui metode ini.
ErrorCode startAudioPlayback();Nilai Pengembalian:
Tipe | Deskripsi |
ErrorCode | Mengembalikan ErrorCode.OK jika eksekusi berhasil; jika tidak, eksekusi gagal. |
6.4.4 stopAudioPlayback
Metode ini diimplementasikan oleh aplikasi. Saat telepon cloud menghentikan streaming audio, aplikasi Anda diberi tahu melalui metode ini.
ErrorCode stopAudioPlayback();Nilai Pengembalian:
Tipe | Deskripsi |
ErrorCode | Mengembalikan ErrorCode.OK jika eksekusi berhasil; jika tidak, eksekusi gagal. |
6.4.5 pushAudioPlaybackFrame
Metode ini diimplementasikan oleh aplikasi. Saat frame audio downstream baru diterima, aplikasi Anda diberi tahu melalui metode ini.
ErrorCode pushAudioPlaybackFrame(AFrame pbData);Parameter:
Parameter | Tipe | Deskripsi |
pbData | AFrame | Informasi tentang aliran audio downstream yang baru diterima. |
Nilai Pengembalian:
Tipe | Deskripsi |
ErrorCode | Mengembalikan ErrorCode.OK jika eksekusi berhasil; jika tidak, eksekusi gagal. |
6.4.6 updateAudioPlaybackVol
Metode ini diimplementasikan oleh aplikasi. Saat volume sistem di telepon cloud berubah, aplikasi Anda diberi tahu melalui metode ini.
ErrorCode updateAudioPlaybackVol(int volume);Parameter:
Parameter | Tipe | Deskripsi |
volume | int | Volume sistem telepon cloud. Nilai valid: 0 hingga USHRT_MAX. 0 menunjukkan bahwa telepon cloud dibisukan. |
Nilai Pengembalian:
Tipe | Deskripsi |
ErrorCode | Mengembalikan ErrorCode.OK jika eksekusi berhasil; jika tidak, eksekusi gagal. |
6.4.7 updateAudioPlaybackMute
Metode ini diimplementasikan oleh aplikasi. Saat telepon cloud dibisukan atau tidak dibisukan, aplikasi Anda diberi tahu melalui metode ini.
ErrorCode updateAudioPlaybackMute(int mute);Parameter:
Parameter | Tipe | Deskripsi |
mute | int | Menentukan apakah akan membisukan telepon cloud. Nilai valid: 1 dan 0. 1 menunjukkan bahwa telepon cloud dibisukan, dan 0 menunjukkan bahwa telepon cloud tidak dibisukan. |
Nilai Pengembalian:
Tipe | Deskripsi |
ErrorCode | Mengembalikan ErrorCode.OK jika eksekusi berhasil; jika tidak, eksekusi gagal. |
6.4.8 release
Metode ini diimplementasikan oleh aplikasi. SDK menggunakannya untuk memberi tahu aplikasi Anda untuk melakukan tindakan pembersihan saat saluran audio dihancurkan.
ErrorCode release();Nilai Pengembalian:
Tipe | Deskripsi |
ErrorCode | Mengembalikan ErrorCode.OK jika eksekusi berhasil; jika tidak, eksekusi gagal. |
6.5 IAdaptiveGraphicStreamHandler
Antarmuka ini mendefinisikan metode utama untuk menangani data aliran gambar, dan alur kerja utamanya adalah sebagai berikut:
Format frame gambar yang diperoleh aplikasi saat ini adalah Bitmap ARGB8888.
Hanya ada satu aliran Citra yang aktif dalam satu waktu selama proses streaming.
6.5.1 setAdaptiveGraphicSurface
Metode ini diimplementasikan oleh aplikasi. Ini memberi tahu aplikasi Anda saat status instance Surface yang digunakan untuk rendering gambar berubah.
ErrorCode setAdaptiveGraphicSurface(Surface surface);Parameter:
Parameter | Tipe | Deskripsi |
surface | android.view.Surface | Objek Surface yang digunakan untuk rendering gambar. Objek ini mungkin menjadi null ketika aplikasi beralih ke latar belakang atau saat layar terkunci. |
Nilai Pengembalian:
Tipe | Deskripsi |
ErrorCode | Mengembalikan ErrorCode.OK jika eksekusi berhasil; jika tidak, eksekusi gagal. |
6.5.2 invalidateAdaptiveGraphicSurface
Metode ini diimplementasikan oleh aplikasi. Ini memberi tahu aplikasi Anda saat frame grafik adaptif baru diterima.
ErrorCode invalidateAdaptiveGraphicSurface(Region region, byte[] buffer, BitmapFormat format);Parameter:
Parameter | Tipe | Deskripsi |
region | Region | Informasi area gambar dari frame grafik adaptif. |
buffer | byte[] | Frame grafik adaptif. |
format | BitmapFormat | Informasi format frame grafik adaptif, dengan ARGB8888 sebagai default. |
Nilai Pengembalian:
Tipe | Deskripsi |
ErrorCode | Mengembalikan ErrorCode.OK jika eksekusi berhasil; jika tidak, eksekusi gagal. |
6.5.3 release
Metode ini diimplementasikan oleh aplikasi. SDK menggunakannya untuk memberi tahu aplikasi Anda untuk melakukan tindakan pembersihan saat semua aliran grafik adaptif dihancurkan.
ErrorCode release();Nilai Pengembalian:
Tipe | Deskripsi |
ErrorCode | Mengembalikan ErrorCode.OK jika eksekusi berhasil; jika tidak, eksekusi gagal. |
6.6 ICursorBitmapHandler
Antarmuka ini mendefinisikan metode utama untuk menangani data kursor. Saat mode mouse virtual diaktifkan, aplikasi menyediakan implementasi antarmuka ini kepada SDK untuk rendering gambar kursor. Alur kerja utamanya adalah sebagai berikut:
6.6.1 setCursorBitmap
Metode ini diimplementasikan oleh aplikasi. Saat grafik kursor di telepon cloud berubah, aplikasi Anda diberi tahu melalui metode ini.
ErrorCode setCursorBitmap(CursorBitmap bitmap);Parameter:
Parameter | Tipe | Deskripsi |
bitmap | CursorBitmap | Data grafik kursor telepon cloud. |
Nilai Pengembalian:
Tipe | Deskripsi |
ErrorCode | Mengembalikan ErrorCode.OK jika eksekusi berhasil; jika tidak, eksekusi gagal. |
6.6.2 unsetCursorBitmap
Metode ini diimplementasikan oleh aplikasi. Saat kursor di telepon cloud disembunyikan, aplikasi Anda diberi tahu melalui metode ini.
ErrorCode unsetCursorBitmap();Nilai Pengembalian:
Tipe | Deskripsi |
ErrorCode | Mengembalikan ErrorCode.OK jika eksekusi berhasil; jika tidak, eksekusi gagal. |
6.6.3 setCursorPosition
Metode ini diimplementasikan oleh aplikasi. Saat posisi kursor di telepon cloud berubah, aplikasi Anda diberi tahu melalui metode ini.
ErrorCode setCursorPosition(float x, float y);Parameter:
Parameter | Tipe | Deskripsi |
x | float | Koordinat X kursor. |
y | float | Koordinat Y kursor. |
Nilai Pengembalian:
Tipe | Deskripsi |
ErrorCode | Mengembalikan ErrorCode.OK jika eksekusi berhasil; jika tidak, eksekusi gagal. |
6.6.4 release
Metode ini diimplementasikan oleh aplikasi. SDK menggunakannya untuk memberi tahu aplikasi Anda untuk melakukan tindakan pembersihan saat koneksi diputus dan tampilan kursor dibatalkan.
ErrorCode release();Nilai Pengembalian:
Tipe | Deskripsi |
ErrorCode | Mengembalikan ErrorCode.OK jika eksekusi berhasil; jika tidak, eksekusi gagal. |
7. Kode kesalahan
Kode kesalahan | Pesan kesalahan ( | Modul yang ditentukan | Penyebab |
Kode 2 hingga 26 terutama terkait dengan masalah jaringan. | |||
2 | Gagal tersambung ke %s. | ASP SDK | MAGIC tidak valid. |
3 | Gagal tersambung ke %s. | ASP SDK | Data tidak benar. |
4 | Versi klien tidak sesuai dengan versi server. | ASP SDK | Versi tidak sesuai. |
5 | Koneksi memerlukan Transport Layer Security (TLS). | ASP SDK | TLS diperlukan. |
6 | TLS tidak diperlukan untuk koneksi. | ASP SDK | TLS diterapkan. |
7 | Anda tidak memiliki izin untuk tersambung ke %s. | ASP SDK | Masalah izin. |
8 | ASP SDK | ID klien tidak valid selama migrasi. | |
9 | Gagal tersambung ke %s. | ASP SDK | Tidak ada saluran yang ditemukan. |
20 | Gagal tersambung ke server ASP. | ASP SDK | Kesalahan koneksi saluran. |
21 | Kesalahan autentikasi TLS. | ASP SDK | Autentikasi TLS gagal. |
22 | Gagal tersambung ke %s. | ASP SDK | Kesalahan tautan saluran. |
23 | Gagal tersambung ke %s. | ASP SDK | Kesalahan autentikasi koneksi. |
24 | Gagal tersambung ke %s. | ASP SDK | Kesalahan I/O koneksi. |
25 | Gagal tersambung ke %s. | ASP SDK | Validasi tiket gagal. Kesalahan ini juga akan dipicu jika tiket yang sama digunakan untuk meminta koneksi baru setelah sesi sebelumnya diputus. |
26 | ASP SDK | Kegagalan handshake Xquic. | |
Kasus di mana koneksi terputus atau mengalami kesalahan | |||
2.000 | Gagal terhubung ke server karena pengambilan data selama %s kali habis waktu. | ASP SDK | Pemutusan normal. |
2001 | Gagal menghubungkan %s ke server karena proses %s secara paksa ditangguhkan. | ASP SDK | Masalah ini biasanya terjadi ketika aplikasi klien dihentikan (misalnya, aplikasi Android yang ditutup oleh pengguna melalui tombol Home). |
2002 | Pengguna lain telah terhubung ke %s saat ini dari terminal yang berbeda. Silakan coba lagi nanti. | ASP SDK | Instans tersebut telah diambil alih oleh pengguna lain. |
2003 | %s sedang dimatikan atau di-restart (biasanya dilakukan oleh administrator). Silakan coba lagi nanti. | ASP SDK | Cloud phone biasanya dimatikan atau di-restart oleh administrator. |
2004 | Koneksi pengguna diputus. | ASP SDK | Pemutusan yang diinisiasi klien, atau tindakan yang diinisiasi server (pemutusan standar atau penghentian/pengusiran paksa). |
2005 | %s terputus karena waktu habis, karena batas durasi penggunaan yang ditetapkan oleh administrator telah tercapai. | ASP SDK | %s terputus karena batas durasi penggunaan yang ditetapkan oleh administrator. |
2010 | Gagal terhubung ke %s. | ASP SDK | Kegagalan koneksi Vdagent. |
2011 | Parameter koneksi yang salah telah diteruskan. | ASP SDK | Kesalahan terjadi saat melewati parameter koneksi. |
2027 | Mode tarik aliran berubah. | ASP SDK | Mode diubah dari preemptive ke collaborative, atau sebaliknya. |
2.100 | Izin clipboard ditolak (dari %s ke lokal). | ASP SDK | Izin clipboard dibatasi (dari VM ke lokal). |
2101 | Izin clipboard ditolak (dari lokal ke %s). | ASP SDK | Izin clipboard dibatasi (dari lokal ke VM). |
2.200 | %s sedang mencoba menyambung kembali... | ASP SDK | Terputus karena masalah jaringan, ASP SDK sedang menyambungkan kembali. |
2201 | Perangkat Anda mengalami anomali jaringan, menyebabkan %s terputus. | ASP SDK | Terputus karena masalah jaringan, ASP SDK tidak mendukung rekoneksi karena batasan gambar; aplikasi memulai rekoneksi. |
2202 | Waktu habis untuk penyambungan ulang %s. Harap periksa jaringan perangkat Anda dan coba lagi. | ASP SDK | Timeout rekononeksi SDK ASP. |
Kesalahan logika sisi klien | |||
5100 | Koneksi dari %s ke ASP Server timeout. Silakan coba lagi nanti. | Sisi aplikasi | Klien tidak menerima event tersambung dalam jangka waktu yang ditentukan. |
5102 | Gagal mendapatkan data %s karena kesalahan timeout. Silakan coba lagi nanti. | Sisi aplikasi | Klien menerima event tersambung tetapi tidak menerima event tampilan dalam jangka waktu yang ditentukan. |
5004 | Klien mengalami kesalahan. Silakan buka ulang klien. | Sisi aplikasi | Parameter startup salah dilewatkan ke klien (biasanya terjadi selama pengembangan). |
5200 | Timeout penyambungan ulang klien. Silakan coba lagi nanti. | Sisi aplikasi | |
8. FAQ
Bagaimana cara me-restart telepon cloud?
Untuk me-restart telepon cloud, panggil operasi API RebootAndroidInstancesInGroup. Perhatikan bahwa koneksi klien aktif ke telepon cloud akan sementara terputus selama restart. Setelah restart selesai, cukup sambungkan ulang dari sisi klien.
Dukungan Maven
Hosting Maven publik saat ini tidak tersedia. Namun, pelanggan dapat secara manual mengintegrasikan SDK dengan mengunggah pustaka AAR ke repositori Maven mereka sendiri.
Perintah ADB umum
Fitur | Perintah |
Tombol Kembali | input keyevent KEYCODE_BACK |
Tombol Beranda | input keyevent KEYCODE_HOME |
Beralih aplikasi | input keyevent KEYCODE_APP_SWITCH |
Bisu | input keyevent 164 |
Volume naik | input keyevent KEYCODE_VOLUME_UP |
Volume turun | input keyevent KEYCODE_VOLUME_DOWN |
Sembunyikan bilah navigasi | setprop persist.wy.hasnavibar false; killall com.android.systemui |
Tampilkan bilah navigasi | setprop persist.wy.hasnavibar true; killall com.android.systemui |
Ambil tangkapan layar | screencap -p /sdcard/Download/abc.png |