Engage SDK Watch: Hướng dẫn tích hợp kỹ thuật của bên thứ ba

Google đang xây dựng một nền tảng trên thiết bị giúp sắp xếp các ứng dụng của người dùng theo ngành dọc, đồng thời đem lại trải nghiệm mới mẻ và chân thực để người dùng khám phá và xem nội dung ứng dụng được cá nhân hoá. Trải nghiệm toàn màn hình này giúp các đối tác nhà phát triển có cơ hội giới thiệu nội dung đa dạng thức hay nhất của họ trên một kênh riêng bên ngoài ứng dụng của họ.

Hướng dẫn này cung cấp cho các đối tác nhà phát triển thông tin về cách tích hợp nội dung video của họ, sử dụng Engage SDK để điền dữ liệu cho cả khu vực nền tảng mới này và các nền tảng hiện có của Google.

Thông tin chi tiết về quy trình tích hợp

Thuật ngữ

Quy trình tích hợp bao gồm 3 loại cụm sau: Đề xuất, Tiếp tụcNổi bật.

  • Cụm Đề xuất hiển thị các đề xuất theo từng cá nhân đối với nội dung cần xem từ một đối tác nhà phát triển.

    Các đề xuất của bạn có cấu trúc sau:

    • Cụm Đề xuất: Khung hiển thị giao diện người dùng chứa một nhóm các đề xuất từ cùng một đối tác nhà phát triển.

      Hình 1. Giao diện người dùng Entertainment Space hiển thị một cụm Đề xuất của một đối tác.
    • Thực thể: Một đối tượng đại diện cho mỗi nội dung trong một cụm. Mỗi thực thể có thể là một bộ phim, chương trình truyền hình, phim truyền hình dài tập, video trực tiếp và nhiều nội dung khác. Xem phần Cung cấp dữ liệu về thực thể để biết danh sách các loại thực thể được hỗ trợ.

      Hình 2. Giao diện người dùng Entertainment Space hiển thị một Thực thể duy nhất trong cụm Đề xuất của một đối tác.
  • Cụm Tiếp tục hiển thị các video đang xem dở và các tập mới phát hành có liên quan từ nhiều đối tác nhà phát triển trong một nhóm giao diện người dùng. Mỗi đối tác nhà phát triển sẽ được phép thông báo về tối đa 10 thực thể trong cụm Tiếp tục. Nghiên cứu đã chỉ ra rằng các đề xuất được cá nhân hoá cùng với nội dung Tiếp tục sẽ thu được mức độ tương tác tốt nhất từ người dùng.

    Hình 3. Giao diện người dùng Entertainment Space hiển thị một cụm Tiếp tục với các đề xuất về nội dung chưa hoàn tất từ nhiều đối tác (hiện chỉ hiển thị một nội dung đề xuất).
  • Cụm Nổi bật hiển thị một số thực thể được chọn từ nhiều đối tác nhà phát triển trong một nhóm giao diện người dùng. Sẽ có một cụm Nổi bật duy nhất xuất hiện gần đầu giao diện người dùng và có vị trí ưu tiên phía trên tất cả các cụm Đề xuất. Mỗi đối tác nhà phát triển sẽ được phép thông báo về tối đa 10 thực thể trong cụm Nổi bật.

    Hình 4. Giao diện người dùng Entertainment Space hiển thị một cụm Nổi bật có các đề xuất của nhiều đối tác (hiện chỉ hiển thị một nội dung đề xuất).

Chuẩn bị trước

Cấp độ API tối thiểu: 19

Thêm thư viện com.google.android.engage:engage-core vào ứng dụng của bạn:

dependencies {
    // Make sure you also include that repository in your project's build.gradle file.
    implementation 'com.google.android.engage:engage-core:1.5.2'
}

Để biết thêm thông tin, hãy xem bài viết Chế độ hiển thị gói trong Android 11.

Tóm tắt

Thiết kế này dựa trên việc triển khai dịch vụ ràng buộc.

Dữ liệu mà ứng dụng có thể phát hành phải tuân theo các giới hạn sau cho các loại cụm khác nhau:

Loại cụm Số cụm tối đa Số lượng thực thể tối đa trong một cụm
Cụm Đề xuất Tối đa 5 Tối đa 50
Cụm Tiếp tục Tối đa 1 Tối đa 10
Cụm Nổi bật Tối đa 1 Tối đa 10

Bước 0: Di chuyển từ nội dung tích hợp Media Home SDK hiện có

Ánh xạ các mô hình dữ liệu từ nội dung tích hợp hiện có

Nếu bạn đang di chuyển từ nội dung tích hợp Media Home hiện có, thì bảng sau đây sẽ trình bày cách ánh xạ các mô hình dữ liệu trong những SDK hiện có với Engage SDK mới:

Tích hợp MediaHomeVideoContract tương đương Tích hợp Engage SDK tương đương
com.google.android.mediahome.video.PreviewChannel com.google.android.engage.common.datamodel.RecommendationCluster
com.google.android.mediahome.video.PreviewChannel.Builder com.google.android.engage.common.datamodel.RecommendationCluster.Builder
com.google.android.mediahome.video.PreviewChannelHelper com.google.android.engage.video.service.AppEngageVideoClient
com.google.android.mediahome.video.PreviewProgram Được chia thành các lớp riêng biệt: EventVideo, LiveStreamingVideo, Movie, TvEpisode, TvSeason, TvShow, VideoClipEntity
com.google.android.mediahome.video.PreviewProgram.Builder Được chia thành các trình tạo trong các lớp riêng biệt: EventVideo, LiveStreamingVideo, Movie, TvEpisode, TvSeason, TvShow, VideoClipEntity
com.google.android.mediahome.video.VideoContract Không còn cần đến.
com.google.android.mediahome.video.WatchNextProgram Được chia thành các thuộc tính trong các lớp riêng biệt: EventVideoEntity, LiveStreamingVideoEntity, MovieEntity, TvEpisodeEntity, TvSeasonEntity, TvShowEntity, VideoClipEntity
com.google.android.mediahome.video.WatchNextProgram.Builder Được chia thành các thuộc tính trong các lớp riêng biệt: EventVideoEntity, LiveStreamingVideoEntity, MovieEntity, TvEpisodeEntity, TvSeasonEntity, TvShowEntity, VideoClipEntity

Phát hành cụm trong Media Home SDK so với Engage SDK

Với Home Media SDK, các cụm và thực thể đã được phát hành thông qua các API riêng biệt:

// 1. Fetch existing channels
List<PreviewChannel> channels = PreviewChannelHelper.getAllChannels();

// 2. If there are no channels, publish new channels
long channelId = PreviewChannelHelper.publishChannel(builder.build());

// 3. If there are existing channels, decide whether to update channel contents
PreviewChannelHelper.updatePreviewChannel(channelId, builder.build());

