All Products
Search
Document Center

Cloud Phone:Android SDK

Last Updated:Mar 12, 2026

WUYING Android SDK adalah API terbuka yang memungkinkan klien Android terhubung ke WUYING Workspace, aplikasi cloud, dan Cloud Phone. Anda dapat mengintegrasikan Android SDK untuk dengan cepat menyesuaikan dan membangun klien Android.

1. Memulai

1.1 Mendapatkan SDK dan demo

Cara mendapatkan

Catatan

Semua dokumen, SDK, dan program klien pada platform ini hanya untuk penggunaan pribadi atau perusahaan. Jangan meneruskannya kepada pihak ketiga tanpa persetujuan Alibaba Cloud.

Persyaratan integrasi

Membutuhkan Android 5.1 atau versi yang 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 dependensi berikut ke file build.gradle modul aplikasi:

dependencies {
    implementation fileTree(include the following: ['*.jar', '*.aar'], dir: 'libs')
    // The INI configuration parsing library that the aspengine SDK depends on.
    implementation 'org.ini4j:ini4j:0.5.4'
    // The libraries that wytrace depends on.
    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 dalam file AndroidManifest.xml:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.VIBRATE"/>

1.2 Proses integrasi

image

1.3 Praktik terbaik

Untuk informasi selengkapnya, lihat praktik terbaik integrasi cepat Cloud Phone. Gambar berikut menjelaskan proses integrasi Cloud Phone.

image

Terdapat beberapa metode login untuk mendapatkan tiket yang dibutuhkan SDK guna terhubung ke Cloud Phone. Bagan alir berikut menunjukkan proses tersebut.

image

Untuk kode integrasi spesifik, lihat kode contoh untuk API lifecycle.

2. API Siklus Hidup

2.1 Inisialisasi dan buat 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 Membangun koneksi

Untuk informasi lebih lanjut mengenai nilai mConfigs, lihat 4.1 Config.

mStreamView.start(mConfigs);

2.3 Putuskan koneksi

mStreamView.stop();

2.4 Hapus instans StreamView

mStreamView.dispose();
mStreamView = null;

2.5 Mode Multi-StreamView

Mode ini memungkinkan aliran beralih secara mulus antara beberapa tampilan. Lakukan langkah-langkah berikut:

  1. Definisikan dan inisialisasi StreamView. Untuk informasi selengkapnya, lihat bagian 2.1.

  2. Gunakan IAspEngine untuk membangun koneksi. Parameter-parameternya sama seperti yang didefinisikan di 4.1 Config.

    IASPEngine engine = mBuilder.enableRTC(true).build(context);
    // Enable data statistics.
    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 StreamView ke IAspEngine. API ini merender aliran pada tampilan saat ini.

    mStreamView.bindASPEngine(engine);
  4. Lanjutkan kembali binding antara StreamView dan IAspEngine. API ini memungkinkan tampilan melanjutkan rendering aliran.

    mStreamView.resumeASPEngine();

Untuk detail lebih lanjut, lihat implementasi dalam demo.

2.6 Deskripsi callback

Pendengar callback koneksi: IASPEngineListener

Deskripsi API:

API

Deskripsi

onConnectionSuccess(int connectionId)

Callback saat koneksi ke Cloud Phone berhasil. ID koneksi dikembalikan.

onConnectionFailure(int errorCode, String errorMsg)

Callback saat koneksi ke Cloud Phone gagal. Kode kesalahan dan pesan kesalahan dikembalikan.

onEngineError(int errorCode, String errorMsg)

Callback saat terjadi pengecualian internal SDK. Kode kesalahan dan pesan kesalahan dikembalikan.

onDisconnected(int reason)

Koneksi ke Cloud Phone terputus. Alasan pemutusan dikembalikan.

onReconnect(int errorCode)

Koneksi ke Cloud Phone sedang dibangun ulang. Kode kesalahan yang menyebabkan reconnect dikembalikan.

onFirstFrameRendered(long timeCostMS)

Callback saat frame pertama ditampilkan di Cloud Phone. Waktu yang dikonsumsi dikembalikan.

onPolicyUpdate(String policy)

Callback untuk kebijakan Cloud Phone. Konfigurasi kebijakan dikembalikan.

onSessionSuccess()

Callback saat sesi koneksi Cloud Phone berhasil dibuat.

Pendengar callback data performa: IStatisticsListener

Deskripsi API:

API

Deskripsi

onStatisticsInfoUpdate(StatisticsInfo statisticsInfo)

Callback untuk data performa Cloud Phone. Objek data performa dikembalikan.

Pendengar callback permintaan izin sistem: IRequestSystemPermissionListener

Deskripsi API:

API

Deskripsi

bool OnRequestSystemPermission(SystemPermission permission)

Callback saat ada permintaan izin sistem. Jenis izin sistem yang diminta dikembalikan.

Kode contoh untuk mendaftarkan dan membatalkan pendaftaran callback:

// Listen for connection callbacks.
mStreamView.getASPEngineDelegate().registerASPEngineListener(IASPEngineListener var1);
mStreamView.getASPEngineDelegate().unregisterASPEngineListener(IASPEngineListener var1);
// Listen for performance data callbacks.
mStreamView.getASPEngineDelegate().registerStatisticsListener(IStatisticsListener var1);
mStreamView.getASPEngineDelegate().unregisterStatisticsListener(IStatisticsListener var1);
// Listen for system permission requests.
mStreamView.registerSystemPermissionListener(IRequestSystemPermissionListener listener);
mStreamView.unregisterSystemPermissionListener(IRequestSystemPermissionListener listener);

3. API Layanan

API

Deskripsi

enableVDAgentCheck(boolean enabled)

Menentukan apakah akan memeriksa ketersediaan VDAgent saat membangun koneksi. Pemeriksaan ini diaktifkan secara default.

Jika parameter ini diatur ke true dan VDAgent tidak tersedia selama pembentukan koneksi, kesalahan dilaporkan dan koneksi diputus.

Kami menyarankan agar Anda tidak mengatur parameter ini ke false. Pengaturan ini hanya ditujukan untuk pengujian internal.

enableRTC(boolean enabled)

Menentukan apakah akan menggunakan Real-Time Communication (RTC) untuk mengirimkan data streaming. Fitur ini diaktifkan secara default.

enableDesktopMode(boolean enabled)

Menentukan apakah akan mengaktifkan mode desktop. Saat diaktifkan, semua pesan sentuh dikonversi menjadi event mouse dan dikirim ke server. Kami menyarankan agar Anda mengatur parameter ini ke false untuk Cloud Phone.

scaleStreamVideo(ScaleType scaleType)

Menentukan metode penskalaan untuk aliran video. Untuk informasi lebih lanjut mengenai nilai ScaleType, lihat bagian 5.1 ScaleType.

setVideoProfile(int width, int height, int fps, IRemoteResult result)

Mengatur resolusi dan laju frame aliran video. Pengaturan laju frame saat ini belum didukung.

boolean sendKeyEvent(KeyEvent event)

dan

sendKeyboardEvent(KeyEvent event, IRemoteResult result)

Mengirim event keyboard ke cloud.

boolean simulateMouseClick(boolean leftButton)

Meniru event klik mouse. Atur parameter ke true untuk klik kiri atau false untuk klik kanan.

boolean enableMouseMode(boolean enabled)

Mengaktifkan atau menonaktifkan mode mouse.

boolean sendMouseEvent(MotionEvent motionEvent)

dan

sendMouseEvent(MotionEvent motionEvent, IRemoteResult result)

Mengirim event mouse ke cloud.

reconnect(String connectionToken)

Panggil metode ini untuk melakukan reconnect setelah pemutusan tak terduga.

Aksi ini biasanya dilakukan ketika kode alasan pemutusan adalah 2200. Aplikasi harus memanggil OpenAPI untuk mendapatkan token koneksi baru untuk Cloud Phone dan meneruskannya ke metode ini.

boolean setMediaStreamPlayer(MediaStreamPlayer player)

Mengganti engine media default di SDK dengan engine kustom yang disediakan oleh aplikasi. Metode ini hanya dapat dipanggil sebelum aliran dimulai atau setelah aliran dihentikan.

void setAlignStreamResolutionWithSurfaceSize(boolean aligned)

Menentukan apakah akan secara otomatis menyelaraskan resolusi aliran dengan ukuran SurfaceView sisi klien yang digunakan untuk rendering saat aliran dimulai. Fitur ini diaktifkan secara default. Kami menyarankan agar Anda menonaktifkan fitur ini untuk Cloud Phone.

void mute(boolean muted)

Menentukan apakah akan membisukan aliran audio.

void enableStatistics(boolean enabled)

Menentukan apakah akan mengaktifkan statistik performa.

mStreamView.getASPEngineDelegate().requestIFrame()

Meminta keyframe.

mStreamView.getASPEngineDelegate() under

registerFileTransferListener(IFileTransferListener var1)

dan

unregisterFileTransferListener(IFileTransferListener var1)

dan

mStreamView.getASPEngineDelegate().uploadFiles(pathList, "/sdcard/Download/");

Menyediakan metode untuk unggah dan unduh file. Untuk implementasi contoh, lihat demo.

in mStreamView.getASPEngineDelegate()

addDataChannel(DataChannel var1)

dan

removeDataChannel(DataChannel var1)

Mengirim dan menerima data melalui saluran data kustom bersamaan dengan aliran video. Untuk implementasi contoh, lihat demo.

In mStreamView.getASPEngineDelegate()

addLyncChannel(LyncChannel var1)

dan

removeLyncChannel(LyncChannel var1)

Menyediakan saluran untuk mengirim perintah adb. Untuk implementasinya, lihat AspAdbUtil dalam demo.

void setToQualityFirst()

Mengatur aliran ke mode quality-first. Dalam mode ini, laju frame maksimum adalah 30 FPS dan kualitas gambar diatur ke excellent. Mode ini saat ini belum didukung untuk Cloud Phone.

void setToFpsFirst()

Mengatur aliran ke mode FPS-first. Dalam mode ini, laju frame maksimum adalah 60 FPS dan kualitas gambar diatur ke good. Mode ini saat ini belum didukung untuk Cloud Phone.

void setToCustomPicture(int fps, int quality);

Mengatur mode kustom di mana Anda dapat menentukan laju frame dan kualitas gambar.

Parameter fps menentukan laju frame dan menerima nilai dari 0 hingga 60. Nilai yang lebih tinggi menghasilkan aliran yang lebih halus.

Parameter quality menentukan kualitas gambar dan menerima nilai dari 0 hingga 4. Nilai-nilai tersebut merepresentasikan tingkat kualitas berikut: 0 untuk lossless, 1 untuk excellent, 2 untuk good, 3 untuk fair, dan 4 untuk auto. Mode ini saat ini belum didukung untuk Cloud Phone.

mStreamView.getASPEngineDelegate()

registerIMEListener, unregisterIMEListener, setImeType, enableRelativeMouse, etc.

Saat ini belum didukung untuk Cloud Phone.

4. Detail parameter

4.1 Config

Parameter berikut digunakan untuk membangun koneksi.

Kunci konfigurasi

Jenis nilai

Deskripsi

StreamView.CONFIG_DESKTOP_ID

string

ID instans. Ini adalah ResourceId yang dikembalikan oleh API DescribeUserResources.

StreamView.CONFIG_CONNECTION_TICKET

string

Tiket otentikasi koneksi. Dapatkan ini dengan memanggil API GetConnectionTicket.

StreamView.CONFIG_PREFER_RTC_TRANSPORT

boolean

Gunakan saluran RTC. Kami menyarankan mengatur ini ke true untuk Cloud Phone.

StreamView.CONFIG_ENABLE_VDAGENT_CHECK

boolean

Menentukan apakah akan memeriksa ketersediaan VDAgent selama pembentukan koneksi. Kami menyarankan mengatur ini ke true untuk Cloud Phone.

StreamView.CONFIG_ENABLE_STATISTICS

boolean

Menentukan apakah akan mengaktifkan statistik performa. Jika diaktifkan, data performa akan ditampilkan di atas aliran video. Kami menyarankan mengatur ini ke true untuk Cloud Phone.

OSType

string

Untuk Cloud Phone, nilainya adalah android.

4.2 StatisticsInfo

Berisi data performa.

API

Jenis

Deskripsi

mReceiveFps

int

Laju frame yang diterima

mRenderFps

int

Laju frame rendering

mDownstreamBandwithMBPerSecond

double

Bandwidth downstream

mUpstreamBandwithMBPerSecond

double

Bandwidth upstream

mP2pFullLinkageLatencyMS

long

Latensi end-to-end full-link. Sudah tidak digunakan lagi.

mNetworkLatencyMS

long

Latensi jaringan RTT

mPingGatewayRttMS

long

Latensi Ping RTT

mLostRate

double

Laju packet loss

mServerRenderLatencyMS

long

Latensi rendering sisi server

mServerEncoderLatencyMS

long

Latensi encoding sisi server

mServerTotalLatencyMS

long

Total latensi sisi server

mTotalDownstreamBandwidth

long

Total bandwidth

mGuestCpuUsage

long

Penggunaan CPU image

mStreamType

String

Jenis protokol aliran

5. Jenis enumerasi

5.1 ScaleType

Menentukan jenis penskalaan untuk konten gambar yang dialirkan.

Nama

Makna

FILL_STREAM_VIEW

Selalu meregangkan gambar yang dialirkan hingga berukuran sama dengan StreamView. Jika rasio aspek StreamView berbeda dari gambar yang dialirkan, kebijakan ini dapat menyebabkan distorsi gambar yang terlihat jelas. 

FIT_STREAM_CONTENT

Menyesuaikan area rendering StreamView sehingga selalu merender konten gambar yang dialirkan dengan rasio aspek yang sama. Dengan kebijakan ini, gambar yang dialirkan mungkin tidak mengisi seluruh StreamView.

5.1 Izin sistem

Jenis Izin Sistem

Nama

Makna

RECORDAUDIO

Meminta izin untuk merekam audio.

6. MediaStreamPlayer Kustom

Catatan

Anda dapat melewati bagian ini jika tidak perlu menyesuaikan multimedia. SDK menyediakan implementasi multimedia default.

6.1 Gunakan engine media kustom untuk memproses data media

Dengan mengimplementasikan `com.aliyun.wuying.aspsdk.aspengine.MediaStreamPlayer`, aplikasi Anda dapat menggunakan engine media kustom untuk memproses data media streaming. Data ini mencakup hal-hal berikut:

  • Data aliran video: Aliran video mentah yang terutama terdiri dari frame terkompresi H.264 atau H.265.

  • Data aliran gambar adaptif: Aliran gambar yang terutama terdiri dari bitmap.

  • Data audio downstream: Aliran data audio downstream yang terutama terdiri dari data Opus atau PCM.

  • Data kursor: Saat mode mouse virtual diaktifkan, aplikasi menerima data posisi dan gambar kursor. Aplikasi dapat menggunakan data ini untuk merender kursor virtual.

Anda dapat memberikan implementasi engine media kustom ke WUYING SDK dengan memanggil API `IASPEngine.setMediaStreamPlayer`.

6.2 MediaStreamPlayer

`MediaStreamPlayer` adalah kelas abstrak. Kelas ini mengharuskan aplikasi Anda mengimplementasikan metode inisialisasi dan penghapusan global serta menyediakan implementasi kustom untuk memproses berbagai jenis data media.

image.png

Di mana:

  • Antarmuka `IVideoStreamHandler` mendefinisikan metode untuk memproses data aliran video.

  • Antarmuka `IAdaptiveGraphicStreamHandler` mendefinisikan metode untuk memproses data aliran gambar adaptif.

  • Antarmuka `IAudioPlaybackStreamHandler` mendefinisikan metode untuk memproses data audio downstream.

  • Antarmuka `ICursorBitmap` mendefinisikan metode untuk memproses data kursor.

Anda dapat memilih untuk mengimplementasikan satu atau beberapa antarmuka di atas. WUYING SDK menentukan jenis aliran yang dikirim dari cloud berdasarkan implementasi antarmuka yang Anda berikan. Aturannya sebagai berikut:

  • Jika Anda menyediakan implementasi untuk `IVideoStreamHandler` dan `IAdaptiveGraphicStreamHandler`, aliran diatur ke mode campuran. WUYING secara otomatis beralih antara aliran gambar adaptif dan aliran video berdasarkan skenario saat ini.

  • Jika Anda hanya menyediakan implementasi untuk `IVideoStreamHandler`, aliran diatur hanya untuk aliran video. Dalam kasus ini, server hanya menyediakan data aliran video.

  • Jika aplikasi hanya menyediakan implementasi untuk IAudioPlaybackStreamHandler, aliran diatur ke aliran gambar, dan sisi server hanya mengirim data gambar.

Anda dapat menyediakan implementasi kustom untuk berbagai data media ke SDK dengan mengimplementasikan 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, engine media kustom menyediakan implementasi untuk `IVideoStreamHandler` dan `IAudioPlaybackStreamHandler`. Metode `onCreateXXXHandler` hanya dieksekusi sekali selama proses streaming.

Alur pemanggilan metode utama adalah sebagai berikut:

image

6.2.1 initialize

Anda dapat mengimplementasikan metode ini untuk melakukan tindakan inisialisasi global untuk engine media kustom.

Metode ini dieksekusi sekali selama setiap proses streaming.

public ErrorCode initialize()

Nilai kembalian:

Jenis

Deskripsi

ErrorCode

ErrorCode.OK menunjukkan bahwa inisialisasi berhasil. Jika tidak, inisialisasi gagal.

6.2.2 release

Anda dapat mengimplementasikan metode ini untuk melakukan tindakan pelepasan global untuk engine media kustom.

Metode ini dieksekusi sekali selama setiap proses streaming.

public ErrorCode release()

Nilai kembalian:

Jenis

Deskripsi

ErrorCode

ErrorCode.OK menunjukkan bahwa pelepasan berhasil. Jika tidak, pelepasan gagal.

6.2.3 enableStatistics

Anda dapat mengimplementasikan metode ini untuk mengaktifkan atau menonaktifkan pengumpulan statistik performa.

public void enableStatistics(boolean enabled)

Parameter:

Parameter

Jenis

Deskripsi

enabled

boolean

True menunjukkan bahwa pengumpulan data performa diaktifkan.

False menunjukkan bahwa pengumpulan data performa dinonaktifkan.

6.2.4 onCreateVideoStreamHandler

Anda dapat mengimplementasikan metode ini untuk menyediakan implementasi engine media ke SDK guna memproses data aliran video.

Metode ini dieksekusi sekali selama setiap proses streaming.

public IVideoStreamHandler onCreateVideoStreamHandler()

Nilai kembalian:

Jenis

Deskripsi

IVideoStreamHandler

Implementasi engine media yang disediakan oleh aplikasi untuk memproses data aliran video.

Jika aplikasi tidak menyediakan implementasi pemrosesan aliran video, metode ini mengembalikan null. Dalam kasus ini, data aliran video tidak diproses.

6.2.5 onCreateAdaptiveGraphicStreamHandler

Anda dapat mengimplementasikan metode ini untuk menyediakan implementasi engine media ke SDK guna memproses data aliran gambar adaptif.

Metode ini dieksekusi sekali selama setiap proses streaming.

public IAdaptiveGraphicStreamHandler onCreatAdaptiveGraphicStreamHandler()

Nilai kembalian:

Jenis

Deskripsi

IAdaptiveGraphicStreamHandler

Implementasi engine media yang disediakan oleh aplikasi untuk memproses data aliran gambar adaptif.

Jika aplikasi tidak menyediakan implementasi pemrosesan aliran gambar adaptif, metode ini mengembalikan null. Dalam kasus ini, data aliran gambar tidak diproses.

6.2.6 onCreateAudioPlaybackStreamHandler

Anda dapat mengimplementasikan metode ini untuk menyediakan implementasi engine media ke SDK guna memproses data audio downstream.

Metode ini dieksekusi sekali per proses streaming.

public IAudioPlaybackStreamHandler onCreatAudioPlaybackStreamHandler()

Nilai kembalian:

Jenis

Deskripsi

IAudioPlaybackStreamHandler

Implementasi engine media yang disediakan oleh aplikasi untuk memproses data audio downstream.

Jika aplikasi tidak menyediakan implementasi pemrosesan data audio downstream, metode ini mengembalikan null. Dalam kasus ini, data audio downstream tidak diproses.

6.2.7 onCreateCursorBitmapHandler

Anda dapat mengimplementasikan metode ini untuk menyediakan implementasi engine media ke SDK guna memproses data kursor.

Metode ini dieksekusi sekali selama setiap proses streaming.

Implementasi antarmuka yang disediakan oleh metode ini hanya digunakan ketika mode mouse virtual diaktifkan.

public ICursorBitmapHandler onCreatCursorBitmapHandler()

Nilai kembalian:

Jenis

Deskripsi

ICursorBitmapHandler

Implementasi engine media yang disediakan oleh aplikasi untuk memproses data kursor.

Jika aplikasi tidak menyediakan implementasi pemrosesan data kursor, metode ini mengembalikan null. Dalam kasus ini, meskipun mode mouse virtual diaktifkan, data posisi kursor tidak diproses.

6.3 IVideoStreamHandler

Antarmuka ini mendefinisikan metode utama untuk memproses data aliran video. Alur kerja utamanya adalah sebagai berikut:

image

Ketika aplikasi beralih antara latar depan dan latar belakang, `Surface` yang digunakan untuk rendering dihancurkan atau dibangun ulang. Dalam kasus ini, `IVideoStreamHandler.setVideoSurface` dipanggil beberapa kali. Ketika `Surface` dihancurkan, objek surface yang diteruskan melalui `setVideoSurface` bernilai null. Aplikasi Anda harus menangani toleransi kesalahan decoder dan renderer.

Dengan mengimplementasikan metode `IVideoStreamHandler.setEventHandler`, aplikasi Anda dapat memperoleh antarmuka penanganan event yang disediakan oleh WUYING SDK. Melalui antarmuka ini, aplikasi Anda dapat memberi tahu WUYING SDK tentang event pemrosesan video yang terjadi dalam engine media kustom. Saat ini terutama digunakan untuk statistik 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;
            // Notify the WUYING SDK that a video frame has been rendered. The SDK calculates the client-side end-to-end latency based on the frameId.
            mHandler.callback(event);
        }
    }

