Android SDK và Media3 gốc
Tải về Android trình phát với điều khiển in-video, danh sách nhạc có thể kéo, lưu khả năng xáo trộn/repeat và tiếp tục tắt. DRM-X bản địa Media3.
Thử Android trình phát#
1.0.0-preview.12 · 7.02 MB · Android 6.0+ (API 23+) · DRM-X 6.0 Player · Cập nhật 2026-09-14
- Mở trang này ra. Android điện thoại và tải về APK.
- Mở tập tin đã tải về. Android yêu cầu, cho phép cài đặt từ trình duyệt hay bộ quản lý tập tin bạn dùng, rồi vỗ chân Cài đặt.
- Mở DRM-X 6.0 Bộ phátHãy kết nối với nhau, và vỗ vào video Phát Nút. Ứng dụng yêu cầu giấy phép truyền tải khi bạn bấm phím Play.
- Mở Thiết lập để chọn chất lượng, âm thanh, chú thích hoặc tốc độ phát lại. Hãy quay điện thoại để tiếp tục trên màn hình đầy đủ.
- Gõ Tải về cho video hiện thời hay Tải về danh sách nhạc cho tất cả VOD mục tải về dùng bản sao chép được hỗ trợ cao nhất lên tới 1080p trên L1hay là 480p. L3. Chơi trò chơi nhập vai mở danh sách nhạc cục bộ hoàn thành với mục kế tiếp/trước, xáo trộn, lặp lại và chơi tự động; Lên mạng đi. trở lại danh sách nhạc đầy đủ. Mới Làm mới lại giấy phép đã chọn trong khi kết nối.
Việc tải về phương tiện đã xếp hàng vẫn còn nằm trong nền. Android Dừng ứng dụng trong khi chuẩn bị giấy phép hay dấu vết, mở lại nó trong khi kết nối để chuẩn bị xong các mục còn lại. Giữ lại việc tải về có sẵn. Phát lại điện thoại ngoài chỉ dùng phương tiện đã lưu tạm; chưa hoàn thành hay đã hết hạn cần thiết hoàn tất hay mới lại.
Widevine cung cấp lỗiMedia3 6002) Bây giờ hãy sử dụng một bản chuyển tiếp chứng nhận chứng thực máy chủ cho dịch vụ Google chính thức. L3 CDM có thể nhận được SD Một thiết bị không hoạt động Widevine Thực hiện cần sửa chữa phần mềm/ thiết bị; không thể thêm bằng lái còn thiếu DRM hỗ trợ.
Mẫu APK đã được công khai và đã ký để đánh giá. AAR đầy đủ SDK Bên dưới vẫn còn sẵn sàng thông qua tài khoản bàn điều khiển thích hợp. Giữ ứng dụng sản xuất riêng của bạn ký khóa và đăng nhập hậu phương riêng từ chứng minh này.
APK checksum và USB cài đặt
SHA-256:
8fa044b82c0abab7ce2a987f349524fd7ad1e78f3c897771f4764cb2aa521180Với Android Công cụ nền tảng và quyền hạn USB thiết bị:
adb install -r drmx-android-player-1.0.0-preview.12.apkCài đặt APK trên mẫu chính thức đã có mà không bỏ cài đặt nó. Cùng một phím ký và ứng dụng tương tự ID Bảo tồn việc tải về, giấy phép ngoại tuyến, lưu vị trí và sở thích riêng. Nếu nhà riêng của bạn sử dụng phím ký khác, hãy sử dụng ứng dụng riêng. ID để giữ cả hai ứng dụng và bảo tồn giấy phép ngoại tuyến của mẫu.
Có gì mới không? Android trình phát xem thử.12#
Phát hành ngày 14 tháng 9 năm 2026. Widevine Giấy phép đã hết hạn hoặc có một phút hoặc ít hơn còn lại. Media3 lỗi 6004, a HTTP Lỗi khi được kết nối, hoặc a DNS Lỗi khi bị ngắt kết nối.
Hạt trình phát Giấy phép hợp lệ giữ thời gian phát lại còn lại của họ; giấy phép hết hạn cho thấy Kết nối và khởi động lại. giấy phép xác thực và các quy tắc bảo vệ vẫn còn được thiết bị thực hiện. Chẩn đoán cũng bao gồm số điện thoại HTTP Trạng thái khi thao tác mạng bị lỗi, mà không phơi bày tiêu đề yêu cầu, địa chỉ URL hay câu trả lời cấp giấy phép.
- Cài đặt ô xem thử.12 trên ứng dụng chính thức đã có. Giữ dữ liệu ứng dụng hiện thời và tải về.
- Nếu WayMaker hay một video khác được tải về cần được thay đổi, kết nối đến internet, chọn video đó và tap Mới.
- Đợi Giấy phép mới, sẵn sàng chơi ngoài giờ.thì chọn đi. Chơi trò chơi nhập vaiĐoạn video được mã hóa vẫn được tải về.
Bản phát hành này giữ lại ô xem thử. 11 và tính năng danh sách phát nhạc. Ứng dụng đánh giá công cộng và nhúng của nó trình phát xác định ô xem thử. 12; bàn điều khiển phân chia SDK vẫn còn xem thử. 10 / Gói 20260910.8.
Có gì mới không? Android trình phát xem thử.11#
Ứng dụng đánh giá này bao gồm những ứng dụng mới nhất trình phát Điều khiển và danh sách nhạc cải tiến, với một phong cách tương tác nhất định trên chúng tôi Android và táo trình phát.
- Điều khiển bên trong video: Giữa Play/Puse, Back and next cho các danh sách nhạc đa công, CC, Thiết lập và nút toàn màn hình. Việc điều khiển ẩn sau hai giây đang bật; hãy gõ đoạn video để hiển thị lại chúng.
- Thiết lập dây và phát lại: dùng CC để hiển thị hoặc ẩn phụ đề sẵn sàng, và Thiết lập để chọn ngôn ngữ phụ đề, âm thanh, tốc độ phát lại và chất lượng cho phép. Các lựa chọn ngoại tuyến chỉ dùng các đường dẫn trong việc tải về.
- Kéo để sắp xếp lại: kéo thanh xử lý của mục nhập để thay đổi vị trí của nó. Thứ tự đã lưu sống sót sau khi khởi chạy lại ứng dụng và được phản ánh trong danh sách nhạc đã tải về. Sắp xếp lại để giữ cho video được bật. Hãy gõ vào điều khiển để có thể truy cập lên / di chuyển xuống hành động.
- Lưu xáo trộn và lặp lại: Chế độ đã chọn sẽ được tô sáng và sống sót khi khởi chạy lại bằng phát lại trực tuyến và tắt. Với xáo trộn và lặp lại cả hai, các video theo thứ tự đã lưu và dừng lại sau mục cuối cùng. Trình đơn danh sách nhạc « Chơi hành động tiếp theo đã bị gỡ bỏ.
- Tiếp tục ở nơi bạn dừng lại: mỗi video được lưu VOD vị trí đã được khôi phục khi bạn quay lại để truyền hoặc tải về. Tiến trình được lưu trên thiết bị này cho trình xem hiện thời; nó không đồng bộ hoá giữa các thiết bị.
Hạt trình phát Các thay đổi đã được kiểm tra trên một chiếc tàu Samsung S24 Siêu, bao gồm cả danh sách nhạc kéo lê trong khi phát lại, lưu thứ tự sau khi khởi động lại, tiếp tục phát lại và tải về với dữ liệu Wi-Fi và điện thoại bị tắt. Xem mạng vẫn cần phải tải về đầy đủ và sử dụng giấy phép ngoại tuyến không cần thiết.
Phiên bản này cập nhật đánh giá công chúng APKBàn điều khiển được phân phối riêng SDK còn lại 1.0.0-preview.10gói 20260910.8; các hướng dẫn tích hợp tồn tại bên dưới liên quan đến gói đó.
1. Chọn đường dẫn đến sự kết hợp#
Dùng DrmXPlayer, mẫu điện thoại và bộ quản lý ngoại tuyến. Hãy giữ quy tắc đăng nhập và kinh doanh riêng.
PATH B_· KEEP YOUR UIMedia3 + DRM-X Trợ giúpGiữ một tập tin đã có trình phát Hãy để DrmXviline quản lý các giấy phép bền bỉ.
PATH C_BAR_ NATIVE ONLYMedia3 không có AARThực hiện cùng một hợp đồng hậu phương và giấy phép nhân sự sống bản xứ. DRM-X trình phát Sự phụ thuộc.
Tải ZIP hoặc AAR của SDK Android tại Console → Integrations. Tổ chức có gói Professional ($499/tháng) hoặc Enterprise đang hoạt động được phép tải xuống. Tài khoản Trial và Standard không được tải SDK. Tài liệu này, kể cả ví dụ Media3 gốc, được công khai; phát nội dung vẫn cần tài khoản có quyền, nội dung đã xuất bản và thiết bị tương thích.
Current preview: 1.0.0-preview.10 · customer bundle 20260910.8 · Media3 1.11.0. The ZIP contains a local Maven repository, Gradle wrapper, annotated README, phone/TV/native samples, an installable phone sample APK in apks/, and offline integration notes. It contains no customer credentials or protected movies.
2. Chuẩn bị nội dung và hậu phương#
- Gói và xuất bản a Widevine- Mã hóa tương ứng DASH tiêu đề trong của bạn DRM-X Môi trường, sao chép chính xác Xuất bản Content ID.
- Cấu hình máy phục vụ của bạn Environment ID, Site Key và Access KeySử dụng tải về được PHP Sự kết hợp cho một điểm bắt đầu làm việc.
- Thao tác đăng nhập và kiểm tra phúc lợi người dùng. Ứng dụng của bạn gọi hậu phương của bạn bằng biểu tượng người dùng ngắn hạn; hậu phương chọn nội dung, chính sách và URL đáng tin cậy.
- Chạy phát lại trực tuyến đầu tiên trên vật lý WidevineChỉ thêm mục tiêu ngoài luồng sau khi hợp đồng được thực hiện.
| Đổi giá trị này | Nơi nó thuộc về | Nghĩa là |
|---|---|---|
| chỉ tiêu phiên chạy | Android | Của bạn HTTPS Điểm kết thúc phát lại, không phải máy chủ bằng lái thô URL. |
| Tắt điểm | Androidchỉ ngắt kết nối | Điểm kết thúc thu thập/mới của bạn. |
| Nội dung | Android yêu cầu; thẩm tra hậu phương | Bản được xuất bản được bảo vệ Content ID người xem có quyền truy cập. |
| Huy hiệu truy cập khách hàng | Ứng dụng bộ nhớ sau khi đăng nhập | Huy hiệu người dùng ngắn hạn của bạn, không bao giờ là Site Key hay Access Key. |
| Environment ID, Site Key, Access Key | Chỉ cấu hình bí mật máy phục vụ | DRM-X tài khoản thông tin xác thựcĐừng bao giờ vận chuyển chúng vào một APK, HTML hay kiểm soát nguồn. |
| Danh sách chính sách và đáng tin cậy URL | Hậu phương | Quyền lợi kinh doanh và bản đồ gói hàng. Đừng nhận những thứ này từ ứng dụng. |
3. Cài đặt và chạy SDK#
Open the extracted ZIP's root folder in Android Studio. Use JDK 17, Android SDK 36 and Android Gradle Plugin 9.2.0; the included wrapper uses Gradle 9.4.1. Minimum device API is 23. Build dependencies require internet access. Select samples.phone and Run. Its initial values use the public demo backend and title; follow its sign-in and streaming controls before switching to your own backend.
# Windows
gradlew.bat :samples:phone:assembleDebug
# macOS / Linux
sh gradlew :samples:phone:assembleDebug
Đối với một ứng dụng đã có, sao chép ZIPCủa maven/ thư mục vào gốc dự án của bạn. In settings.gradle.kts:
dependencyResolutionManagement {
repositories {
maven { url = uri(rootDir.resolve("maven")) }
google()
mavenCentral()
}
}
Trong môđun ứng dụng của bạn build.gradle.kts:
dependencies {
implementation("com.haihaisoft.drmx:drmx-universal-player:1.0.0-preview.10")
}
Cài đặt đứng yên AAR thay vào đó
Để cái AAR trong môđun ứng dụng của bạn libs/Một căn hộ AAR không có giải quyết quan hệ phụ thuộc tự động, vì vậy thêm ba phù hợp Media3 tự phụ thuộc vào mình. Đừng cài đặt cả hai mẫu.
implementation(files("libs/drmx-universal-player-1.0.0-preview.10.aar"))
implementation("androidx.media3:media3-exoplayer:1.11.0")
implementation("androidx.media3:media3-exoplayer-dash:1.11.0")
implementation("androidx.media3:media3-ui:1.11.0")Vào AndroidManifest.xmlCho phép truy cập Internet và tắt bản sao lưu cho mẫu nhỏ tối thiểu này. Trong một ứng dụng sản xuất cần bản sao lưu, đặc biệt loại bỏ siêu dữ liệu giấy phép tắt của thiết bị.
<uses-permission android:name="android.permission.INTERNET" />
<application android:allowBackup="false" android:usesCleartextTraffic="false" ... >
Tìm kiếm mẫu điện thoại MainActivity.kt Vì drmx.sessionEndpoint, drmx.offlineEndpoint, drmx.contentId và customer.loginEndpoint. Hãy thay đổi thiết lập hậu phương đã ghi rõ, hoặc gởi những bổ sung chủ ý này từ ứng dụng của bạn sau khi đăng nhập. customer.accessToken lúc chạy. ZIP README Giải thích mỗi tham số và các móc chứng minh để thay thế.
Xây dựng một thử thách APK sử dụng AAR#
Ví dụ này sử dụng dự án điện thoại có thể chạy từ đầy đủ SDK ZIP và rõ ràng liên kết các đứng một AARCách tiếp cận tương tự cũng hoạt động với một phương pháp đã có Android ứng dụng.
- Download and extract the full Android SDK ZIP. Open its root folder in Android Studio.
- Keep
libs/drmx-universal-player-1.0.0-preview.10.aarin the extracted root. Use JDK 17, Android SDK 36 and the included Gradle wrapper. - Vào
samples/phone/build.gradle.kts, thay thế DRM-X Quan hệ phụ thuộc với các mục sau đây bên trongdependenciesGiữ những tập tin xây dựng còn lại.
implementation(files(rootProject.file("libs/drmx-universal-player-1.0.0-preview.10.aar")))
implementation("androidx.media3:media3-exoplayer:1.11.0")
implementation("androidx.media3:media3-exoplayer-dash:1.11.0")
implementation("androidx.media3:media3-ui:1.11.0")
Bỏ implementation("com.haihaisoft.drmx:drmx-universal-player:1.0.0-preview.10") Cũng vậy thôi. SDK Không bao gồm cả hai lần. AAR cần cả ba. Media3 quan hệ phụ thuộc được hiển thị bên trên.
- Để giữ bản lập trình đã tải về cùng với bản thử nghiệm của bạn xây dựng, thay đổi môđun điện thoại
applicationIdphảicom.example.drmxtestĐể lại vùng tên không thay đổi cho mẫu đã cung cấp này. - Xây dựng APKsau đó cài đặt nó trên a USB-đã kết nối Android thiết bị có USB Có quyền gỡ lỗi.
# Windows, from the extracted SDK root
gradlew.bat :samples:phone:assembleDebug
adb install -r samples/phone/build/outputs/apk/debug/phone-debug.apk
# macOS / Linux
sh gradlew :samples:phone:assembleDebug
adb install -r samples/phone/build/outputs/apk/debug/phone-debug.apk
Mở ứng dụng thử và trò chơi tap. Nguồn điện thoại cung cấp sử dụng cùng một chứng minh công cộng. Để thử ra tiêu đề riêng, hãy thay thế phiên chạy/ đầu/ trang đã đánh dấu, rồi xuất bản. Content ID in MainActivity.kt, và cung cấp xác thực ngắn hạn cho người dùng của bạn trong lúc chạy. Máy chủ của bạn giữ Site Key và Access Key.
Cái điều khiển gọn gàng đến từ DrmXPlayerView trong AARHoạt động được cung cấp cho thấy tốc độ Play-to-fite, quay trả lời, tải chủ sở hữu, phát lại và tái tạo. ví dụ tích hợp điều khiển Bên dưới khi thêm ô xem này vào ứng dụng của riêng bạn.
4. yêu cầu máy phục vụ và chính sách mặc định#
Hạt Android Ứng dụng yêu cầu hậu phương của bạn cho phiên chạy phát lại. Hậu phương của bạn xác thực người dùng, xác nhận quyền lợi, bản đồ Content ID để xuất bản các phương tiện truyền thông và cuộc gọi DRM-XThấy chưa? Phiên chạy phát lại API cho toàn bộ hợp đồng truyền tải.
{
"contentId": "YOUR-PUBLISHED-CONTENT-ID",
"contentType": "vod",
"drmSystem": "widevine",
"playbackMode": "streaming",
"platformCapabilities": {
"clientPlatform": "android",
"drmSystems": ["widevine"], "manifestTypes": ["dash"],
"maximumHeight": 1080, "secureDecoder": false, "persistentState": false
}
}
Các khả năng bảo thủ trên không xác nhận Widevine L1Sử dụng SDKTrợ giúp khả năng của bạn, hoặc đánh giá thiết bị của riêng bạn, cho các thiết bị thật. Khả năng khách hàng hỗ trợ sự lựa chọn tương thích; họ không bao giờ cung cấp quyền lợi chất lượng.
Hạt PHP mặc định ví dụ multi-tier-standard cho phát lại trực tuyến. Hãy chọn chính sách được ghi chép bằng một phím khi gói này sử dụng một phím. Chính sách của bạn phải khớp với mô hình khóa và quyền của người xem. Thay đổi cấu hình máy phục vụ hay của nó. DRMX_LICENSE_POLICY_TEMPLATE thiết lập môi trường, không phải tham số truy vấn trong trình phátThấy chưa? Chính sách chứng nhận.
playback_policy.persistent để đúng trong chính sách đã trình phục vụ và chọn giấy phép, cho thuê, phát lại và thay đổi thời gian. Tài liệu tham khảo dùng 7 ngày / 3 / 48 giờ / 7 ngày; đây là ví dụ quy tắc kinh doanh, không chấp nhận studio hay mặc định toàn nền. Trở lại siêu dữ liệu tương ứng. Widevine Bằng lái vẫn còn hiệu lực.Đường dẫn thứ nhất: chơi qua DrmXPlayer#
Bên trong hoạt động của bạn, tạo ra một PlayerViewDùng cửa sổ bảo mật và gọi prepare sau khi đăng nhập. The wrapper trao đổi phiên chạy, cấu hình Widevine@ info/ rich com.haihaisoft.drmx.player và AndroidX Media3.
val view = PlayerView(this)
setContentView(view)
DrmXPlayer.protectWindow(window)
val player = DrmXPlayer(this, view)
val capabilities = WidevineCapabilities.playbackCapabilities(
clientPlatform = "android",
displayMetrics = resources.displayMetrics,
applicationVersion = "1.0",
)
player.prepare(
endpoint = "https://customer.example/api/drmx/playback-session",
contentId = "YOUR-PUBLISHED-CONTENT-ID",
contentType = "vod", // use live only for a published live title
capabilities = capabilities,
customerAuthenticationHeaders = mapOf("Authorization" to "Bearer $userToken"),
)
// Keep player as an Activity/Fragment-owned field in your actual application.
// Stop when your playback lifecycle ends; close when the owner is destroyed.
// player.stop()
// player.close()
Đăng ký DrmXPlayerListener cho phép, sẵn sàng, chơi và sai lầm UIHiển thị mã lỗi an toàn thay vì bỏ đi các thẻ chứng nhận hoặc các chương trình trả lời. Hãy dùng mẫu điện thoại bao gồm để hoàn tất vòng đời, điều khiển toàn màn hình và tải xuống hàng đợi.
trình phát điều khiển và xoay không gián đoạn#
Gõ Phát trên video để bắt đầu quyền truy cập. Mở màn hình hay Thiết lập không có giấy phép phát thanh. Tạm dừng/ chủ đề, thay đổi thiết lập và xoay điện thoại để bảo tồn phiên chạy hiện thời.