// 4. Delete all programs in the channel
PreviewChannelHelper.deleteAllPreviewProgramsByChannelId(channelId);

// 5. publish new programs in the channel
PreviewChannelHelper.publishPreviewProgram(builder.build());

Với Engage SDK, việc phát hành cụm và thực thể được kết hợp thành một lệnh gọi API duy nhất. Tất cả các thực thể thuộc một cụm đều được xuất bản cùng với cụm đó:

Kotlin

RecommendationCluster.Builder()
            .addEntity(MOVIE_ENTITY)
            .addEntity(MOVIE_ENTITY)
            .addEntity(MOVIE_ENTITY)
            .setTitle("Top Picks For You")
            .build()

Java

new RecommendationCluster.Builder()
                        .addEntity(MOVIE_ENTITY)
                        .addEntity(MOVIE_ENTITY)
                        .addEntity(MOVIE_ENTITY)
                        .setTitle("Top Picks For You")
                        .build();

Bước 1: Cung cấp dữ liệu về thực thể

SDK đã xác định các thực thể khác nhau để đại diện cho từng loại nội dung. Chúng tôi hỗ trợ các thực thể sau cho danh mục Xem (Watch):

  1. MovieEntity
  2. TvShowEntity
  3. TvSeasonEntity
  4. TvEpisodeEntity
  5. LiveStreamingVideoEntity
  6. VideoClipEntity

Biểu đồ sau đây nêu ra các thuộc tính và yêu cầu cho từng loại.

MovieEntity

Thuộc tính Yêu cầu Ghi chú
Tên Bắt buộc
Hình ảnh áp phích Bắt buộc Bạn phải chọn ít nhất một hình ảnh và cung cấp tỷ lệ khung hình. (Bạn nên dùng hình ảnh ngang nhưng nên chuyển cả hình ảnh dọc và hình ảnh ngang cho các trường hợp khác nhau.)

Hãy xem Thông số kỹ thuật của hình ảnh để biết hướng dẫn.

URI phát Bắt buộc

Đường liên kết sâu đến ứng dụng của nhà cung cấp để bắt đầu phát phim.

Lưu ý: Bạn có thể sử dụng đường liên kết sâu để phân bổ. Tham khảo phần Câu hỏi thường gặp này

URI trang thông tin Không bắt buộc

Đường liên kết sâu đến ứng dụng của nhà cung cấp để hiện thông tin chi tiết về phim.

Lưu ý: Bạn có thể sử dụng đường liên kết sâu để phân bổ. Tham khảo phần Câu hỏi thường gặp này

Ngày phát hành Bắt buộc Theo thời gian bắt đầu của hệ thống (mili giây).
Phạm vi cung cấp Bắt buộc

AVAILABLE: Nội dung người dùng có thể xem mà không cần làm gì thêm.

FREE_WITH_SUBSCRIPTION: Nội dung được cung cấp sau khi người dùng mua gói thuê bao.

PAID_CONTENT: Nội dung yêu cầu người dùng mua hoặc thuê.

PURCHASED: Nội dung mà người dùng đã mua hoặc thuê.

Giá ưu đãi Không bắt buộc Văn bản tự do
Thời lượng Bắt buộc Tính bằng mili giây.
Thể loại Bắt buộc Văn bản tự do
Phân loại nội dung Bắt buộc Văn bản tự do, tuân theo tiêu chuẩn ngành. (Ví dụ)
Loại nội dung xem tiếp theo Bắt buộc trong một số điều kiện

Bạn phải cung cấp thông tin này khi nội dung nằm trong cụm Tiếp tục và phải thuộc một trong 4 loại sau:

CONTINUE: Người dùng đã xem nội dung này hơn 1 phút.

NEW: Người dùng đã xem tất cả các tập hiện có từ một số nội dung theo tập, nhưng một tập mới đã ra mắt và có đúng một tập chưa xem. Tính năng này phù hợp với các chương trình truyền hình, video ghi lại các trận đấu bóng đá trong chuỗi và nhiều loại nội dung khác.

NEXT: Người dùng đã xem một hoặc nhiều tập hoàn chỉnh của một số nội dung theo tập, nhưng vẫn còn nhiều tập hoặc đúng một tập trong đó tập gần đây nhất không phải là "NEW" và được phát hành trước khi người dùng bắt đầu xem nội dung theo tập này.

WATCHLIST: Người dùng đã chọn rõ ràng để thêm một bộ phim, sự kiện hoặc bộ phim dài tập vào một danh sách xem để họ tuyển chọn thủ công nội dung mà họ muốn xem tiếp theo.

Thời gian tương tác gần đây nhất Bắt buộc trong một số điều kiện Bạn phải cung cấp thông tin này khi nội dung nằm trong cụm Tiếp tục. Theo thời gian bắt đầu của hệ thống (mili giây).
Thời gian của vị trí phát gần đây nhất Bắt buộc trong một số điều kiện Bạn phải cung cấp thông tin này khi nội dung nằm trong cụm Tiếp tục và WatchNextType là CONTINUE. Theo thời gian bắt đầu của hệ thống (mili giây).

TvShowEntity

Thuộc tính Yêu cầu Ghi chú
Tên Bắt buộc
Hình ảnh áp phích Bắt buộc Bạn phải chọn ít nhất một hình ảnh và cung cấp tỷ lệ khung hình. (Bạn nên dùng hình ảnh ngang nhưng nên chuyển cả hình ảnh dọc và hình ảnh ngang cho các trường hợp khác nhau.)

Hãy xem Thông số kỹ thuật của hình ảnh để biết hướng dẫn.

URI trang thông tin Bắt buộc

Đường liên kết sâu đến ứng dụng của nhà cung cấp để hiện thông tin chi tiết về chương trình truyền hình.

Lưu ý: Bạn có thể sử dụng đường liên kết sâu để phân bổ. Hãy tham khảo phần Câu hỏi thường gặp này

URI phát Không bắt buộc

Đường liên kết sâu đến ứng dụng của nhà cung cấp để bắt đầu phát chương trình truyền hình.

Lưu ý: Bạn có thể sử dụng đường liên kết sâu để phân bổ. Tham khảo phần Câu hỏi thường gặp này

Ngày phát sóng tập đầu tiên Bắt buộc Theo thời gian bắt đầu của hệ thống (mili giây).
Ngày phát sóng tập mới nhất Không bắt buộc Theo thời gian bắt đầu của hệ thống (mili giây).
Phạm vi cung cấp Bắt buộc

AVAILABLE: Nội dung người dùng có thể xem mà không cần làm gì thêm.

FREE_WITH_SUBSCRIPTION: Nội dung được cung cấp sau khi người dùng mua gói thuê bao.

PAID_CONTENT: Nội dung yêu cầu người dùng mua hoặc thuê.

PURCHASED: Nội dung mà người dùng đã mua hoặc thuê.