6.3.1 setEventHandler

Anda dapat mengimplementasikan metode ini. Saat engine media kustom dimuat oleh WUYING SDK, SDK menyediakan `EventHandler` ke aplikasi Anda melalui metode ini. Anda dapat menggunakan handler ini untuk mengirim event pemrosesan aliran video.

public void setEventHandler(EventHandler handler)

Parameter:

Parameter

Jenis

Deskripsi

handler

EventHandler

Objek handler yang disediakan oleh WUYING SDK. Aplikasi menggunakan objek ini untuk mengirim event pemrosesan aliran video ke SDK.

6.3.2 addVideoTrack

Anda dapat mengimplementasikan metode ini. Saat aliran video dibuat, aplikasi Anda diberi tahu melalui metode ini.

Saat ini, hanya satu aliran video yang dapat ada dalam satu proses streaming.

ErrorCode addVideoTrack(int trackId, VProfile profile);

Parameter:

Parameter

Jenis

Deskripsi

trackId

int

ID aliran video.

profile

VProfile

Informasi aliran video.

Nilai kembalian:

Jenis

Deskripsi

ErrorCode

ErrorCode.OK menunjukkan keberhasilan. Jika tidak, operasi gagal.

6.3.3 setVideoSurface

Anda dapat mengimplementasikan metode ini. Saat status `Surface` yang digunakan untuk rendering video berubah, aplikasi Anda diberi tahu melalui metode ini.

