Bản lưu ngày / Snapshot of 2026-10-12 · Xem bản mới nhất / See the latest version
WanduraDocsBeta
BetaDocs đang ở bản beta và còn thay đổi. Thấy chỗ sai, khó hiểu hoặc còn thiếu? Hãy cho chúng tôi biết.
Bạn đang đọc một bản tài liệu cũ: v1 · Sang bản mới nhất (v2)
Lịch sử thay đổi

Lịch sử: Player SDK trên Android

Mọi lần sửa trang này, mới nhất ở trên. Mở từng mục để xem đã đổi gì.

← Player SDK trên Android

  1. 02/10/2026 · +55 −19 dòng
    Xem thay đổi
    - // Wandura playback in an Android app (Kotlin 1.9+, kotlinx.coroutines, kotlinx.serialization). Reviewed by hand:
    - // the docs CI has no Kotlin compiler and only checks that brackets balance.
    - // Guide: https://docs.wandura.ai/developers/player-sdk/android
    - //
    - // The app never talks to Wandura and never holds an API key. It talks to YOUR backend, which applies your paywall
    - // and asks Wandura for tickets. Only `PlayerSdk` touches the Player SDK: fill it in with the calls named in the
    - // Player SDK guide (partner.wandura.ai → Developers → Player SDK).
    - package com.example.wandura
    + # Player SDK trên Android
      
    - import kotlinx.coroutines.CoroutineScope
    - import kotlinx.coroutines.launch
    - import kotlinx.serialization.SerialName
    - import kotlinx.serialization.Serializable
    - import java.time.Instant
    + > **TL;DR** — Thêm `com.bytedanceapi:ttsdk-player_standard:1.52.100.5` bằng Gradle (API level 16+, Java 8, `armeabi-v7a`/`arm64-v8a`), đặt tệp giấy phép Wandura gửi bạn vào assets, khởi động SDK, và đọc hai giá trị thiết bị sau khi qua bước kiểm giấy phép. App gửi chúng về backend **của bạn**, nhận lại vé, và đưa vé cho SDK. Khi SDK báo lỗi, xin **một** vé mới rồi phát tiếp.
      
    - // #region sdk
    + ## Điều kiện cần {#prerequisites}
    + 
    + | | |
    + |---|---|
    + | Giấy phép | Tệp `.lic` và App ID từ Wandura, gắn với package name **chính thức** của bạn. Xem [Player SDK](index.md#licence). |
    + | Công cụ | Gradle, Android API level 16 trở lên, Java 8, ABI `armeabi-v7a` hoặc `arm64-v8a`. Quyền `INTERNET`, `WAKE_LOCK`, `ACCESS_NETWORK_STATE`, `ACCESS_WIFI_STATE`. |
    + | Thiết bị | Một điện thoại Android thật để phát nội dung mã hoá. |
    + | Backend của bạn | Một endpoint xin vé: [Luồng playback và paywall](../guides/playback-flow.md). |
    + 
    + Các lệnh gọi SDK chính xác (khởi động, kiểm giấy phép, giá trị thiết bị, playback, phụ đề) nằm trong hướng dẫn Player SDK ở partner.wandura.ai → **Developers** → **Player SDK**. Wandura đã kiểm chứng trọn vẹn luồng này trên iOS; trên Android, luồng làm theo hướng dẫn của nhà cung cấp, nên hãy chia sẻ kết quả test đầu tiên trong kênh của bạn.
    + 
    + ## Luồng trong app của bạn {#flow}
    + 
    + 1. **Khởi động SDK** lúc mở app bằng App ID và tệp giấy phép, và kiểm giấy phép trước khi làm bất cứ việc gì khác.
    + 2. **Đọc giá trị thiết bị** (device ID → `union_info`, device public key → `drm_kek`). Không bao giờ gửi `null`, `"(null)"` hay chuỗi rỗng: hãy ném lỗi (throw) thay vào đó.
    + 3. **Gọi backend của bạn** để phát tập. Backend áp paywall của bạn rồi xin Wandura; app của bạn không bao giờ giữ API key.
    + 4. **Phát**: đưa `vid` và `play_auth_token` cho SDK; thêm phụ đề.
    + 5. **Tải trước** các tập kế tiếp bằng các vé prefetch mà backend trả về.
    + 6. **Khi có bất kỳ lỗi SDK nào** (kể cả vé hết hạn): xin **một** vé mới và phát tiếp tại đúng vị trí. Đừng rẽ nhánh theo mã lỗi SDK, và đừng lặp.
    + 7. **Khi app quay lại (resume)**: nếu vé hiện tại còn dưới một phút, hãy thay vé trước khi phát tiếp.
    + 
    + ## Code {#code}
    + 
    + Tệp bên dưới là phía app của luồng đó, viết bằng Kotlin. Chỉ `PlayerSdk` chạm vào SDK: hãy điền vào đó các lệnh gọi lấy từ hướng dẫn trên portal. Dạng response của backend khớp với [các ví dụ backend Node và Python](../guides/playback-flow.md#code).
    + 
    + ### SDK đứng sau một interface {#code-sdk}
    + 
    + ```kotlin
      data class DeviceValues(val unionInfo: String, val drmKek: String)
      
    ⋯
          var onError: ((Throwable) -> Unit)?
      }
    - // #endregion sdk
    + ```
      
    - // #region contract
    + ### Hợp đồng với backend của bạn {#code-backend}
    + 
    + ```kotlin
      @Serializable
      data class Subtitle(val lang: String, val url: String, val format: String)
    ⋯
          suspend fun play(filmId: String, episodeNo: Int, device: DeviceValues): PlayResponse
      }
    - // #endregion contract
    + ```
      
    - // #region controller
    + ### Bắt đầu, prefetch, hết hạn vé, lỗi {#code-controller}
    + 
    + ```kotlin
      sealed interface ScreenState {
          data object Loading : ScreenState
    ⋯
          )
      }
    - // #endregion controller
    + ```
    + 
    + ## Checklist {#checklist}
    + 
    + - [ ] Bước kiểm giấy phép phải qua trước khi đọc giá trị thiết bị.
    + - [ ] Giá trị thiết bị khi gửi không bao giờ là `null`, `"(null)"` hay rỗng.
    + - [ ] App không chứa key `wnd_live_` nào (tìm trong APK/AAB đã build).
    + - [ ] `play_auth_token` chỉ được giữ trong bộ nhớ: không nằm trong `SharedPreferences`, log hay crash report.
    + - [ ] Lỗi SDK dẫn tới một vé mới và phát tiếp, không bao giờ thành vòng lặp.
    + - [ ] Phát tiếp sau hơn 29 phút thì thay vé trước.
    + - [ ] Tập không có phụ đề vẫn phát mà không báo lỗi.
    + 
    + ## Liên quan {#related}
    + 
    + - [Tổng quan Player SDK và giấy phép](index.md)
    + - [Phát mượt khi tải cao](../guides/smooth-playback.md#in-the-app)
    + - [Phụ đề](../guides/subtitles.md)
  2. 02/10/2026 · Tạo trang
↑↓ chọnEnter mởEsc đóng

Gửi góp ý

Góp ý được gửi thẳng tới đội Wandura, kèm địa chỉ trang này.

0 / 4000