Giá ưu đãi Không bắt buộc Văn bản tự do
Số lượng phần Bắt buộc Số nguyên dương
Thể loại Bắt buộc Văn bản tự do
Phân loại nội dung Bắt buộc Văn bản tự do, tuân theo tiêu chuẩn ngành. (Ví dụ)
Loại nội dung xem tiếp theo Bắt buộc trong một số điều kiện

Bạn phải cung cấp thông tin này khi nội dung nằm trong cụm Tiếp tục và phải thuộc một trong 4 loại sau:

CONTINUE: Người dùng đã xem nội dung này hơn 1 phút.

NEW: Người dùng đã xem tất cả các tập hiện có từ một số nội dung theo tập, nhưng một tập mới đã ra mắt và có đúng một tập chưa xem. Tính năng này phù hợp với các chương trình truyền hình, video ghi lại các trận đấu bóng đá trong chuỗi và nhiều loại nội dung khác.

NEXT: Người dùng đã xem một hoặc nhiều tập hoàn chỉnh của một số nội dung theo tập, nhưng vẫn còn nhiều tập hoặc đúng một tập trong đó tập gần đây nhất không phải là "NEW" và được phát hành trước khi người dùng bắt đầu xem nội dung theo tập này.

WATCHLIST: Người dùng đã chọn rõ ràng để thêm một bộ phim, sự kiện hoặc bộ phim dài tập vào một danh sách xem để họ tuyển chọn thủ công nội dung mà họ muốn xem tiếp theo.

Thời gian tương tác gần đây nhất Bắt buộc trong một số điều kiện Bạn phải cung cấp thông tin này khi nội dung nằm trong cụm Tiếp tục. Theo thời gian bắt đầu của hệ thống (mili giây).
Thời gian của vị trí phát gần đây nhất Bắt buộc trong một số điều kiện Bạn phải cung cấp thông tin này khi nội dung nằm trong cụm Tiếp tục và WatchNextType là CONTINUE. Theo thời gian bắt đầu của hệ thống (mili giây).

TvSeasonEntity

Thuộc tính Yêu cầu Ghi chú
Tên Bắt buộc
Hình ảnh áp phích Bắt buộc Bạn phải chọn ít nhất một hình ảnh và cung cấp tỷ lệ khung hình. (Bạn nên dùng hình ảnh ngang nhưng nên chuyển cả hình ảnh dọc và hình ảnh ngang cho các trường hợp khác nhau.)

Hãy xem Thông số kỹ thuật của hình ảnh để biết hướng dẫn.

URI trang thông tin Bắt buộc

Đường liên kết sâu đến ứng dụng của nhà cung cấp để hiển thị thông tin chi tiết về một phần của chương trình truyền hình.

Lưu ý: Bạn có thể sử dụng đường liên kết sâu để phân bổ. Hãy tham khảo phần Câu hỏi thường gặp này

URI phát Không bắt buộc

Đường liên kết sâu đến ứng dụng của nhà cung cấp để bắt đầu phát một phần của chương trình truyền hình.

Lưu ý: Bạn có thể sử dụng đường liên kết sâu để phân bổ. Tham khảo phần Câu hỏi thường gặp này

Hiện thông tin về số phần

Không bắt buộc

Có trong phiên bản 1.3.1

Chuỗi
Ngày phát sóng tập đầu tiên Bắt buộc Theo thời gian bắt đầu của hệ thống (mili giây).
Ngày phát sóng tập mới nhất Không bắt buộc Theo thời gian bắt đầu của hệ thống (mili giây).
Phạm vi cung cấp Bắt buộc

AVAILABLE: Nội dung người dùng có thể xem mà không cần làm gì thêm.

FREE_WITH_SUBSCRIPTION: Nội dung được cung cấp sau khi người dùng mua gói thuê bao.

PAID_CONTENT: Nội dung yêu cầu người dùng mua hoặc thuê.

PURCHASED: Nội dung mà người dùng đã mua hoặc thuê.

Giá ưu đãi Không bắt buộc Văn bản tự do
Số lượng tập Bắt buộc Số nguyên dương
Thể loại Bắt buộc Văn bản tự do
Phân loại nội dung Bắt buộc Văn bản tự do, tuân theo tiêu chuẩn ngành. (Ví dụ)
Loại nội dung xem tiếp theo Bắt buộc trong một số điều kiện

Bạn phải cung cấp thông tin này khi nội dung nằm trong cụm Tiếp tục và phải thuộc một trong 4 loại sau:

CONTINUE: Người dùng đã xem nội dung này hơn 1 phút.

NEW: Người dùng đã xem tất cả các tập hiện có từ một số nội dung theo tập, nhưng một tập mới đã ra mắt và có đúng một tập chưa xem. Tính năng này phù hợp với các chương trình truyền hình, video ghi lại các trận đấu bóng đá trong chuỗi và nhiều loại nội dung khác.

NEXT: Người dùng đã xem một hoặc nhiều tập hoàn chỉnh của một số nội dung theo tập, nhưng vẫn còn nhiều tập hoặc đúng một tập trong đó tập gần đây nhất không phải là "NEW" và được phát hành trước khi người dùng bắt đầu xem nội dung theo tập này.

WATCHLIST: Người dùng đã chọn rõ ràng để thêm một bộ phim, sự kiện hoặc bộ phim dài tập vào một danh sách xem để họ tuyển chọn thủ công nội dung mà họ muốn xem tiếp theo.

Thời gian tương tác gần đây nhất Bắt buộc trong một số điều kiện Bạn phải cung cấp thông tin này khi nội dung nằm trong cụm Tiếp tục. Theo thời gian bắt đầu của hệ thống (mili giây).
Thời gian của vị trí phát gần đây nhất Bắt buộc trong một số điều kiện Bạn phải cung cấp thông tin này khi nội dung nằm trong cụm Tiếp tục và WatchNextType là CONTINUE. Theo thời gian bắt đầu của hệ thống (mili giây).

TvEpisodeEntity

Thuộc tính Yêu cầu Ghi chú
Tên Bắt buộc
Hình ảnh áp phích Bắt buộc Bạn phải chọn ít nhất một hình ảnh và cung cấp tỷ lệ khung hình. (Bạn nên dùng hình ảnh ngang nhưng nên chuyển cả hình ảnh dọc và hình ảnh ngang cho các trường hợp khác nhau.)

Hãy xem Thông số kỹ thuật của hình ảnh để biết hướng dẫn.

URI phát Bắt buộc

Đường liên kết sâu đến ứng dụng của nhà cung cấp để bắt đầu phát tập.

Lưu ý: Bạn có thể sử dụng đường liên kết sâu để phân bổ. Tham khảo phần Câu hỏi thường gặp này

URI trang thông tin Không bắt buộc

Đường liên kết sâu đến ứng dụng của nhà cung cấp để hiển thị thông tin chi tiết về tập của chương trình truyền hình.