ErrorCode setVideoSurface(int trackId, Surface surface);

Parameter:

Parameter

Jenis

Deskripsi

trackId

int

ID aliran video.

surface

android.view.Surface

Objek Surface yang digunakan untuk rendering video.

Objek ini mungkin bernilai null ketika aplikasi dialihkan ke latar belakang atau layar dikunci.

Nilai kembalian:

Jenis

Deskripsi

ErrorCode

ErrorCode.OK menunjukkan keberhasilan. Jika tidak, operasi gagal.

6.3.4 playVideo

Anda dapat mengimplementasikan metode ini. Saat aliran video siap, aplikasi Anda diberi tahu melalui metode ini.

ErrorCode playVideo(int trackId);

Parameter:

Parameter

Jenis

Deskripsi

trackId

int

ID aliran video.

Nilai kembalian:

Jenis

Deskripsi

ErrorCode

ErrorCode.OK menunjukkan keberhasilan. Jika tidak, operasi gagal.

6.3.5 removeVideoTrack

Anda dapat mengimplementasikan metode ini. Saat aliran video dihancurkan, aplikasi Anda diberi tahu melalui metode ini.

ErrorCode removeVideoTrack(int trackId);

Parameter:

Parameter

Jenis

Deskripsi

trackId

int

ID aliran video.

