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
Anda dapat mengunduh AndroidSDK_aar.
Anda dapat mengunduh AndroidSDK_demo.
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
1.3 Praktik terbaik
Untuk informasi selengkapnya, lihat praktik terbaik integrasi cepat Cloud Phone. Gambar berikut menjelaskan proses integrasi Cloud Phone.
Terdapat beberapa metode login untuk mendapatkan tiket yang dibutuhkan SDK guna terhubung ke Cloud Phone. Bagan alir berikut menunjukkan proses tersebut.
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:
Definisikan dan inisialisasi StreamView. Untuk informasi selengkapnya, lihat bagian 2.1.
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);Bind StreamView ke IAspEngine. API ini merender aliran pada tampilan saat ini.
mStreamView.bindASPEngine(engine);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
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.

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:
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:
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:
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:
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:
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 ( | 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 |