Lưu ý: Bạn có thể sử dụng đường liên kết sâu để phân bổ. Tham khảo phần Câu hỏi thường gặp này

Hiện thông tin về số tập

Không bắt buộc

Có trong phiên bản 1.3.1

Chuỗi
Ngày phát sóng Bắt buộc Theo thời gian bắt đầu của hệ thống (mili giây).
Phạm vi cung cấp Bắt buộc

AVAILABLE: Nội dung người dùng có thể xem mà không cần làm gì thêm.

FREE_WITH_SUBSCRIPTION: Nội dung được cung cấp sau khi người dùng mua gói thuê bao.

PAID_CONTENT: Nội dung yêu cầu người dùng mua hoặc thuê.

PURCHASED: Nội dung mà người dùng đã mua hoặc thuê.

Giá ưu đãi Không bắt buộc Văn bản tự do
Thời lượng Bắt buộc Phải là một giá trị dương tính bằng mili giây.
Thể loại Bắt buộc Văn bản tự do
Phân loại nội dung Bắt buộc Văn bản tự do, tuân theo tiêu chuẩn ngành. (Ví dụ)
Loại nội dung xem tiếp theo Bắt buộc trong một số điều kiện

Bạn phải cung cấp thông tin này khi nội dung nằm trong cụm Tiếp tục và phải thuộc một trong 4 loại sau:

CONTINUE: Người dùng đã xem nội dung này hơn 1 phút.

NEW: Người dùng đã xem tất cả các tập hiện có từ một số nội dung theo tập, nhưng một tập mới đã ra mắt và có đúng một tập chưa xem. Tính năng này phù hợp với các chương trình truyền hình, video ghi lại các trận đấu bóng đá trong chuỗi và nhiều loại nội dung khác.

NEXT: Người dùng đã xem một hoặc nhiều tập hoàn chỉnh của một số nội dung theo tập, nhưng vẫn còn nhiều tập hoặc đúng một tập trong đó tập gần đây nhất không phải là "NEW" và được phát hành trước khi người dùng bắt đầu xem nội dung theo tập này.

WATCHLIST: Người dùng đã chọn rõ ràng để thêm một bộ phim, sự kiện hoặc bộ phim dài tập vào một danh sách xem để họ tuyển chọn thủ công nội dung mà họ muốn xem tiếp theo.

Thời gian tương tác gần đây nhất Bắt buộc trong một số điều kiện Bạn phải cung cấp thông tin này khi nội dung nằm trong cụm Tiếp tục. Theo thời gian bắt đầu của hệ thống (mili giây).
Thời gian của vị trí phát gần đây nhất Bắt buộc trong một số điều kiện Bạn phải cung cấp thông tin này khi nội dung nằm trong cụm Tiếp tục và WatchNextType là CONTINUE. Theo thời gian bắt đầu của hệ thống (mili giây).

LiveStreamingVideoEntity

Thuộc tính Yêu cầu Ghi chú
Tên Bắt buộc
Hình ảnh áp phích Bắt buộc Bạn phải chọn ít nhất một hình ảnh và cung cấp tỷ lệ khung hình. (Bạn nên dùng hình ảnh ngang nhưng nên chuyển cả hình ảnh dọc và hình ảnh ngang cho các trường hợp khác nhau.)

Hãy xem Thông số kỹ thuật của hình ảnh để biết hướng dẫn.

URI phát Bắt buộc

Đường liên kết sâu đến ứng dụng của nhà cung cấp để bắt đầu phát video.

Lưu ý: Bạn có thể sử dụng đường liên kết sâu để phân bổ. Tham khảo phần Câu hỏi thường gặp này

Người/bên phát Bắt buộc Văn bản tự do
Thời gian bắt đầu Không bắt buộc Theo thời gian bắt đầu của hệ thống (mili giây).
Thời gian kết thúc Không bắt buộc Theo thời gian bắt đầu của hệ thống (mili giây).
Lượt xem Không bắt buộc Văn bản tự do, phải được bản địa hoá.
Loại nội dung xem tiếp theo Bắt buộc trong một số điều kiện

Bạn phải cung cấp thông tin này khi nội dung nằm trong cụm Tiếp tục và phải thuộc một trong 4 loại sau:

CONTINUE: Người dùng đã xem nội dung này hơn 1 phút.

NEW: Người dùng đã xem tất cả các tập hiện có từ một số nội dung theo tập, nhưng một tập mới đã ra mắt và có đúng một tập chưa xem. Tính năng này phù hợp với các chương trình truyền hình, video ghi lại các trận đấu bóng đá trong chuỗi và nhiều loại nội dung khác.

NEXT: Người dùng đã xem một hoặc nhiều tập hoàn chỉnh của một số nội dung theo tập, nhưng vẫn còn nhiều tập hoặc đúng một tập trong đó tập gần đây nhất không phải là "NEW" và được phát hành trước khi người dùng bắt đầu xem nội dung theo tập này.

WATCHLIST: Người dùng đã chọn rõ ràng để thêm một bộ phim, sự kiện hoặc bộ phim dài tập vào một danh sách xem để họ tuyển chọn thủ công nội dung mà họ muốn xem tiếp theo.

Thời gian tương tác gần đây nhất Bắt buộc trong một số điều kiện Bạn phải cung cấp thông tin này khi nội dung nằm trong cụm Tiếp tục. Theo thời gian bắt đầu của hệ thống (mili giây).
Thời gian của vị trí phát gần đây nhất Bắt buộc trong một số điều kiện Bạn phải cung cấp thông tin này khi nội dung nằm trong cụm Tiếp tục và WatchNextType là CONTINUE. Theo thời gian bắt đầu của hệ thống (mili giây).

VideoClipEntity

Đối tượng VideoClipEntity đại diện cho một thực thể video đến từ mạng xã hội, chẳng hạn như TikTok hoặc YouTube.

Thuộc tính Yêu cầu Ghi chú
Tên Bắt buộc
Hình ảnh áp phích Bắt buộc Bạn phải chọn ít nhất một hình ảnh và cung cấp tỷ lệ khung hình. (Bạn nên dùng hình ảnh ngang nhưng nên chuyển cả hình ảnh dọc và hình ảnh ngang cho các trường hợp khác nhau.)

Hãy xem Thông số kỹ thuật của hình ảnh để biết hướng dẫn.

URI phát Bắt buộc

Đường liên kết sâu đến ứng dụng của nhà cung cấp để bắt đầu phát video.

Lưu ý: Bạn có thể sử dụng đường liên kết sâu để phân bổ. Tham khảo phần Câu hỏi thường gặp này

Thời gian tạo Bắt buộc Theo thời gian bắt đầu của hệ thống (mili giây).
Thời lượng Bắt buộc Phải là một giá trị dương tính bằng mili giây.
Nhà sáng tạo Bắt buộc Văn bản tự do
Hình ảnh nhà sáng tạo Không bắt buộc Hình đại diện của nhà sáng tạo
Lượt xem Không bắt buộc Văn bản tự do, phải được bản địa hoá.
Loại nội dung xem tiếp theo Bắt buộc trong một số điều kiện