Nilai kembalian:

Jenis

Deskripsi

ErrorCode

ErrorCode.OK menunjukkan keberhasilan. Jika tidak, operasi gagal.

6.3.6 pushVideoFrame

Anda dapat mengimplementasikan metode ini. Saat frame video baru diterima, aplikasi Anda diberi tahu melalui metode ini.

ErrorCode setVideoSurface(int trackId, Surface surface);

Parameter:

Parameter

Jenis

Deskripsi

trackId

int

ID aliran video.

frame

VFrame

Informasi tentang frame video yang baru diterima.

Nilai kembalian:

Jenis

Deskripsi

ErrorCode

ErrorCode.OK menunjukkan keberhasilan. Jika tidak, operasi gagal.

6.3.7 getVideoTracks

Anda dapat mengimplementasikan metode ini. SDK memanggil metode ini untuk mengambil informasi tentang semua aliran video yang sedang diproses dari aplikasi Anda.

HashMap<Integer, VProfile> getVideoTracks();

Nilai kembalian:

Jenis

Deskripsi

HashMap<Integer, VProfile>

Informasi tentang semua aliran video yang sedang diproses oleh aplikasi.

6.3.8 release

Anda dapat mengimplementasikan metode ini. Saat semua aliran video dihancurkan, aplikasi Anda diberi tahu melalui metode ini untuk melakukan tindakan pembersihan.

