全部产品
Search
文档中心

Cloud Phone:Android SDK

更新时间:Dec 05, 2025

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

Catatan

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:

  1. Definisikan dan inisialisasi objek StreamView seperti yang dijelaskan pada bagian 2.1.

  2. Gunakan IAspEngine untuk membuat koneksi, menggunakan parameter yang konsisten dengan definisi Config pada 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);
  3. Bind IAspEngine ke instans StreamView. Pemanggilan ini akan memulai rendering aliran pada View yang ditentukan.

    mStreamView.bindASPEngine(engine);
  4. Untuk beralih tampilan, bind IAspEngine ke instans StreamView yang berbeda. Hal ini memungkinkan View baru 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

Catatan

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.

image.png

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 (%s menunjukkan telepon cloud atau aplikasi cloud)

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