Bạn phải cung cấp thông tin này khi nội dung nằm trong cụm Tiếp tục và phải thuộc một trong 4 loại sau:

CONTINUE: Người dùng đã xem nội dung này hơn 1 phút.

NEW: Người dùng đã xem tất cả các tập hiện có từ một số nội dung theo tập, nhưng một tập mới đã ra mắt và có đúng một tập chưa xem. Tính năng này phù hợp với các chương trình truyền hình, video ghi lại các trận đấu bóng đá trong chuỗi và nhiều loại nội dung khác.

NEXT: Người dùng đã xem một hoặc nhiều tập hoàn chỉnh của một số nội dung theo tập, nhưng vẫn còn nhiều tập hoặc đúng một tập trong đó tập gần đây nhất không phải là "NEW" và được phát hành trước khi người dùng bắt đầu xem nội dung theo tập này.

WATCHLIST: Người dùng đã chọn rõ ràng để thêm một bộ phim, sự kiện hoặc bộ phim dài tập vào một danh sách xem để họ tuyển chọn thủ công nội dung mà họ muốn xem tiếp theo.

Thời gian tương tác gần đây nhất Bắt buộc trong một số điều kiện Bạn phải cung cấp thông tin này khi nội dung nằm trong cụm Tiếp tục. Theo thời gian bắt đầu của hệ thống (mili giây).
Thời gian của vị trí phát gần đây nhất Bắt buộc trong một số điều kiện Bạn phải cung cấp thông tin này khi nội dung nằm trong cụm Tiếp tục và WatchNextType là CONTINUE. Theo thời gian bắt đầu của hệ thống (mili giây).

Thông số kỹ thuật của hình ảnh

Phần sau đây liệt kê các thông số kỹ thuật bắt buộc đối với thành phần hình ảnh:

Định dạng tệp

PNG, JPG, GIF tĩnh, WebP

Kích thước tệp tối đa

5120 KB

Đề xuất khác

  • Khu vực an toàn cho hình ảnh: Đặt nội dung quan trọng của bạn vào phần chiếm 80% trung tâm của hình ảnh.

Ví dụ

Kotlin

var movie = MovieEntity.Builder()
    .setName("Avengers")
    .addPosterImage(Image.Builder()
                          .setImageUri(Uri.parse("http://www.x.com/image.png"))
                          .setImageHeightInPixel(960)
                          .setImageWidthInPixel(408)
                          .build())
    .setPlayBackUri(Uri.parse("http://tv.com/playback/1"))
    .setReleaseDateEpochMillis(1633032895L)
    .setAvailability(ContentAvailability.AVAILABILITY_AVAILABLE)
    .setDurationMillis(12345678L)
    .addGenre("action")
    .addContentRating("R")
    .setWatchNextType(WatchNextType.TYPE_NEW)
    .setLastEngagementTimeMillis(1664568895L)
    .build()

Java

MovieEntity movie = new MovieEntity.Builder()
                  .setName("Avengers")
                  .addPosterImage(
                      new Image.Builder()
                          .setImageUri(Uri.parse("http://www.x.com/image.png"))
                          .setImageHeightInPixel(960)
                          .setImageWidthInPixel(408)
                          .build())
                  .setPlayBackUri(Uri.parse("http://tv.com/playback/1"))
                  .setReleaseDateEpochMillis(1633032895L)
                  .setAvailability(ContentAvailability.AVAILABILITY_AVAILABLE)
                  .setDurationMillis(12345678L)
                  .addGenre("action")
                  .addContentRating("R")
                  .setWatchNextType(WatchNextType.TYPE_NEW)
                  .setLastEngagementTimeMillis(1664568895L)
                  .build();

Bước 2: Cung cấp dữ liệu Cụm

Bạn nên thực hiện công việc phát hành nội dung trong nền (ví dụ: sử dụng WorkManager) và lên lịch thường xuyên hoặc theo sự kiện (ví dụ: mỗi khi người dùng mở ứng dụng hoặc khi người dùng vừa thêm mặt hàng nào vào giỏ hàng).

AppEngagePublishClient chịu trách nhiệm xuất bản cụm. Có các API sau đây trong ứng dụng:

  • isServiceAvailable
  • publishRecommendationClusters
  • publishFeaturedCluster
  • publishContinuationCluster
  • publishUserAccountManagementRequest
  • updatePublishStatus
  • deleteRecommendationsClusters
  • deleteFeaturedCluster
  • deleteContinuationCluster
  • deleteUserManagementCluster
  • deleteClusters

isServiceAvailable

API này dùng để kiểm tra xem dịch vụ có thể tích hợp và nội dung có xuất hiện trên thiết bị hay không.

Kotlin

client.isServiceAvailable.addOnCompleteListener { task ->
    if (task.isSuccessful) {
        // Handle IPC call success
        if(task.result) {
          // Service is available on the device, proceed with content publish
          // calls.
        } else {
          // Service is not available, no further action is needed.
        }
    } else {
      // The IPC call itself fails, proceed with error handling logic here,
      // such as retry.
    }
}

Java

client.isServiceAvailable().addOnCompleteListener(task - > {
    if (task.isSuccessful()) {
        // Handle success
        if(task.getResult()) {
          // Service is available on the device, proceed with content publish
          // calls.
        } else {
          // Service is not available, no further action is needed.
        }
    } else {
      // The IPC call itself fails, proceed with error handling logic here,
      // such as retry.
    }
});

publishRecommendationClusters

API này được dùng để phát hành danh sách đối tượng RecommendationCluster.

Kotlin

client.publishRecommendationClusters(
      PublishRecommendationClustersRequest.Builder()
        .addRecommendationCluster(
          RecommendationCluster.Builder()
            .addEntity(entity1)
            .addEntity(entity2)
            .setTitle("Top Picks For You")
            .build()
        )
        .build()
    )

Java

client.publishRecommendationClusters(
            new PublishRecommendationClustersRequest.Builder()
                .addRecommendationCluster(
                    new RecommendationCluster.Builder()
                        .addEntity(entity1)
                        .addEntity(entity2)
                        .setTitle("Top Picks For You")
                        .build())
                .build());

Khi dịch vụ nhận được yêu cầu, các hành động sau đây sẽ diễn ra trong một giao dịch:

  • Dữ liệu RecommendationCluster hiện có của đối tác nhà phát triển sẽ bị xoá.
  • Dữ liệu của yêu cầu được phân tích cú pháp và lưu trữ trong cụm Đề xuất đã cập nhật.

Trong trường hợp xảy ra lỗi, toàn bộ yêu cầu sẽ bị từ chối và trạng thái hiện tại sẽ được duy trì.

publishFeaturedCluster