ErrorCode release();

Nilai kembalian:

Jenis

Deskripsi

ErrorCode

ErrorCode.OK menunjukkan keberhasilan. Jika tidak, operasi gagal.

6.4 IAudioPlaybackStreamHandler

Antarmuka ini mendefinisikan metode utama untuk memproses data aliran audio. Alur kerja utamanya adalah sebagai berikut:

image

6.4.1 initAudio

Anda dapat mengimplementasikan metode ini. Saat saluran audio dibuat di SDK, aplikasi Anda diberi tahu melalui metode ini.

ErrorCode initAudio();

Nilai kembalian:

Jenis

Deskripsi

ErrorCode

ErrorCode.OK menunjukkan keberhasilan. Jika tidak, operasi gagal.

6.4.2 deInitAudio

Anda dapat mengimplementasikan metode ini. Saat saluran audio di SDK dihancurkan, aplikasi Anda diberi tahu melalui metode ini.

ErrorCode deInitAudio();

Nilai kembalian:

Jenis

Deskripsi

ErrorCode

ErrorCode.OK menunjukkan keberhasilan. Jika tidak, operasi gagal.

6.4.3 startAudioPlayback

Anda dapat mengimplementasikan metode ini. Saat komputer cloud akan mengirim aliran audio, aplikasi Anda diberi tahu melalui metode ini.