| Điều khiển | Những gì khách hàng có thể làm |
|---|---|
| Chất lượng | Chọn tự động hay hỗ trợ, giải quyết có giấy phép từ danh sách. Tùy chọn không sẵn sàng giải thích được bằng lái hay thiết bị/DRM Tự động tuân theo những hạn chế tương tự. |
| Theo dõi âm thanh | Hãy chọn bất cứ ngôn ngữ âm thanh nào được gói cung cấp. |
| Phụ đềCC | Chọn ngôn ngữ phụ đề hoặc tắt. CC Nút xuất hiện khi có chú thích được hỗ trợ tồn tại và bật/tắt trực tiếp. |
| Hình ảnh độ xoay | Điều chỉnh phông chữ, màu và kích cỡ chữ, màu nền và độ mờ đục. Tùy thích được lưu vào thiết bị. |
| Tốc độ chơi lại/ giờ giấc | Chơi với tốc độ 0.25–2× hoặc tạm dừng tự động sau một khoảng đã chọn. |
| Tìm kiếm / Toàn màn hình | Xâm nhập dòng thời gian, tìm kiếm 10 giây, hoặc là hai bên. Xoay vào cảnh mà không cần khởi động lại. |
Ba hành động gọn gàng bên dưới hình ảnh là Tải về (Để ngắt kết nối) Chơi trò chơi nhập vai và Mới Bản quyền ngoại tuyến. Những mẫu tải xuống có khả năng phát âm video và các đường dẫn âm thanh/ tiêu đề được hỗ trợ; các trình đơn ngoại tuyến chỉ phơi bày truyền thông đã tải về. Renewal yêu cầu sự kết nối.
Bản ghi sao chép bên cạnh bộ chân trang thông tin sao chép các lỗi gần đây thành văn bản, vì vậy bạn có thể gửi hỗ trợ các chi tiết không chụp màn hình. Báo cáo chứa một báo cáo IDChiến dịch. SDK/AndroidPhiên bản/số hoá CDM/Media3 lỗi, khung chồng đã chọn, kết nối/ xuốngload/ lùi và đếm lại. Họ loại ra thông tin xác thựccác địa chỉ URL, phím, mã nhận diện khoá, dữ liệu giấy phép và đầy đủ CDM Đồ bỏ.
Mẫu được lưu giữ lại đến 32 báo cáo địa phương (64 KB) trong năm giờ. Khi được kết nối và ký tên, nó tải lên các lỗi đang chờ tới hậu phương được cấu hình của khách hàng, ít nhất một lần trong 30 giây. Máy phục vụ chứng minh công cộng giữ lại cảnh báo/ báo khủng bố trong năm giờ, kết hợp các sự kiện lặp đi lặp lại, kết nối tập tin tại 512 KB và cắt tỉa mỗi phút tiến bộ y tế và phát lại thành công không được ghi lại. drmx.diagnosticsEndpoint; chẩn đoán lỗi không bao giờ gián đoạn phát lại.
val player = DrmXPlayer(this)
val controls = DrmXPlayerView(this)
controls.bind(player) // Does not acquire a session or license.
controls.onPlayRequested = {
player.prepare(endpoint = sessionEndpoint, contentId = contentId,
capabilities = capabilities, customerAuthenticationHeaders = userHeaders)
}
controls.onFullScreenRequested = { /* resize the existing player view */ }
player.listener = object : DrmXPlayerListener {
override fun onAuthorizing(contentId: String) { controls.setPreparing(true) }
override fun onReady(info: DrmXPlaybackInfo) { controls.setPreparing(false) }
override fun onError(error: PlaybackSessionException) { controls.setPreparing(false) }
}
// Keep protectWindow(window) and the secure video surface.
// At final owner destruction: controls.unbind(); player.close()
Danh sách điện thoại cung cấp điều khiển định hướng và kích cỡ màn hình thay đổi; onConfigurationChanged Đổi kích thước cùng một hoạt động và trình phátHãy giữ cả hai phần khi thích nghi nó. Máy nào tái tạo hoạt động nên giữ lại chủ phát lại và gắn kết khung xem. Quá trình chết khác với xoay và cần khôi phục trạng thái bình thường. Các tùy chọn 4K/8K cần thiết nội dung tương ứng, giấy phép và thiết bị/DRM Hỗ trợ; các CDM vẫn có thẩm quyền.
Để chuẩn bị trình phát, dừng lại và thả bộ ngắt kết nối hoạt động DRM trước khi kiểm tra, tái tạo hoặc phát hành cùng một giấy phép bền bỉ. SDKCủa player.stopForOfflineLicenseOperation { /* call manager here */ } Chờ đợi cho Media3 Chuẩn bị phát hành lại các phương tiện truyền thông. stop() Hàng đợi hoạt động không đều. checkLicense() Trong khi cùng một bằng lái đang chơi; phát lại bản thân xác nhận của nó CDM Tình trạng. Mẫu đã cung cấp hiển thị toàn bộ tay ra và tắt các hành động chồng chéo trong khi thay đổi.
6, lấy bằng lái và tải xuống truyền thông#
val offlineManager = DrmXOfflineManager(applicationContext)
val capabilities = WidevineCapabilities.offlinePlaybackCapabilities(
clientPlatform = "android", // android-tv or android-automotive where applicable
displayMetrics = resources.displayMetrics,
applicationVersion = "1.0",
)
offlineManager.acquireLicense(
endpoint = offlineEndpoint,
contentId = contentId,
capabilities = capabilities,
customerAuthenticationHeaders = customerHeaders,
) { result ->
result.onSuccess { stored ->
// Next: select tracks <= stored.maximumHeight and queue their download.
// Acquisition alone does not download the video.
}.onFailure { /* show a safe retry/error state */ }
}
Hạt SDK tiết kiệm sương mù Widevine Bộ khoá ID và siêu dữ liệu không bí mật. CDM Cầm giữ bằng lái, nó không bền bỉ. DRM License Tokens, chìa khóa thô, thách thức hoặc bằng lái đáp ứng byte. com.haihaisoft.drmx.offline.licenses.v1.xml từ bản dự phòng.
Tạo ra một ứng dụng được sở hữu Media3 SimpleCacheBộ quản lý tải về và cơ sở dữ liệu. Dùng DownloadHelper với sự cấp phép của MediaItem và chọn phim bên trong maximumHeightVào Media3 1.11 cuộc gọi trở lại chuẩn bị là onPrepared(helper, tracksInfoUpdated)Mẫu điện thoại enqueueDownload và OfflineTestRuntime hiển thị các thực hiện chạy được.
// Inside DownloadHelper's prepared callback, after selecting licensed video:
helper.addAudioLanguagesToSelection("en", "zh-Hans", "zh")
helper.addTextLanguagesToSelection(true, "en", "zh-Hans", "zh")
val selected = helper.getDownloadRequest(offlineLicenseId, byteArrayOf())
val request = offlineManager.createDownloadRequest(contentId, selected.streamKeys)
downloadManager.addDownload(request)
helper.release()
Tải về tất cả các ngôn ngữ mà bạn định phơi bày ngoại tuyến. createDownloadRequest Không có phím luồng tải xuống mọi đường dẫn, thường là lãng phí cho video thích ứng. Hiển thị tiến trình tải về và đợi Download.STATE_COMPLETEDCho việc truyền tải quá trình sản xuất, tích hợp Media3 DownloadServiceGiới hạn lưu trữ và Android Yêu cầu xác thực dịch vụ/ ghi rõ; các hàng đợi chứng minh chạy trong tiến trình xử lý.
7. Đường dẫn B: phục hồi với những gì đã có Media3 trình phát#
Đọc toàn bộ việc tải về và sử dụng các phím dòng chính xác. Đống tải về và phát lại phải chia sẻ vị trí bộ nhớ tạm và bản đồ khóa. Ví dụ này cố ý tắt khả năng truy cập ngược dòng cho phát lại nghiêm ngặt:
val cacheOnly = CacheDataSource.Factory()
.setCache(downloadCache)
.setUpstreamDataSourceFactory(null)
val mediaSourceFactory = DefaultMediaSourceFactory(this)
.setDataSourceFactory(cacheOnly)
val nativePlayer = ExoPlayer.Builder(this)
.setMediaSourceFactory(mediaSourceFactory)
.build()
val completed = downloadIndex.getDownload(offlineLicenseId)
require(completed?.state == Download.STATE_COMPLETED)
val playback = offlineManager.createPlayback(contentId, streamKeys = completed!!.request.streamKeys)
nativePlayer.setMediaItem(playback.mediaItem)
nativePlayer.prepare()
nativePlayer.play()
// Release nativePlayer when the owner is destroyed.
Để sử dụng cùng dòng chảy ngoại tuyến với đường dẫn A, xây dựng DrmXPlayer Với cái này mediaSourceFactory và gọi player.prepareOffline(playback)Sự khôi phục bình thường sử dụng địa phương CDM Bằng lái mà không yêu cầu một thẻ mới. Một mục nhập bộ nhớ tạm còn thiếu nên tạo ra lỗi khi bị ngắt kết nối, chứ không phải bật âm thầm lên mạng.
Đường dẫn C: bản xứ Media3không DRM-X AAR#
You are not required to use DrmXPlayer or DrmXOfflineManager. Add the three Media3 dependencies from step 3 and implement the same customer backend contract. Use session.manifestUrl (not session.manifest.url), the returned license URL and bounded authorization headers. Apply the returned maximum height and handle streaming session release on stop, replacement, end, failure and destruction.
Hoạt động bản địa hoàn thành bên dưới được biên dịch như samples:native bên này SDK Phát hành, nó xử lý HTTPS, câu trả lời bị hạn chế đọc, giấy phép nền, câu trả lời cũ và sự ra mắt đặt chỗ. Thay thế điểm kết thúc đã đánh dấu.Content ID và cung cấp biểu tượng đăng nhập của riêng bạn. Ví dụ là điểm khởi đầu; thêm sự cập nhật sản phẩm của bạn, phù hợp với tài khoản và chu kỳ sống ứng dụng.
Hoàn tất hoạt động truyền tải bản địa (Kotlinkhông DRM-X Phụ thuộc
package com.haihaisoft.drmx.samples.nativeplayer
import android.app.Activity
import android.os.Bundle
import android.view.WindowManager
import android.widget.Button
import android.widget.LinearLayout
import android.widget.TextView
import androidx.media3.common.C
import androidx.media3.common.MediaItem
import androidx.media3.common.PlaybackException
import androidx.media3.common.Player
import androidx.media3.common.util.UnstableApi
import androidx.media3.exoplayer.ExoPlayer
import androidx.media3.ui.PlayerView
import org.json.JSONObject
import java.net.HttpURLConnection
import java.net.URI
import java.util.concurrent.Executors
import java.util.concurrent.atomic.AtomicBoolean
/** Complete native streaming example. No DRM-X AAR or server credentials. */
@UnstableApi
class MainActivity : Activity() {
private lateinit var player: ExoPlayer
private lateinit var status: TextView
private val worker = Executors.newSingleThreadExecutor()
private val closed = AtomicBoolean(false)
private var activeSession: JSONObject? = null
private var requesting = false
private var generation = 0
// CUSTOMIZE: use YOUR authenticated customer backend and Published Content ID.
// The sample can receive these after your application's login via Intent extras.
// Never replace the app login token with a DRM-X Site Key or Access Key.
private val endpoint get() = intent.getStringExtra("drmx.sessionEndpoint")
?: "https://customer.example/api/drmx/playback-session"
private val contentId get() = intent.getStringExtra("drmx.contentId") ?: "YOUR-PUBLISHED-CONTENT-ID"
private val customerToken get() = intent.getStringExtra("customer.accessToken").orEmpty()
override fun onCreate(state: Bundle?) {
super.onCreate(state)
window.addFlags(WindowManager.LayoutParams.FLAG_SECURE)
val root = LinearLayout(this).apply { orientation = LinearLayout.VERTICAL; fitsSystemWindows = true; setPadding(24, 24, 24, 24) }
status = TextView(this).apply { text = "Native Media3 · connect your backend, then Play"; textSize = 16f }
val view = PlayerView(this)
player = ExoPlayer.Builder(this).build(); view.player = player
root.addView(status)
root.addView(view, LinearLayout.LayoutParams(-1, 0, 1f))
root.addView(Button(this).apply { text = "Play protected video"; setOnClickListener { startPlayback() } })
root.addView(Button(this).apply { text = "Stop & release session"; setOnClickListener { stopPlayback() } })
setContentView(root)
player.addListener(object : Player.Listener {
override fun onPlayerError(error: PlaybackException) { status.text = "Playback error: ${error.errorCodeName}"; releaseSession() }
override fun onPlaybackStateChanged(state: Int) { if (state == Player.STATE_ENDED) releaseSession() }
})
}
private fun startPlayback() {
if (requesting) return
stopPlayback(); requesting = true; status.text = "Authorizing…"
val attempt = generation
val request = JSONObject().put("contentId", contentId).put("contentType", "vod")
.put("drmSystem", "widevine").put("playbackMode", "streaming")
.put("platformCapabilities", JSONObject().put("clientPlatform", "android")
.put("drmSystems", org.json.JSONArray(listOf("widevine")))
.put("manifestTypes", org.json.JSONArray(listOf("dash")))
.put("maximumHeight", 1080).put("secureDecoder", false).put("persistentState", false))
val headers = if (customerToken.isBlank()) emptyMap() else mapOf("Authorization" to "Bearer $customerToken")
worker.execute {
val result = runCatching { JSONObject(post(endpoint, request.toString(), headers)) }
runOnUiThread {
requesting = false
result.onSuccess { session ->
if (closed.get() || attempt != generation) { workerRelease(session); return@onSuccess }
// Keep release information even if contract validation fails.
activeSession = session
runCatching {
require(session.getInt("contractVersion") == 1 && session.getString("contentId") == contentId)
require(session.getString("drmSystem") == "widevine" && session.getString("playbackMode") == "streaming")
val drm = session.getJSONObject("drm")
require(drm.getString("system") == "widevine")
val maximumHeight = session.getJSONObject("policy").getInt("maximumHeight")
require(maximumHeight in 1..4320)
val mediaItem = MediaItem.Builder().setUri(https(session.getString("manifestUrl")))
.setMimeType("application/dash+xml")
.setDrmConfiguration(MediaItem.DrmConfiguration.Builder(C.WIDEVINE_UUID)
.setLicenseUri(https(drm.getString("licenseServerUrl")))
.setForceDefaultLicenseUri(true).setLicenseRequestHeaders(authorization(drm))
.setMultiSession(false).build()).build()
player.trackSelectionParameters = player.trackSelectionParameters.buildUpon()
.setMaxVideoSize(Int.MAX_VALUE, maximumHeight).setPreferredAudioLanguages("en")
.setTrackTypeDisabled(C.TRACK_TYPE_TEXT, true).build()
player.setMediaItem(mediaItem); player.prepare(); player.play()
status.text = "Native Media3 · protected playback"
}.onFailure { status.text = "Invalid session contract. Check your backend."; releaseSession() }
}.onFailure { if (!closed.get()) status.text = "Authorization failed. Check login, Content ID, policy, and network." }
}
}
}
private fun releaseSession() { activeSession?.let(::workerRelease); activeSession = null }
private fun workerRelease(session: JSONObject) {
// A bounded release may finish after Activity destruction, including a
// session response that arrived after the user left the screen.
Thread({ runCatching {
val release = session.getJSONObject("release")
val headers = if (release.has("authorization")) authorization(release)
else authorization(session.getJSONObject("drm"))
post(release.getString("url"), "", headers)
} }, "drmx-native-release").start()
}
private fun stopPlayback() { generation++; player.stop(); player.clearMediaItems(); releaseSession() }
override fun onStop() { stopPlayback(); super.onStop() }
override fun onDestroy() { closed.set(true); stopPlayback(); player.release(); worker.shutdown(); super.onDestroy() }
companion object {
fun https(url: String): String {
val uri = URI(url); require(uri.scheme == "https" && uri.host != null && uri.userInfo == null)
return url
}
fun authorization(drm: JSONObject): Map<String, String> {
val auth = drm.optJSONObject("authorization")
val name = auth?.getString("headerName") ?: "Authorization"
val scheme = auth?.getString("scheme") ?: drm.optString("tokenType", "Bearer")
val value = auth?.getString("value") ?: drm.getString("drmLicenseToken")
require(name.matches(Regex("^[A-Za-z0-9-]{1,64}$")) && scheme.matches(Regex("^[A-Za-z][A-Za-z0-9._-]{0,31}$")))
require(value.isNotBlank() && !value.contains('\r') && !value.contains('\n'))
return mapOf(name to "$scheme $value")
}
fun post(url: String, body: String, headers: Map<String, String>): String {
val connection = URI(https(url)).toURL().openConnection() as HttpURLConnection
try {
connection.requestMethod = "POST"; connection.instanceFollowRedirects = false
connection.connectTimeout = 5000; connection.readTimeout = 15000; connection.doOutput = true
connection.setRequestProperty("Content-Type", "application/json")
headers.forEach { (name, value) -> connection.setRequestProperty(name, value) }
connection.outputStream.use { it.write(body.toByteArray(Charsets.UTF_8)) }
require(connection.responseCode in 200..299) { "Customer request rejected" }
return connection.inputStream.use { stream ->
val output = java.io.ByteArrayOutputStream(); val buffer = ByteArray(8192)
while (true) {
val count = stream.read(buffer); if (count < 0) break
require(output.size() + count <= 1_048_576); output.write(buffer, 0, count)
}
output.toString("UTF-8")
}
} finally { connection.disconnect() }
}
}
}
Cho phép tắt máy bản xứ, sử dụng OfflineLicenseHelper.downloadLicensebộ chìa khóa mờ nhạt của nó ID Riêng tư và phục hồi với MediaItem.DrmConfiguration.Builder(C.WIDEVINE_UUID).setKeySetId(id). Những trình trợ giúp biên dịch này bao gồm việc lấy, khoảng thời gian kiểm tra, thay đổi, phát hành và tải xuống/ chơi lại mục. Nó là không phải là ứng dụng toàn bộ về nhà: bạn vẫn còn sở hữu bộ nhớ tạm, dịch vụ tải về, tiến trình, siêu dữ liệu, tổ hợp người dùng/ công cụ uy tín.
Người giúp đỡ bền bỉ bản địa (Kotlinkhông DRM-X Phụ thuộc
package com.haihaisoft.drmx.samples.nativeplayer
import android.content.Context
import android.util.Base64
import androidx.media3.common.C
import androidx.media3.common.MediaItem
import androidx.media3.common.StreamKey
import androidx.media3.common.util.UnstableApi
import androidx.media3.datasource.DefaultHttpDataSource
import androidx.media3.exoplayer.dash.DashUtil
import androidx.media3.exoplayer.drm.DrmSessionEventListener
import androidx.media3.exoplayer.drm.OfflineLicenseHelper
import androidx.media3.exoplayer.offline.DownloadRequest
import org.json.JSONObject
/** Native Media3 alternative: no DRM-X AAR. Call blocking operations on a worker.
* Application owns downloads/cache, user/device entitlement, progress and lifecycle.
* Never persist the session, request headers, tokens, challenges or license bytes.
*/
@UnstableApi
class NativeOfflineLicense(context: Context) {
private val storage = context.getSharedPreferences("native.offline.keysets", Context.MODE_PRIVATE)
private val upstream = DefaultHttpDataSource.Factory().setConnectTimeoutMs(10000).setReadTimeoutMs(20000)
// session is the validated response from YOUR offline-license-session endpoint.
fun acquire(session: JSONObject): ByteArray {
validate(session)
val contentId = session.getString("contentId")
require(!storage.contains(contentId)) { "Renew or release the stored license before acquiring again" }
val source = upstream.createDataSource()
val manifest = DashUtil.loadManifest(source, android.net.Uri.parse(MainActivity.https(session.getString("manifestUrl"))))
val format = DashUtil.loadFormatWithDrmInitData(upstream.createDataSource(), manifest.getPeriod(0))
?: error("Missing Widevine initialization data")
val helper = helper(session)
try {
val id = helper.downloadLicense(format)
save(contentId, id)
return id
} finally { helper.release() }
}
fun renew(contentId: String, freshSession: JSONObject) {
validate(freshSession); require(freshSession.getString("contentId") == contentId)
val helper = helper(freshSession)
try { save(contentId, helper.renewLicense(keySet(contentId))) } finally { helper.release() }
}
// Local CDM check only. No token or network license URI is used.
fun remainingSeconds(contentId: String): Pair<Long, Long> {
val config = MediaItem.DrmConfiguration.Builder(C.WIDEVINE_UUID).build()
val helper = OfflineLicenseHelper.newWidevineInstance(config, upstream, DrmSessionEventListener.EventDispatcher())
try {
val remaining = helper.getLicenseDurationRemainingSec(keySet(contentId))
return Pair(remaining.first, remaining.second)
} finally { helper.release() }
}
fun release(contentId: String, freshSession: JSONObject) {
validate(freshSession); require(freshSession.getString("contentId") == contentId)
val helper = helper(freshSession)
try {
helper.releaseLicense(keySet(contentId))
check(storage.edit().remove(contentId).commit())
} finally { helper.release() }
}
fun downloadRequest(contentId: String, downloadId: String, manifestUrl: String, streamKeys: List<StreamKey>): DownloadRequest {
require(streamKeys.isNotEmpty()) { "Select policy-compliant video, audio and subtitle tracks first" }
return DownloadRequest.Builder(downloadId, android.net.Uri.parse(MainActivity.https(manifestUrl)))
.setMimeType("application/dash+xml").setStreamKeys(streamKeys).setKeySetId(keySet(contentId)).build()
}
fun mediaItem(contentId: String, manifestUrl: String, streamKeys: List<StreamKey>): MediaItem = MediaItem.Builder()
.setUri(MainActivity.https(manifestUrl)).setMimeType("application/dash+xml").setStreamKeys(streamKeys)
.setDrmConfiguration(MediaItem.DrmConfiguration.Builder(C.WIDEVINE_UUID).setKeySetId(keySet(contentId)).build()).build()
private fun helper(session: JSONObject): OfflineLicenseHelper {
val drm = session.getJSONObject("drm")
// Use HTTP license headers, NOT Widevine optional key-request parameters.
val config = MediaItem.DrmConfiguration.Builder(C.WIDEVINE_UUID)
.setLicenseUri(MainActivity.https(drm.getString("licenseServerUrl")))
.setForceDefaultLicenseUri(true).setLicenseRequestHeaders(MainActivity.authorization(drm)).build()
return OfflineLicenseHelper.newWidevineInstance(config, upstream, DrmSessionEventListener.EventDispatcher())
}
private fun validate(session: JSONObject) {
require(session.getInt("contractVersion") == 1 && session.getString("playbackMode") == "offline")
require(session.getString("drmSystem") == "widevine" && session.getString("contentType") == "vod")
require(session.getJSONObject("policy").getBoolean("persistent"))
}
private fun keySet(contentId: String): ByteArray = Base64.decode(storage.getString(contentId, null)
?: error("No device-bound license for this content"), Base64.NO_WRAP)
private fun save(contentId: String, id: ByteArray) {
check(storage.edit().putString(contentId, Base64.encodeToString(id, Base64.NO_WRAP)).commit())
}
}
Trước khi gọi trợ lý cấp thấp này, xác nhận rằng phản ứng hậu phương mới phù hợp với yêu cầu Content IDthao tác, ký và xác thực giai đoạn xác thực. Kiên trì một thao tác ngoại tuyến và danh sách uy tín/ tập tin siêu dữ liệu cùng với bộ khoá IDKhông bao giờ là biểu tượng. Chạy các cuộc gọi trợ lý trên chỉ công nhân để lấy bằng lái HTTP đầu trang dùng setLicenseRequestHeaders trên DRM cấu hình; Widevine Tham số phần mềm phím tùy chọn là một bản đồ khác.
Sự kết hợp mới sẽ được dùng AndroidX Media3 DRM hỗ trợDi sản com.google.android.exoplayer2 Dự án nên theo sau hướng dẫn di trú chính thức; không pha trộn di sản và AndroidLớp X hoặc giả sử các mẫu biên dịch không thay đổi đối với các phiên bản cũ.
9 Kiểm tra, làm lại, phát hành và chuyển đổi ngôn ngữ#
These are separate actions. Run one at a time after the active offline DRM session has been released: use player.stopForOfflineLicenseOperation { /* one operation below */ } with DrmXPlayer, or release the existing native Media3 player first. Do not check a license while it is playing. A check is optional for displaying durations; it must not prevent renewal of an expired license.
offlineManager.checkLicense(contentId) { result ->
result.onSuccess { license ->
if (license.state == DrmXOfflineLicenseState.EXPIRED) {
// Require renewal online before offering offline playback.
}
}
}
offlineManager.renewLicense(offlineEndpoint, contentId, capabilities, customerHeaders) {
/* update duration and UI after success; show retry on failure */
}
// Only when the customer requests deletion/release:
offlineManager.releaseLicense(offlineEndpoint, contentId, capabilities, customerHeaders) {
/* after success, remove the corresponding encrypted download */
}
getStoredLicense đọc siêu dữ liệu; checkLicense Các truy vấn có thẩm quyền trên máy cục bộ CDM Thời gian mới/ thả lại cần thiết sự kết nối và quyền hạn hoạt động mới từ hậu phương của bạn. Việc xóa phương tiện không giải phóng bằng lái. Khi tắt, hãy thông báo lại cho kết nối tiếp theo thay vì báo cáo rằng máy phục vụ đã xác nhận nó. Đóng bộ quản lý khi người sở hữu nó bị hủy.
// Use player.media3Player for the DRM-X wrapper; nativePlayer for plain Media3.
nativePlayer.trackSelectionParameters = nativePlayer.trackSelectionParameters
.buildUpon()
.setPreferredAudioLanguages("en") // Chinese: "zh-Hans", "zh"
.setPreferredTextLanguages("en") // choose a packaged/downloaded language
.setTrackTypeDisabled(C.TRACK_TYPE_TEXT, false) // true = subtitles Off
.build()
Xây dựng sự lựa chọn từ các đường dẫn sẵn sàng và tắt các lựa chọn không sẵn sàng. Tùy chọn này không thể tạo một đường dẫn tiếng Anh không có trong gói. Người dùng ngoại tuyến chỉ có thể chọn ngôn ngữ đã tải về. Bảo trì nhà nước chứng nhận/cache qua màn hình; toàn bộ màn hình là một thay đổi xem/ luồng, không phải là lý do để lấy giấy phép khác.
10 Yêu cầu kết thúc cho phép ngoại tuyến#
Ứng dụng contentId, contentType: "vod", drmSystem: "widevine", playbackMode: "offline", operation: "acquire" | "renew" | "release", offlineLicenseId (Tiếng chuông để có được) và chân thật platformCapabilities. Kiểm tra xem mã số thay đổi / gỡ lỗi là của người dùng xác thực, thiết bị và nội dung. Chọn bên máy phục vụ chính sách, vấn đề mới DRM License Token và trả lại hợp đồng:
{
"contractVersion": 1, "playbackMode": "offline",
"offlineLicenseId": "YOUR-STABLE-USER-DEVICE-CONTENT-RECORD",
"contentId": "YOUR-PUBLISHED-CONTENT-ID", "contentType": "vod",
"drmSystem": "widevine",
"manifestUrl": "https://media.customer.example/title/manifest.mpd",
"authorizationExpiresAt": "YOUR-FRESH-UTC-EXPIRY",
"drm": {
"system": "widevine",
"licenseServerUrl": "https://license6.drm-x.com/v1/licenses/widevine",
"integrationMode": "direct-token",
"drmLicenseToken": "SHORT-LIVED-OPERATION-AUTHORIZATION",
"tokenType": "Bearer"
},
"policy": {
"persistent": true, "renewAllowed": true, "maximumHeight": 1080,
"allowedTrackTypes": ["AUDIO", "SD", "HD"],
"licenseDurationSeconds": 604800, "rentalDurationSeconds": 259200,
"playbackDurationSeconds": 172800, "renewalDurationSeconds": 604800
}
}
Đây là những người giữ chỗ giải thích, không phải đáp ứng bằng lái có thể tái sử dụng. Trả lại những giá trị mới từ thao tác thực tế. SDK cũng hỗ trợ integrationMode: "token-proxy" với một ràng buộc drm.authorization Kẻ hủy bỏ, trở lại. Cache-Control: no-store; không bao giờ đăng nhập thành công xác nhận. xem các có thể tải về SDKCủa OFFLINE_INTEGRATION.md và PHP Điểm cuối của mẫu để xử lý yêu cầu bê tông.
11. Kiểm tra thiết bị và bắn lỗi#
Widevine cung cấp và thử nghiệm mạng Trung Quốc
Đang sắp xếp để lấy chứng nhận thiết bị trước khi lấy giấy chứng nhận nội dung. Theo ô xem thử.9 chứng minh điện thoại gửi CDMYêu cầu kí tên của nó thông qua khách hàng xác thực của nó HTTPS Chuyển tiếp tới Google. Đáp ứng đã ký không thay đổi. Điều này có ích khi điện thoại không thể liên lạc trực tiếp với dịch vụ cung cấp của Google; các tiếp âm khách vẫn còn phải được liên lạc lại.
Trình cung cấp 2.0 sử dụng một hộp khóa nhà máy. Cung cấp 4. 0 sử dụng một mô hình nhận diện thiết bị khác nhau. Những phiên bản này tách biệt với L1/L3 Cấp độ an ninh, và trình phát Không đổi, mà đã được cung cấp rồi. L3 Điện thoại có thể chơi trong khi một điện thoại khác đợi thiết bị cung cấp. Các nguồn chính thức xem xét ở đây không chứng minh Trung Quốc chỉ hỗ trợ 2.0. Xem NXPHướng dẫn hợp nhất thiết bị và AndroidComment.
Xem thử. 10 báo cáo lỗi phân biệt trực tiếp hoặc chuyển tiếp, thời hạn/DNS/TLS/HTTP Thất bại. HTTP Tình trạng và thời gian trôi qua. provisioningModel: BootCertificateChain chỉ ra AOSP 4.0 mô hình; unknown hay other không xác định 2.0. PHP bản ghi bị từ chối nhập từ chối từ truy cập Google thất bại. thông tin xác thực và nhận dạng thiết bị độc đáo.
Cập nhật APK Ở đó hãy thử lại truyền tải và tải xuống mạng bị ảnh hưởng, rồi giữ lại bản sao chép và thời gian xấp xỉ. Vẫn còn lưu trữ các bản tải về và giấy phép. Một bản tiếp không thể phục hồi không sẵn sàng. Widevine hay thông tin xác thực Từ chối bởi thiết bị/Google. Cần thiết phải chấp nhận thực sự trên điện thoại bị ảnh hưởng.
Từ ô xem thử. 8, bản địa L2/L3 cấp không rõ Widevine Phát lại bị hạn chế SD (lên 576p) trước khi giải mã. Android Khả năng qua hậu phương: phiên chạy API Phần mềm hẹp Widevine Giấy phép đa phím cho âm thanh/SD Chìa khóa. PHP Mẫu bảo tồn các trường này và cũng là yêu cầu ngoại tuyến. SD Trình dịch và chính sách cho phép phần mềm DRM là cần thiết; các quy tắc bảo mật chỉ phần cứng và đồng bộ vẫn không thay đổi. Thiết lập sử dụng bảng trong suốt mà không làm mờ đoạn phim. cryptoErrorCode trong các báo cáo có lỗi an toàn.
| Thử / Triệu chứng | Mong đợi ứng xử / kiểm tra tiếp |
|---|---|
| SDK Tải về 403 | Chọn một tổ chức với tài liệu hướng dẫn hoạt động hay hệ thống Enterprise. Một tiến trình nâng cấp có kế hoạch sau khi thử không mở khóa SDK. |
| Phiên chạy 401 / 403 | Kiểm tra đăng nhập, phúc lợi xã hội, môi trường, được xuất bản Content ID Không bao giờ bỏ qua xác thực. |
| Lỗi ngoại tuyến nhưng hoạt động trực tuyến | Check CDM khoảng thời gian, tải về xong, vị trí bộ nhớ tạm, phím luồng và tất cả các phím đã được cấp phép. |
| Mất tiếng Anh/ Trung Quốc | Kiểm tra siêu dữ liệu ngôn ngữ gói, dấu chân thật và cách chọn ngôn ngữ ngoại tuyến. |
| L1, HDCP hoặc bộ giải mã thất bại | Kiểm tra phần cứng vật lý, sự cung cấp, mã hóa và yêu cầu xuất. Một chuỗi khả năng không phải là xác thực. |
| Khởi động lại, quay, nâng cấp | Giấy phép và bộ nhớ tạm bền bỉ tồn tại hỗ trợ thay đổi vòng đời mà không cần lấy bản sao. Không được phép sao lưu vào thiết bị mới. |
| Chế độ máy bay | Tắt luôn dữ liệu Wi-Fi và di động; khởi chạy lại ứng dụng, chơi cục bộ và chuyển đổi mọi ngôn ngữ đã hứa. |
| Hạn sử dụng, áp lực lưu trữ, chuyển đổi tài khoản | Hiển thị tình trạng không sẵn sàng/re mới rõ ràng, phục hồi các phương tiện không đầy đủ, và ép buộc người dùng/ công cụ truy cập mà không làm rò rỉ danh mục ngoại tuyến của người dùng khác. |
Kiểm tra từng điện thoại được hỗ trợ, máy tính bảng, Android TV/Google TV, Fire TV hay nhúng Android Mô hình WidevineGiải mã an toàn, mã hóa/giải quyết, HDCPHiển thị bên ngoài, thay đổi đồng hồ và ngắt kết nối lâu. Android thiết bị có cùng một DRM Nội dung Hollywood đòi hỏi sự bảo vệ và yêu cầu thiết bị quyền sở hữu, không chỉ là giải mã thành công.
Universal Player danh sách phát nhạc và điều khiển chia sẻ#
The Android preview.11 and later evaluation apps and current Android/Apple development sources share in-video Previous/Play-Pause/Next, CC, Settings and fullscreen controls with two-second hiding during playback. Android's playlist menu no longer includes “Play next”. Selected shuffle/repeat settings remain highlighted and persist across restarts. With both off, playback follows the saved playlist order and stops at the final video. Drag handles reorder items without restarting the current video; the saved order also applies to the downloaded playlist. These latest source APIs are not yet included in the Console's preview.10 SDK bundle.
Cung cấp cùng khách/ xem storageNamespace phải DrmXPlayer và playerView.storageNamespace trước khi cài đặt danh sách nhạc. VOD tiến trình được lưu thường xuyên và tạm dừng/ Dừng, sau đó phục hồi cho điều đó Content ID trong truyền tải hay tải về. Phát lại trực tiếp không dùng lưu VOD vị trí đã tải về. Việc tải về hoàn tất giữ lại cùng một hành vi xáo trộn/repeat/resume mà không có nguồn truyền thông mạng. Tình trạng chuyển động thiết bị này không đồng bộ với sự tiến triển giữa các thiết bị.
Web và Android phiên bản sử dụng một bảng thiết lập tối nhất định với điều khiển màu xanh gọn. Danh sách phát nhạc hỗ trợ mục kế tiếp/ trước, xáo trộn, lặp lại một/ tất cả và có khả năng tự động tiến tới. Mỗi mục sử dụng một yêu cầu phát lại có thẩm quyền. Chương và ghi chép siêu dữ liệu đến từ danh mục nội dung của bạn.
Tốc độ phát lại, giờ giấc, chú thích, chất lượng, ngôn ngữ âm thanh, đánh dấu phiên chạy và vòng lặp A–B sẵn sàng. Mạng thêm vào phím tắt bàn phím, trình xem màn hình địa phương tùy chọn, tìm kiếm và hỗ trợ trình duyệt. Android bản địa Widevine Tải xuống và thay đổi thời gian. Quá trình phân loại và kiểm tra chéo đòi hỏi sự tích hợp ứng dụng riêng biệt.
Thiết lập biểu tượng cá nhân và tầu Enterprise
Đóng dấu không cho phép trên bề mặt phim. trình phát Cho biểu tượng, thông tin sản phẩm và trình phát Phiên bản. Mạng cũng cung cấp thông tin này bằng cách nhấn chuột phải. Mô phỏng điện thoại công cộng bao gồm WayMaker, lòng tốt của Chúa, dầu tươi và video thử nghiệm 4K; mỗi sự lựa chọn nhận được giấy phép riêng.
Đặt playerBranding trong hậu phương tin cậy của bạn {"mode":"hidden"} hay {"mode":"custom","logoUrl":"https://your-site.example/logo.png","label":"Your brand"}Nền tảng kiểm tra lại danh sách các nhà hoạt động chuyên nghiệp hoặc Enterprise đã đặt mua dài hạn. Các kế hoạch khác dùng {"mode":"default"}yêu cầu không hợp lệ trả về 403. Đây là trường hợp riêng biệt với dấu thủy phân.
Hạt PHP Tải về bao gồm cả danh sách nhạc và cấu hình thương mại được soạn thảo. Android Khách hàng ZIP trong danh sách người gọi trở lại. Giữ quyền sử dụng danh sách phát nhạc trong hậu phương của bạn; không bao giờ nhúng API ứng dụng khách thông tin xác thực trong một trong hai trình phát.
DRM-X 6.0