API này được dùng để phát hành danh sách đối tượng FeaturedCluster.

Kotlin

client.publishFeaturedCluster(
    PublishFeaturedClusterRequest.Builder()
      .setFeaturedCluster(
        FeaturedCluster.Builder()
          .addEntity(entity1)
          .addEntity(entity2)
          .build())
      .build())

Java

client.publishFeaturedCluster(
            new PublishFeaturedClustersRequest.Builder()
                .addFeaturedCluster(
                    new FeaturedCluster.Builder()
                        .addEntity(entity1)
                        .addEntity(entity2)
                        .build())
                .build());

Khi dịch vụ nhận được yêu cầu, các hành động sau đây sẽ diễn ra trong một giao dịch:

  • Dữ liệu FeaturedCluster hiện có của đối tác nhà phát triển sẽ bị xoá.
  • Dữ liệu của yêu cầu được phân tích cú pháp và lưu trữ trong cụm Nổi bật đã cập nhật.

Trong trường hợp xảy ra lỗi, toàn bộ yêu cầu sẽ bị từ chối và trạng thái hiện tại sẽ được duy trì.

publishContinuationCluster

API này được dùng để phát hành đối tượng ContinuationCluster.

Kotlin

client.publishContinuationCluster(
    PublishContinuationClusterRequest.Builder()
      .setContinuationCluster(
        ContinuationCluster.Builder()
          .addEntity(entity1)
          .addEntity(entity2)
          .build())
      .build())

Java

client.publishContinuationCluster(
            new PublishContinuationClusterRequest.Builder()
                .setContinuationCluster(
                    new ContinuationCluster.Builder()
                        .addEntity(entity1)
                        .addEntity(entity2)
                        .build())
                .build());

Khi dịch vụ nhận được yêu cầu, các hành động sau đây sẽ diễn ra trong một giao dịch:

  • Dữ liệu ContinuationCluster hiện có của đối tác nhà phát triển sẽ bị xoá.
  • Dữ liệu của yêu cầu được phân tích cú pháp và lưu trữ trong cụm Tiếp tục đã cập nhật.

Trong trường hợp xảy ra lỗi, toàn bộ yêu cầu sẽ bị từ chối và trạng thái hiện tại sẽ được duy trì.

publishUserAccountManagementRequest

API này dùng để xuất bản thẻ Đăng nhập. Thao tác đăng nhập sẽ đưa người dùng đến trang đăng nhập của ứng dụng để ứng dụng có thể xuất bản nội dung (hoặc cung cấp nội dung phù hợp hơn cho cá nhân)

Siêu dữ liệu sau đây là một phần của Thẻ đăng nhập –

Thuộc tính Yêu cầu Nội dung mô tả
URI hành động Bắt buộc Đường liên kết sâu đến hành động (chẳng hạn như điều hướng đến trang đăng nhập ứng dụng)
Hình ảnh Không bắt buộc – Nếu không cung cấp thì bạn phải cung cấp Tiêu đề

Hình ảnh hiện trên thẻ

Hình ảnh có tỷ lệ khung hình 16x9 với độ phân giải 1264x712

Tiêu đề Không bắt buộc – Nếu không cung cấp thì bạn phải cung cấp Hình ảnh Tiêu đề trên thẻ
Văn bản hành động Không bắt buộc Văn bản hiện trên CTA (chẳng hạn như Đăng nhập)
Phụ đề Không bắt buộc Phụ đề không bắt buộc trên thẻ

Kotlin

var SIGN_IN_CARD_ENTITY =
      SignInCardEntity.Builder()
          .addPosterImage(
              Image.Builder()
                  .setImageUri(Uri.parse("http://www.x.com/image.png"))
                  .setImageHeightInPixel(500)
                  .setImageWidthInPixel(500)
                  .build())
          .setActionText("Sign In")
          .setActionUri(Uri.parse("http://xx.com/signin"))
          .build()

client.publishUserAccountManagementRequest(
            PublishUserAccountManagementRequest.Builder()
                .setSignInCardEntity(SIGN_IN_CARD_ENTITY)
                .build());

Java

SignInCardEntity SIGN_IN_CARD_ENTITY =
      new SignInCardEntity.Builder()
          .addPosterImage(
              new Image.Builder()
                  .setImageUri(Uri.parse("http://www.x.com/image.png"))
                  .setImageHeightInPixel(500)
                  .setImageWidthInPixel(500)
                  .build())
          .setActionText("Sign In")
          .setActionUri(Uri.parse("http://xx.com/signin"))
          .build();

client.publishUserAccountManagementRequest(
            new PublishUserAccountManagementRequest.Builder()
                .setSignInCardEntity(SIGN_IN_CARD_ENTITY)
                .build());

Khi dịch vụ nhận được yêu cầu, các hành động sau đây sẽ diễn ra trong một giao dịch:

  • Dữ liệu UserAccountManagementCluster hiện có của đối tác nhà phát triển sẽ bị xoá.
  • Dữ liệu của yêu cầu được phân tích cú pháp và lưu trữ trong cụm UserAccountManagementCluster đã cập nhật.

Trong trường hợp xảy ra lỗi, toàn bộ yêu cầu sẽ bị từ chối và trạng thái hiện tại sẽ được duy trì.

updatePublishStatus

Nếu vì một lý do kinh doanh nội bộ bất kỳ mà không có cụm nào được xuất bản, bạn nên cập nhật trạng thái xuất bản bằng cách sử dụng API updatePublishStatus. Việc này quan trọng vì:

  • Trong mọi trường hợp, ngay cả khi nội dung được xuất bản (STATUS == PUBLISHED), bạn phải cho biết trạng thái để điền trang tổng quan. Trạng thái rõ ràng này sẽ được trang tổng quan sử dụng để truyền tải tình trạng và các chỉ số khác của quá trình tích hợp.
  • Nếu không có nội dung nào được xuất bản nhưng trạng thái tích hợp không phải là bị lỗi (STATUS == NOT_PUBLISHED), Google có thể tránh kích hoạt cảnh báo trong trang tổng quan về tình trạng của ứng dụng. Phương thức này xác nhận rằng nội dung chưa được xuất bản do tình huống dự kiến theo quan điểm của nhà cung cấp.
  • Theo đó, nhà phát triển có thể cung cấp thông tin chi tiết về thời điểm công bố hoặc không công bố dữ liệu.
  • Google có thể sử dụng các mã trạng thái nhắc người dùng thực hiện một số thao tác trong ứng dụng để họ có thể xem hoặc bỏ qua nội dung ứng dụng.

Dưới đây là danh sách mã trạng thái xuất bản đủ điều kiện:

// Content is published
AppEngagePublishStatusCode.PUBLISHED,

// Content is not published as user is not signed in
AppEngagePublishStatusCode.NOT_PUBLISHED_REQUIRES_SIGN_IN,