ErrorCode startAudioPlayback();

Nilai kembalian:

Jenis

Deskripsi

ErrorCode

ErrorCode.OK menunjukkan keberhasilan. Jika tidak, operasi gagal.

6.4.4 stopAudioPlayback

Anda dapat mengimplementasikan metode ini. Saat komputer cloud berhenti mengirim aliran audio, aplikasi Anda diberi tahu melalui metode ini.

ErrorCode stopAudioPlayback();

Nilai kembalian:

Jenis

Deskripsi

ErrorCode

ErrorCode.OK menunjukkan keberhasilan. Jika tidak, operasi gagal.

6.4.5 pushAudioPlaybackFrame

Anda dapat mengimplementasikan metode ini. Saat frame audio downstream baru diterima, aplikasi Anda diberi tahu melalui metode ini.

ErrorCode pushAudioPlaybackFrame(AFrame pbData);

Parameter:

Parameter

Jenis

Deskripsi

pbData

AFrame

Informasi tentang frame audio yang baru diterima.

Nilai kembalian:

Jenis

Deskripsi

ErrorCode

ErrorCode.OK menunjukkan keberhasilan. Jika tidak, operasi gagal.

6.4.6 updateAudioPlaybackVol

Anda dapat mengimplementasikan metode ini. Saat volume sistem di komputer cloud berubah, aplikasi Anda diberi tahu melalui metode ini.

ErrorCode updateAudioPlaybackVol(int volume);

Parameter:

Parameter

Jenis

Deskripsi

volume

int

Nilai volume sistem di Cloud Phone. Nilai maksimum adalah USHRT_MAX. Nilai 0 menunjukkan mute.

Nilai kembalian:

Jenis

Deskripsi

ErrorCode

ErrorCode.OK menunjukkan keberhasilan. Jika tidak, operasi gagal.

6.4.7 updateAudioPlaybackMute

Anda dapat mengimplementasikan metode ini. Saat komputer cloud dimute atau unmute, aplikasi Anda diberi tahu melalui metode ini.

ErrorCode updateAudioPlaybackMute(int mute);

Parameter:

Parameter

Jenis

Deskripsi

mute

int

Nilai 1 menunjukkan bahwa Cloud Phone dimute. Nilai 0 menunjukkan bahwa Cloud Phone tidak dimute.

Nilai kembalian:

Jenis

Deskripsi

ErrorCode

ErrorCode.OK menunjukkan keberhasilan. Jika tidak, operasi gagal.

6.4.8 release

Anda dapat mengimplementasikan metode ini. Saat saluran audio dihancurkan, aplikasi Anda diberi tahu melalui metode ini untuk melakukan tindakan pembersihan.

ErrorCode release();

Nilai kembalian:

Jenis

Deskripsi

ErrorCode

ErrorCode.OK menunjukkan keberhasilan. Jika tidak, operasi gagal.

6.5 IAdaptiveGraphicStreamHandler

Antarmuka ini mendefinisikan metode utama untuk memproses data aliran gambar. Alur kerja utamanya adalah sebagai berikut:

image

Saat ini, format frame gambar yang diperoleh aplikasi adalah bitmap ARGB8888.

Hanya satu aliran gambar yang dapat ada dalam satu proses streaming.

6.5.1 setAdaptiveGraphicSurface

Anda dapat mengimplementasikan metode ini. Saat status `Surface` yang digunakan untuk rendering gambar berubah, aplikasi Anda diberi tahu melalui metode ini.

ErrorCode setAdaptiveGraphicSurface(Surface surface);

Parameter:

Parameter

Jenis

Deskripsi

surface

android.view.Surface

Objek Surface yang digunakan untuk rendering gambar.

Objek ini mungkin bernilai null ketika aplikasi dialihkan ke latar belakang atau layar dikunci.

Nilai kembalian:

Jenis

Deskripsi

ErrorCode

ErrorCode.OK menunjukkan keberhasilan. Jika tidak, operasi gagal.

6.5.2 invalidateAdaptiveGraphicSurface

Anda dapat mengimplementasikan metode ini. Saat data frame gambar baru diterima, aplikasi Anda diberi tahu melalui metode ini.

ErrorCode invalidateAdaptiveGraphicSurface(Region region, byte[] buffer, BitmapFormat format);

Parameter:

Parameter

Jenis

Deskripsi

region

Region

Informasi tentang area gambar yang akan digambar.

buffer

byte[]

Data frame gambar.

format

BitmapFormat

Informasi format frame gambar. Default-nya adalah ARGB8888.

Nilai kembalian:

Jenis

Deskripsi

ErrorCode

ErrorCode.OK menunjukkan keberhasilan. Jika tidak, operasi gagal.

6.5.3 release

Anda dapat mengimplementasikan metode ini. Saat aliran gambar dihancurkan, aplikasi Anda diberi tahu melalui metode ini untuk melakukan tindakan pembersihan.

ErrorCode release();

Nilai kembalian:

Jenis

Deskripsi

ErrorCode

ErrorCode.OK menunjukkan keberhasilan. Jika tidak, operasi gagal.

6.6 ICursorBitmapHandler

Antarmuka ini mendefinisikan metode utama untuk memproses data kursor. Saat mode mouse virtual diaktifkan, Anda dapat menyediakan implementasi antarmuka ini ke SDK untuk merender kursor. Alur kerja utamanya adalah sebagai berikut:

image

6.6.1 setCursorBitmap

Anda dapat mengimplementasikan metode ini. Saat bentuk kursor di komputer cloud berubah, aplikasi Anda diberi tahu melalui metode ini.

ErrorCode setCursorBitmap(CursorBitmap bitmap);

Parameter:

Parameter

Jenis

Deskripsi

bitmap

CursorBitmap

Data bentuk kursor Cloud Phone.

Nilai kembalian:

Jenis

Deskripsi

ErrorCode

ErrorCode.OK menunjukkan keberhasilan. Jika tidak, operasi gagal.

6.6.2 unsetCursorBitmap

Anda dapat mengimplementasikan metode ini. Saat kursor di komputer cloud disembunyikan, aplikasi Anda diberi tahu melalui metode ini.

ErrorCode unsetCursorBitmap();

Nilai kembalian:

Jenis

Deskripsi

ErrorCode

ErrorCode.OK menunjukkan keberhasilan. Jika tidak, operasi gagal.

6.6.3 setCursorPosition

Anda dapat mengimplementasikan metode ini. Saat posisi kursor di komputer cloud berubah, aplikasi Anda diberi tahu melalui metode ini.

ErrorCode setCursorPosition(float x, float y);

Parameter:

Parameter

Jenis

Deskripsi

x

float

Koordinat X kursor.

y

float

Koordinat Y kursor.

Nilai kembalian:

Jenis

Deskripsi

ErrorCode

ErrorCode.OK menunjukkan keberhasilan. Jika tidak, operasi gagal.

6.6.4 release

Anda dapat mengimplementasikan metode ini. Saat koneksi terputus dan tampilan kursor dibatalkan, aplikasi Anda diberi tahu melalui metode ini untuk melakukan tindakan pembersihan.

ErrorCode release();

Nilai kembalian:

Jenis

Deskripsi

ErrorCode

ErrorCode.OK menunjukkan keberhasilan. Jika tidak, operasi gagal.

7. Kode kesalahan

Kode kesalahan

Pesan kesalahan (%s merepresentasikan Cloud Phone atau aplikasi cloud)

Modul pendefinisi

Penyebab

2-26 terutama berkaitan dengan masalah jaringan.

2

Gagal terhubung ke %s.

ASP SDK

MAGIC tidak valid.

3

Gagal terhubung ke %s.

ASP SDK

Data salah.

4

Versi client dan server tidak cocok.

ASP SDK

Ketidakcocokan versi.

5

Koneksi memerlukan TLS.

ASP SDK

TLS diperlukan.

6

Koneksi tidak memerlukan TLS.

ASP SDK

TLS digunakan padahal tidak diperlukan.

7

Anda tidak memiliki izin untuk terhubung ke %s saat ini.

ASP SDK