// Content is not published as user is not subscribed
AppEngagePublishStatusCode.NOT_PUBLISHED_REQUIRES_SUBSCRIPTION,

// Content is not published as user location is ineligible
AppEngagePublishStatusCode.NOT_PUBLISHED_INELIGIBLE_LOCATION,

// Content is not published as there is no eligible content
AppEngagePublishStatusCode.NOT_PUBLISHED_NO_ELIGIBLE_CONTENT,

// Content is not published as the feature is disabled by the client
// Available in v1.3.1
AppEngagePublishStatusCode.NOT_PUBLISHED_FEATURE_DISABLED_BY_CLIENT,

// Content is not published as the feature due to a client error
// Available in v1.3.1
AppEngagePublishStatusCode.NOT_PUBLISHED_CLIENT_ERROR,

// Content is not published as the feature due to a service error
// Available in v1.3.1
AppEngagePublishStatusCode.NOT_PUBLISHED_SERVICE_ERROR,

// Content is not published due to some other reason
// Reach out to engage-developers@ before using this enum.
AppEngagePublishStatusCode.NOT_PUBLISHED_OTHER

Nếu nội dung chưa được xuất bản do người dùng chưa đăng nhập, thì bạn nên xuất bản Thẻ đăng nhập. Nếu vì một lý do bất kỳ mà nhà cung cấp không thể xuất bản Thẻ đăng nhập, bạn nên gọi API updatePublishStatus kèm theo mã trạng thái NOT_PUBLISHED_REQUIRES_SIGN_IN

Kotlin

client.updatePublishStatus(
   PublishStatusRequest.Builder()
     .setStatusCode(AppEngagePublishStatusCode.NOT_PUBLISHED_REQUIRES_SIGN_IN)
     .build())

Java

client.updatePublishStatus(
    new PublishStatusRequest.Builder()
        .setStatusCode(AppEngagePublishStatusCode.NOT_PUBLISHED_REQUIRES_SIGN_IN)
        .build());

deleteRecommendationClusters

API này dùng để xoá nội dung của cụm Recommendation (Đề xuất).

Kotlin

client.deleteRecommendationClusters()

Java

client.deleteRecommendationClusters();

Khi nhận được yêu cầu, dịch vụ sẽ xoá dữ liệu hiện có khỏi cụm Đề xuất. Trong trường hợp xảy ra lỗi, toàn bộ yêu cầu sẽ bị từ chối và trạng thái hiện tại vẫn giữ nguyên.

deleteFeaturedCluster

API này dùng để xoá nội dung của cụm Featured (Nổi bật).

Kotlin

client.deleteFeaturedCluster()

Java

client.deleteFeaturedCluster();

Khi nhận được yêu cầu, dịch vụ sẽ xoá dữ liệu hiện có khỏi cụm Nổi bật. Trong trường hợp xảy ra lỗi, toàn bộ yêu cầu sẽ bị từ chối và trạng thái hiện tại vẫn giữ nguyên.

deleteContinuationCluster

API này dùng để xoá nội dung của cụm Continuation (Tiếp tục).

Kotlin

client.deleteContinuationCluster()

Java

client.deleteContinuationCluster();

Khi nhận được yêu cầu, dịch vụ sẽ xoá dữ liệu hiện có khỏi cụm Tiếp tục. Trong trường hợp xảy ra lỗi, toàn bộ yêu cầu sẽ bị từ chối và trạng thái hiện tại vẫn giữ nguyên.

deleteUserManagementCluster

API này dùng để xoá nội dung của cụm UserAccountManagement.

Kotlin

client.deleteUserManagementCluster()

Java

client.deleteUserManagementCluster();

Khi nhận được yêu cầu, dịch vụ sẽ xoá dữ liệu hiện có khỏi cụm UserAccountManagement. Trong trường hợp xảy ra lỗi, toàn bộ yêu cầu sẽ bị từ chối và trạng thái hiện tại vẫn giữ nguyên.

deleteClusters

API này dùng để xoá nội dung của một loại cụm cụ thể.

Kotlin

client.deleteClusters(
    DeleteClustersRequest.Builder()
      .addClusterType(ClusterType.TYPE_CONTINUATION)
      .addClusterType(ClusterType.TYPE_FEATURED)
      .addClusterType(ClusterType.TYPE_RECOMMENDATION)
      .build())

Java

client.deleteClusters(
            new DeleteClustersRequest.Builder()
                .addClusterType(ClusterType.TYPE_CONTINUATION)
                .addClusterType(ClusterType.TYPE_FEATURED)
                .addClusterType(ClusterType.TYPE_RECOMMENDATION)
                .build());

Khi nhận được yêu cầu, dịch vụ sẽ xoá dữ liệu hiện có khỏi tất cả các cụm khớp với loại cụm đã chỉ định. Ứng dụng có thể chọn truyền một hoặc nhiều loại cụm. Trong trường hợp xảy ra lỗi, toàn bộ yêu cầu sẽ bị từ chối và trạng thái hiện tại sẽ được duy trì.

Xử lý lỗi

Bạn nên nghe kết quả tác vụ từ các API phát hành để có thể thực hiện thao tác tiếp theo nhằm khôi phục và gửi lại tác vụ thành công.

Kotlin

client.publishRecommendationClusters(
        PublishRecommendationClustersRequest.Builder()
          .addRecommendationCluster(..)
          .build())
      .addOnCompleteListener { task ->
        if (task.isSuccessful) {
          // do something
        } else {
          val exception = task.exception
          if (exception is AppEngageException) {
            @AppEngageErrorCode val errorCode = exception.errorCode
            if (errorCode == AppEngageErrorCode.SERVICE_NOT_FOUND) {
              // do something
            }
          }
        }
      }

Java

client.publishRecommendationClusters(
              new PublishRecommendationClustersRequest.Builder()
                  .addRecommendationCluster(...)
                  .build())
          .addOnCompleteListener(
              task -> {
                if (task.isSuccessful()) {
                  // do something
                } else {
                  Exception exception = task.getException();
                  if (exception instanceof AppEngageException) {
                    @AppEngageErrorCode
                    int errorCode = ((AppEngageException) exception).getErrorCode();
                    if (errorCode == AppEngageErrorCode.SERVICE_NOT_FOUND) {
                      // do something
                    }
                  }
                }
              });

Lỗi được trả về dưới dạng AppEngageException với nguyên nhân được đưa vào dưới dạng mã lỗi.