Masalah izin.

8

ASP SDK

ID client tidak valid selama migrasi.

9

Gagal terhubung ke %s.

ASP SDK

Saluran tidak ada.

20

Gagal terhubung ke server ASP.

ASP SDK

Kesalahan koneksi saluran.

21

Kesalahan autentikasi TLS.

ASP SDK

Kesalahan autentikasi TLS.

22

Gagal terhubung ke %s.

ASP SDK

Kesalahan tautan saluran.

23

Gagal terhubung ke %s.

ASP SDK

Kesalahan autentikasi koneksi.

24

Gagal terhubung ke %s.

ASP SDK

Kesalahan I/O koneksi.

25

Gagal terhubung ke %s.

ASP SDK

Verifikasi tiket gagal. Kesalahan ini juga terjadi jika Anda mencoba membangun koneksi lagi dengan tiket yang sama setelah pengguna terputus.

26

ASP SDK

Handshake xquic gagal.

Pemutusan atau kesalahan

2000

Waktu habis saat mengambil data dari %s. Terputus dari server.

ASP SDK

Pemutusan normal.

2001

%s telah terputus dari server. Hal ini mungkin karena proses %s dipaksa dihentikan.

ASP SDK

Umumnya, proses aplikasi sisi client dihentikan, misalnya ketika pengguna Android menekan tombol Home.

2002

Pengguna lain telah terhubung ke %s saat ini dari terminal berbeda. Silakan coba lagi nanti.

ASP SDK

Pengguna lain telah mengambil alih koneksi.

2003

%s sedang dimatikan atau dimulai ulang. Biasanya ini merupakan operasi administrator. Silakan coba lagi nanti.

ASP SDK

Cloud Phone dimatikan atau dimulai ulang, biasanya oleh administrator.

2004

Koneksi pengguna saat ini telah terputus.

ASP SDK

Client memulai pemutusan, atau server memulai kick-out atau pemutusan.

2005

%s telah terputus karena waktu habis akibat batas waktu penggunaan yang ditetapkan administrator tercapai.

ASP SDK

Terputus karena batas waktu penggunaan yang ditetapkan administrator.

2010

Gagal terhubung ke %s.

ASP SDK

Koneksi VDAgent gagal.

2011

Parameter koneksi yang diteruskan salah.

ASP SDK

Parameter yang diteruskan untuk koneksi server salah.

2027

Mode penarikan aliran telah diubah.

ASP SDK

Mode penarikan aliran diubah dari preemption ke collaboration, atau dari collaboration ke preemption.

2100

Izin clipboard ditolak dari %s ke lokal.

ASP SDK

Izin clipboard ditolak dari VM ke lokal.

2101

Izin clipboard ditolak dari lokal ke %s.

ASP SDK

Izin clipboard ditolak dari lokal ke VM.

2200

%s sedang mencoba melakukan reconnect...

ASP SDK

Koneksi terputus karena masalah jaringan. ASP SDK sedang melakukan reconnect.

2201

Terjadi pengecualian jaringan pada perangkat Anda, dan %s telah terputus.

ASP SDK

Koneksi terputus karena masalah jaringan. ASP SDK tidak mendukung reconnect karena masalah image. Sisi aplikasi memulai reconnect.

2202

Waktu reconnect %s habis. Periksa jaringan perangkat Anda dan coba lagi.

ASP SDK

Waktu reconnect ASP SDK habis.

Kesalahan logika sisi client

5100

Koneksi ke Server ASP untuk %s waktu habis. Silakan coba lagi nanti.

Sisi aplikasi

Client tidak menerima event connected dalam periode tertentu.

5102

Waktu habis saat mengambil data dari %s. Silakan coba lagi nanti.

Sisi aplikasi

Client menerima event connected tetapi tidak menerima event display dalam periode tertentu.

5004

Terjadi kesalahan pada client. Silakan buka kembali.

Sisi aplikasi

Parameter startup yang diteruskan ke client salah. Hal ini umumnya terjadi selama fase pengembangan.

5200

Waktu reconnect client habis. Silakan coba lagi nanti.

Sisi aplikasi

8. FAQ

Bagaimana cara me-restart Cloud Phone?

Panggil API management RebootInstances untuk me-restart instans. Hal ini akan memutus koneksi klien ke Cloud Phone. Setelah instans direstart, Anda harus melakukan reconnect ke Cloud Phone dari klien.

Repositori Maven eksternal

Repositori Maven eksternal saat ini belum didukung, tetapi Anda dapat mengunggah library AAR SDK ke repositori Maven Anda sendiri.

Perintah ADB umum

Fungsi

Perintah

Back key

input keyevent KEYCODE_BACK

Home key

input keyevent KEYCODE_HOME

Switch key

input keyevent KEYCODE_APP_SWITCH

Mute

input keyevent 164

Volume up

input keyevent KEYCODE_VOLUME_UP

Volume down

input keyevent KEYCODE_VOLUME_DOWN

Sembunyikan navigation bar

setprop persist.wy.hasnavibar false; killall com.android.systemui

Tampilkan navigation bar

setprop persist.wy.hasnavibar true; killall com.android.systemui

Ambil tangkapan layar

screencap -p /sdcard/Download/abc.png