Mã lỗi Tên lỗi Lưu ý
1 SERVICE_NOT_FOUND Dịch vụ này không dùng được trên thiết bị đã cho.
2 SERVICE_NOT_AVAILABLE Dịch vụ này hoạt động trên thiết bị đã cho, nhưng không hoạt động tại thời điểm gọi (ví dụ: dịch vụ bị vô hiệu hoá một cách rõ ràng).
3 SERVICE_CALL_EXECUTION_FAILURE Không thực hiện được tác vụ do có vấn đề về luồng. Trong trường hợp này, bạn có thể thử lại.
4 SERVICE_CALL_PERMISSION_DENIED Trình gọi không được phép thực hiện cuộc gọi dịch vụ.
5 SERVICE_CALL_INVALID_ARGUMENT Yêu cầu chứa dữ liệu không hợp lệ (ví dụ: nhiều hơn số cụm được phép).
6 SERVICE_CALL_INTERNAL Đã xảy ra lỗi bên phía dịch vụ.
7 SERVICE_CALL_RESOURCE_EXHAUSTED Cuộc gọi dịch vụ được thực hiện quá thường xuyên.

Bước 3: Xử lý ý định truyền tin

Ngoài việc thực hiện lệnh gọi API nội dung phát hành thông qua một công việc, bạn cũng phải thiết lập BroadcastReceiver để nhận yêu cầu phát hành nội dung.

Mục tiêu của ý định truyền tin chủ yếu là để kích hoạt lại ứng dụng và buộc đồng bộ hoá dữ liệu. Ý định truyền tin không được thiết kế để gửi quá thường xuyên. Lệnh này chỉ được kích hoạt khi Dịch vụ Engage xác định nội dung có thể đã lỗi thời (ví dụ: một tuần trước). Bằng cách đó, bạn có thể yên tâm hơn rằng người dùng sẽ có trải nghiệm nội dung mới mẻ, ngay cả khi ứng dụng không được sử dụng trong một thời gian dài.

Bạn phải thiết lập BroadcastReceiver theo 2 cách sau:

  • Tự động đăng ký một thực thể của lớp BroadcastReceiver bằng cách sử dụng Context.registerReceiver(). Điều này cho phép giao tiếp từ các ứng dụng vẫn còn trong bộ nhớ.

Kotlin

class AppEngageBroadcastReceiver : BroadcastReceiver(){
  // Trigger recommendation cluster publish when PUBLISH_RECOMMENDATION broadcast
  // is received
  // Trigger featured cluster publish when PUBLISH_FEATURED broadcast is received
  // Trigger continuation cluster publish when PUBLISH_CONTINUATION broadcast is
  // received
}

fun registerBroadcastReceivers(context: Context){
  var  context = context
  context = context.applicationContext

// Register Recommendation Cluster Publish Intent
  context.registerReceiver(AppEngageBroadcastReceiver(),
                           IntentFilter(Intents.ACTION_PUBLISH_RECOMMENDATION))

// Register Featured Cluster Publish Intent
  context.registerReceiver(AppEngageBroadcastReceiver(),
                           IntentFilter(Intents.ACTION_PUBLISH_FEATURED))

// Register Continuation Cluster Publish Intent
  context.registerReceiver(AppEngageBroadcastReceiver(),
                           IntentFilter(Intents.ACTION_PUBLISH_CONTINUATION))
}

Java

class AppEngageBroadcastReceiver extends BroadcastReceiver {
// Trigger recommendation cluster publish when PUBLISH_RECOMMENDATION broadcast
// is received

// Trigger featured cluster publish when PUBLISH_FEATURED broadcast is received

// Trigger continuation cluster publish when PUBLISH_CONTINUATION broadcast is
// received
}

public static void registerBroadcastReceivers(Context context) {

context = context.getApplicationContext();

// Register Recommendation Cluster Publish Intent
context.registerReceiver(new AppEngageBroadcastReceiver(),
new IntentFilter(com.google.android.engage.service.Intents.ACTION_PUBLISH_RECOMMENDATION));

// Register Featured Cluster Publish Intent
context.registerReceiver(new AppEngageBroadcastReceiver(),
new IntentFilter(com.google.android.engage.service.Intents.ACTION_PUBLISH_FEATURED));

// Register Continuation Cluster Publish Intent
context.registerReceiver(new AppEngageBroadcastReceiver(),
new IntentFilter(com.google.android.engage.service.Intents.ACTION_PUBLISH_CONTINUATION));

}
  • Khai báo tĩnh quá trình triển khai bằng thẻ <receiver> trong tệp AndroidManifest.xml. Điều này cho phép ứng dụng nhận được ý định truyền tin khi ứng dụng không chạy, đồng thời cho phép ứng dụng phát hành nội dung đó.
<application>
   <receiver
      android:name=".AppEngageBroadcastReceiver"
      android:exported="true"
      android:enabled="true">
      <intent-filter>
         <action android:name="com.google.android.engage.action.PUBLISH_RECOMMENDATION" />
      </intent-filter>
      <intent-filter>
         <action android:name="com.google.android.engage.action.PUBLISH_FEATURED" />
      </intent-filter>
      <intent-filter>
         <action android:name="com.google.android.engage.action.PUBLISH_CONTINUATION" />
      </intent-filter>
   </receiver>
</application>

Dịch vụ sẽ gửi các ý định sau:

  • com.google.android.engage.action.PUBLISH_RECOMMENDATION Bạn nên bắt đầu lệnh gọi publishRecommendationClusters khi nhận được ý định này.
  • com.google.android.engage.action.PUBLISH_FEATURED Bạn nên bắt đầu lệnh gọi publishFeaturedCluster khi nhận được ý định này.
  • com.google.android.engage.action.PUBLISH_CONTINUATION Bạn nên bắt đầu lệnh gọi publishContinuationCluster khi nhận được ý định này.

Quy trình tích hợp

Để được hướng dẫn từng bước về cách xác minh quy trình tích hợp sau khi hoàn tất, hãy xem Quy trình tích hợp dành cho nhà phát triển Engage.

Câu hỏi thường gặp

Hãy xem mục Câu hỏi thường gặp về Engage SDK để biết các câu hỏi thường gặp.

Liên hệ

Hãy liên hệ với engage-developers@google.com nếu bạn có câu hỏi trong quá trình tích hợp.

Các bước tiếp theo

Sau khi bạn hoàn tất quá trình tích hợp này, các bước tiếp theo sẽ như sau:

  • Gửi email đến engage-developers@google.com và đính kèm APK tích hợp sẵn sàng cho Google kiểm thử.
  • Google sẽ xác minh và xem xét trong phạm vi nội bộ để đảm bảo quá trình tích hợp diễn ra như mong đợi. Nếu cần thay đổi, Google sẽ liên hệ với bạn để yêu cầu bạn cung cấp mọi thông tin chi tiết cần thiết.
  • Khi quá trình kiểm thử hoàn tất và bạn không cần thay đổi gì, Google sẽ liên hệ với bạn để thông báo rằng bạn có thể bắt đầu xuất bản APK tích hợp mới nhất lên Cửa hàng Play.
  • Sau khi Google xác nhận rằng APK mới nhất của bạn đã được xuất bản lên Cửa hàng Play, các cụm Đề xuất, Nổi bậtTiếp tục sẽ được xuất bản và hiển thị cho người dùng.