Przeczytaj pakiet SDK Engage: instrukcje integracji technicznej z usługami innych firm

Google tworzy platformę na urządzeniu, która porządkuje aplikacje użytkowników według kategorii i zapewnia nowe, atrakcyjne możliwości związane z oglądaniem i odkrywaniem treści aplikacji w spersonalizowany sposób. Dzięki temu partnerzy mogą prezentować swoje najlepsze treści na specjalnym kanale poza aplikacją.

Ten przewodnik zawiera instrukcje dla deweloperów, którzy chcą zintegrować swoją czytelne treści z wykorzystaniem pakietu SDK dla Agencji do zapełnienia zarówno tej nowej powierzchni, jak i dotychczasowych platform Google.

Szczegóły integracji

Terminologia

Ta integracja obejmuje 3 typy klastrów: Rekomendacja, Kontynuacja i Polecane.

  • Klastry rekomendacji wyświetlają spersonalizowane sugestie dotyczące treści od danego partnera ds. deweloperów.

    Rekomendacje mają taką strukturę:

    • Klaster rekomendacji: widok interfejsu zawierający grupę rekomendacji od jednego partnera deweloperskiego.

      Rysunek 1. Interfejs Entertainment Space z klastrem rekomendacji od jednego partnera.
    • Encja: obiekt reprezentujący pojedynczy element w klastrze. Podmiotem może być np. e-book, audiobook lub seria książek. Listę obsługiwanych typów encji znajdziesz w sekcji Podaj dane encji.

      Rysunek 2. Interfejs Entertainment Space z pojedynczym elementem w klastrze rekomendacji pojedynczego partnera.
  • Klaster Kontynuacja pokazuje niedokończone książki od wielu partnerów programistów w jednym zgrupowaniu interfejsu. Każdy partner będący deweloperem będzie mógł rozpowszechniać w klastrze kontynuacji maksymalnie 10 encji.

    Rysunek 3. Interfejs Entertainment Space z grupą kontynuacji z niedokończonymi rekomendacjami od wielu partnerów (w tej chwili widoczna jest tylko jedna rekomendacja).
  • Klaster Polecane zawiera elementy pochodzące od różnych deweloperów, które są grupowane w ramach jednego interfejsu. U góry interfejsu będzie widoczny pojedynczy klaster Polecane, miejsce docelowe nadrzędne względem wszystkich klastrów rekomendacji. Każdy partner deweloper będzie mógł rozpowszechniać w klastrze Polecane maksymalnie 10 encji.

    Rysunek 4. Interfejs Entertainment Space z widocznym klastrem Polecane z rekomendacjami od wielu partnerów (w tej chwili widoczna jest tylko jedna rekomendacja).

Przygotowanie

Minimalny poziom interfejsu API: 19

Dodaj bibliotekę com.google.android.play:engage do aplikacji:

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

Podsumowanie

Projekt opiera się na implementacji powiązanej usługi.

Dane, które klient może publikować, podlegają tym ograniczeniom w przypadku różnych typów klastrów:

Typ klastra Limity klastrów Maksymalne limity encji w klastrze
Klastry rekomendacji Maksymalnie 5 Maksymalnie 50
Klaster kontynuacji Maksymalnie 1 Maksymalnie 10
Polecany klaster Maksymalnie 1 Maksymalnie 10

Krok 1. Podaj dane encji

Pakiet SDK ma zdefiniowane różne elementy reprezentujące każdy typ elementu. W przypadku kategorii Czytaj obsługujemy te elementy:

  1. EbookEntity
  2. AudiobookEntity
  3. BookSeriesEntity

W tabelach poniżej znajdziesz dostępne atrybuty i wymagania dla poszczególnych typów.

EbookEntity

Obiekt EbookEntity reprezentuje e-booka (np. e-booka „Becoming” Michelle Obamy).

Atrybut Wymóg Uwagi
Nazwa Wymagany
Obrazy plakatu Wymagany Musisz przesłać co najmniej 1 obraz. Wskazówki znajdziesz w specyfikacji obrazów.
Autor Wymagany Musisz podać co najmniej jedno imię i nazwisko autora.
Identyfikator URI linku do działania Wymagany

Precyzyjny link do aplikacji dostawcy e-booka.

Uwaga: do atrybucji możesz używać precyzyjnych linków. Przeczytaj te najczęstsze pytania

Data publikacji Opcjonalnie W milisekundach epoki, jeśli podano.
Opis Opcjonalnie Nazwa nie może przekraczać 200 znaków.
Cena Opcjonalnie Dowolny tekst
Liczba stron Opcjonalnie Jeśli została podana, musi być dodatnią liczbą całkowitą.
Gatunek Opcjonalnie Lista gatunków powiązanych z książką.
Nazwa serii Opcjonalnie Nazwa serii, do której należy e-book (na przykład Harry Potter).
Indeks jednostek serii Opcjonalnie Indeks e-booka z serii, gdzie 1 to pierwszy e-book z serii. Jeśli np. Harry Potter i więzień Azkabanu jest trzecią książką w serii, należy ustawić wartość 3.
Kontynuuj typ książki Opcjonalnie

TYPE_continue – wznawianie w przypadku niedokończonej książki.

TYPE_NEXT – kontynuuj tworzenie nowego elementu z serii.

TYPE_NEW – nowo wydany.

Czas ostatniego zaangażowania Wymagane warunkowo

Należy je podać, gdy element znajduje się w klastrze kontynuacji.

*Nowo* pozyskane e-booki mogą zostać uwzględnione w grupie czytania dalej.

W milisekundach w epoce.

Procent postępu ukończenia Wymagane warunkowo

Należy je podać, gdy element znajduje się w klastrze kontynuacji.

Wartość musi być większa niż 0 i mniejsza niż 100.

DisplayTimeWindow – ustaw przedział czasu dla treści wyświetlanej na platformie
Sygnatura czasowa rozpoczęcia Opcjonalnie

Sygnatura czasowa epoki, po której treść ma się pojawić na powierzchni.

Jeśli zasada jest nieskonfigurowana, treści mogą się wyświetlać na tej platformie.

W milisekundach w epoce.

Sygnatura czasowa zakończenia Opcjonalnie

Sygnatura czasowa epoki, po której treści nie wyświetlają się już na powierzchni.

Jeśli zasada jest nieskonfigurowana, treści mogą się wyświetlać na tej platformie.

W milisekundach w epoce.

AudiobookEntity

Obiekt AudiobookEntity reprezentuje audiobooka (np. audiobooka Becoming Michelle Obamy).

Atrybut Wymóg Uwagi
Nazwa Wymagany
Obrazy plakatu Wymagany Musisz przesłać co najmniej 1 obraz. Wskazówki znajdziesz w specyfikacji obrazów.
Autor Wymagany Musisz podać co najmniej jedno imię i nazwisko autora.
Narrator Wymagany Musisz podać co najmniej 1 imię i nazwisko lektora.
Identyfikator URI linku do działania Wymagany

Precyzyjny link do aplikacji dostawcy audiobooka.

Uwaga: do atrybucji możesz używać precyzyjnych linków. Przeczytaj te najczęstsze pytania

Data publikacji Opcjonalnie W milisekundach epoki, jeśli podano.
Opis Opcjonalnie Nazwa nie może przekraczać 200 znaków.
Cena Opcjonalnie Dowolny tekst
Czas działania Opcjonalnie Jeśli została podana, musi być wartością dodatnią.
Gatunek Opcjonalnie Lista gatunków powiązanych z książką.
Nazwa serii Opcjonalnie Nazwa serii, do której należy audiobook (na przykład Harry Potter).
Indeks jednostek serii Opcjonalnie Indeks audiobooka z serii, gdzie 1 to pierwszy audiobook z serii. Jeśli np. Harry Potter i więzień Azkabanu jest trzecią książką w serii, należy ustawić wartość 3.
Kontynuuj typ książki Opcjonalnie

TYPE_continue – wznawianie w przypadku niedokończonej książki.

TYPE_NEXT – kontynuuj tworzenie nowego elementu z serii.

TYPE_NEW – nowo wydany.

Czas ostatniego zaangażowania Wymagane warunkowo

Należy je podać, gdy element znajduje się w klastrze kontynuacji.

W milisekundach w epoce.

Procent postępu ukończenia Wymagane warunkowo

Należy je podać, gdy element znajduje się w klastrze kontynuacji.

*Nowo* pozyskane audiobooki mogą stać się częścią grupy czytających dalej.

Wartość musi być większa niż 0 i mniejsza niż 100.

DisplayTimeWindow – ustaw przedział czasu dla treści wyświetlanej na platformie
Sygnatura czasowa rozpoczęcia Opcjonalnie

Sygnatura czasowa epoki, po której treść ma się pojawić na powierzchni.

Jeśli zasada jest nieskonfigurowana, treści mogą się wyświetlać na tej platformie.

W milisekundach w epoce.

Sygnatura czasowa zakończenia Opcjonalnie

Sygnatura czasowa epoki, po której treści nie wyświetlają się już na powierzchni.

Jeśli zasada jest nieskonfigurowana, treści mogą się wyświetlać na tej platformie.

W milisekundach w epoce.

BookSeriesEntity

Obiekt BookSeriesEntity reprezentuje serię książek (np. serię Harry Potter, która obejmuje 7 książek).

Atrybut Wymóg Uwagi
Nazwa Wymagany
Obrazy plakatu Wymagany Musisz przesłać co najmniej 1 obraz. Wskazówki znajdziesz w specyfikacji obrazów.
Autor Wymagany Musisz podać co najmniej jedno imię i nazwisko autora.
Identyfikator URI linku do działania Wymagany

Precyzyjny link do aplikacji dostawcy audiobooka lub e-booka.

Uwaga: do atrybucji możesz używać precyzyjnych linków. Przeczytaj te najczęstsze pytania

Liczba książek Wymagany Liczba książek w serii.
Opis Opcjonalnie Nazwa nie może przekraczać 200 znaków.
Gatunek Opcjonalnie Lista gatunków powiązanych z książką.
Kontynuuj typ książki Opcjonalnie

TYPE_continue – wznawianie w przypadku niedokończonej książki.

TYPE_NEXT – kontynuuj tworzenie nowego elementu z serii.

TYPE_NEW – nowo wydany.

Czas ostatniego zaangażowania Wymagane warunkowo

Należy je podać, gdy element znajduje się w klastrze kontynuacji.

W milisekundach w epoce.

Procent postępu ukończenia Wymagane warunkowo

Należy je podać, gdy element znajduje się w klastrze kontynuacji.

*Nowo* pozyskana seria książek może zostać częścią grupy czytanych dalej.

Wartość musi być większa niż 0 i mniejsza niż 100.

DisplayTimeWindow – ustaw przedział czasu dla treści wyświetlanej na platformie
Sygnatura czasowa rozpoczęcia Opcjonalnie

Sygnatura czasowa epoki, po której treść ma się pojawić na powierzchni.

Jeśli zasada jest nieskonfigurowana, treści mogą się wyświetlać na tej platformie.

W milisekundach w epoce.

Sygnatura czasowa zakończenia Opcjonalnie

Sygnatura czasowa epoki, po której treści nie wyświetlają się już na powierzchni.

Jeśli zasada jest nieskonfigurowana, treści mogą się wyświetlać na tej platformie.

W milisekundach w epoce.

Specyfikacja obrazu

Poniżej znajdziesz wymagane specyfikacje komponentów z obrazem:

Format obrazu Wymóg Minimalny rozmiar w pikselach Zalecany rozmiar w pikselach
Kwadrat (1 x 1) Wymagany 300 × 300 1200x1200
Poziomy (1,91 x 1) Opcjonalnie 600x314 1200x628
Orientacja pionowa (4 x 5) Opcjonalnie 480 × 600 960x1200

Formaty plików

PNG, JPG, statyczne pliki GIF, WebP

Maksymalny rozmiar pliku

5120 KB

Dodatkowe zalecenia

  • Bezpieczny obszar obrazu: ważne treści umieść w środkowych 80% obrazu.

Przykład

AudiobookEntity audiobookEntity =
        new AudiobookEntity.Builder()
            .setName("Becoming")
            .addPosterImage(
                      new Image.Builder()
                          .setImageUri(Uri.parse("http://www.x.com/image.png"))
                          .setImageHeightInPixel(960)
                          .setImageWidthInPixel(408)
                          .build())
            .addAuthor("Michelle Obama")
            .addNarrator("Michelle Obama")
            .setActionLinkUri(Uri.parse("https://play.google/audiobooks/1"))
            .setDurationMillis(16335L)
            .setPublishDateEpochMillis(1633032895L)
            .setDescription("An intimate, powerful, and inspiring memoir")
            .setPrice("$16.95")
            .addGenre("biography")
            .build();

Krok 2. Podaj dane klastra

Zalecamy, aby zadanie publikowania treści było wykonywane w tle (np. za pomocą narzędzia WorkManager) i planowane regularnie lub na podstawie zdarzeń (np. za każdym razem, gdy użytkownik otworzy aplikację lub gdy tylko doda coś do koszyka).

Za publikowanie klastrów odpowiada AppEngagePublishClient. Klient udostępnia te interfejsy API:

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

isServiceAvailable

Ten interfejs API służy do sprawdzania, czy usługa jest dostępna do integracji i czy treści można zaprezentować na urządzeniu.

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

Ten interfejs API służy do publikowania listy obiektów RecommendationCluster.

Kotlin


client.publishRecommendationClusters(
            PublishRecommendationClustersRequest.Builder()
                .addRecommendationCluster(
                    RecommendationCluster.Builder()
                        .addEntity(entity1)
                        .addEntity(entity2)
                        .setTitle("Reconnect with yourself")
                        .build())
                .build())

Java


client.publishRecommendationClusters(
            new PublishRecommendationClustersRequest.Builder()
                .addRecommendationCluster(
                    new RecommendationCluster.Builder()
                        .addEntity(entity1)
                        .addEntity(entity2)
                        .setTitle("Reconnect with yourself")
                        .build())
                .build());

Gdy usługa otrzyma żądanie, w ramach jednej transakcji wykonywane są te działania:

  • Dotychczasowe dane aplikacji RecommendationCluster od partnera dewelopera zostaną usunięte.
  • Dane z żądania są analizowane i przechowywane w zaktualizowanym klastrze rekomendacji.

W przypadku błędu całe żądanie jest odrzucane, a istniejący stan zostaje zachowany.

publishFeaturedCluster

Ten interfejs API służy do publikowania listy obiektów FeaturedCluster.

Kotlin


client.publishFeaturedCluster(
            PublishFeaturedClusterRequest.Builder()
                .setFeaturedCluster(
                    FeaturedCluster.Builder()
                        ...
                        .build())
                .build())

Java


client.publishFeaturedCluster(
            new PublishFeaturedClusterRequest.Builder()
                .setFeaturedCluster(
                    new FeaturedCluster.Builder()
                        ...
                        .build())
                .build());

Gdy usługa otrzyma żądanie, w ramach jednej transakcji wykonywane są te działania:

  • Dotychczasowe dane aplikacji FeaturedCluster od partnera dewelopera zostaną usunięte.
  • Dane z żądania są analizowane i przechowywane w zaktualizowanym klastrze Polecane.

W przypadku błędu całe żądanie jest odrzucane, a istniejący stan zostaje zachowany.

publishContinuationCluster

Ten interfejs API służy do publikowania obiektu ContinuationCluster.

Kotlin


client.publishContinuationCluster(
            PublishContinuationClusterRequest.Builder()
                .setContinuationCluster(
                    ContinuationCluster.Builder()
                        .addEntity(book_entity1)
                        .addEntity(book_entity2)
                        .build())
                .build())

Java


client.publishContinuationCluster(
            PublishContinuationClusterRequest.Builder()
                .setContinuationCluster(
                    ContinuationCluster.Builder()
                        .addEntity(book_entity1)
                        .addEntity(book_entity2)
                        .build())
                .build())

Gdy usługa otrzyma żądanie, w ramach jednej transakcji wykonywane są te działania:

  • Dotychczasowe dane aplikacji ContinuationCluster od partnera dewelopera zostaną usunięte.
  • Dane z żądania są analizowane i przechowywane w zaktualizowanym klastrze kontynuacji.

W przypadku błędu całe żądanie jest odrzucane, a istniejący stan zostaje zachowany.

publishUserAccountManagementRequest

Ten interfejs API służy do publikowania karty logowania . Użytkownicy są kierowani na stronę logowania w aplikacji, na której mogą publikować treści (lub udostępniać im bardziej spersonalizowane treści).

Te metadane są częścią karty logowania –

Atrybut Wymóg Opis
Identyfikator URI działania Wymagane Precyzyjny link do działania (np. do strony logowania w aplikacji)
Obraz Opcjonalnie – jeśli nie podano tytułu, należy podać tytuł

Obraz widoczny na karcie

obrazy o współczynniku proporcji 16 x 9 i rozdzielczości 1264 x 712,

tytuł; Opcjonalnie – jeśli nie podano, należy przesłać obraz. Tytuł na karcie
Tekst działania Opcjonalnie Tekst wyświetlany w wezwaniu do działania (np. „Zaloguj się”)
Podtytuł Opcjonalnie Opcjonalne napisy na karcie

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());

Gdy usługa otrzyma żądanie, w ramach jednej transakcji wykonywane są te działania:

  • Dotychczasowe dane UserAccountManagementCluster od partnera dewelopera zostaną usunięte.
  • Dane z żądania są analizowane i przechowywane w zaktualizowanym klastrze UserAccountManagementCluster.

W przypadku błędu całe żądanie jest odrzucane, a istniejący stan zostaje zachowany.

updatePublishStatus

Jeśli z jakichkolwiek wewnętrznych powodów biznesowych nie zostanie opublikowany żaden z klastrów, zdecydowanie zalecamy zaktualizowanie stanu publikacji za pomocą interfejsu API updatePublishStatus. To ważne, ponieważ :

  • Podanie stanu we wszystkich scenariuszach, nawet po opublikowaniu treści (STAN == OPUBLIKOWANO), ma kluczowe znaczenie przy wypełnianiu paneli, które korzystają z tego jednoznacznego stanu do przekazywania informacji o stanie i innych wskaźnikach integracji.
  • Jeśli treści nie są opublikowane, ale stan integracji nie jest uszkodzony (STATUS == NOT_OpublikujED), Google może uniknąć aktywowania alertów w panelach stanu aplikacji. Jest to potwierdzenie, że treści nie zostały opublikowane z powodu oczekiwanej sytuacji z punktu widzenia dostawcy.
  • Dzięki temu deweloperzy mogą określić, kiedy dane są publikowane, a kiedy nie.
  • Google może używać kodów stanu, aby skłonić użytkownika do wykonania określonych działań w aplikacji, co pozwoli mu zobaczyć zawartość aplikacji lub ją przezwyciężyć.

Lista kodów stanu kwalifikującego się do publikacji :

// 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

Jeśli treści nie zostały opublikowane, ponieważ użytkownik nie jest zalogowany, zalecamy opublikowanie karty logowania. Jeśli z jakiegoś powodu dostawcy nie mogą opublikować karty logowania, zalecamy wywołanie interfejsu API updatePublishStatus z kodem stanu NOT_OpublikujED_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

Ten interfejs API służy do usuwania zawartości klastrów rekomendacji.

Kotlin


client.deleteRecommendationClusters()

Java


client.deleteRecommendationClusters();

Gdy usługa otrzyma żądanie, usunie istniejące dane z klastrów rekomendacji. W przypadku błędu całe żądanie jest odrzucane, a obecny stan zostaje zachowany.

deleteFeaturedCluster

Ten interfejs API służy do usuwania zawartości polecanego klastra.

Kotlin


client.deleteFeaturedCluster()

Java


client.deleteFeaturedCluster();

Po otrzymaniu żądania usługa usuwa istniejące dane z polecanego klastra. W przypadku błędu całe żądanie jest odrzucane, a obecny stan zostaje zachowany.

deleteContinuationCluster

Ten interfejs API służy do usuwania zawartości klastra kontynuacji.

Kotlin


client.deleteContinuationCluster()

Java


client.deleteContinuationCluster();

Gdy usługa otrzyma żądanie, usunie istniejące dane z klastra kontynuacji. W przypadku błędu całe żądanie jest odrzucane, a obecny stan zostaje zachowany.

deleteUserManagementCluster

Ten interfejs API służy do usuwania zawartości klastra UserAccountManagement.

Kotlin


client.deleteUserManagementCluster()

Java


client.deleteUserManagementCluster();

Po otrzymaniu żądania usługa usuwa istniejące dane z klastra UserAccountManagement. W przypadku błędu całe żądanie jest odrzucane, a bieżący stan zostaje zachowany.

deleteClusters

Ten interfejs API służy do usuwania treści określonego typu klastra.

Kotlin


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

Java


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

Gdy usługa otrzymuje żądanie, usuwa istniejące dane ze wszystkich klastrów pasujących do określonych typów klastrów. Klienty mogą przekazywać 1 lub wiele typów klastrów. W przypadku błędu całe żądanie jest odrzucane, a obecny stan zostaje zachowany.

Obsługa błędów

Zdecydowanie zalecamy wsłuchiwanie się w wynik zadania z interfejsów API publikowania, aby można było podjąć dalsze działania w celu odzyskania udanego zadania i ponownego przesłania go.

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
                    }
                  }
                }
              });

Błąd jest zwracany jako AppEngageException, a przyczyna jest podana w postaci kodu błędu.

Kod błędu Uwaga:
SERVICE_NOT_FOUND Usługa jest niedostępna na danym urządzeniu.
SERVICE_NOT_AVAILABLE Usługa jest dostępna na danym urządzeniu, ale nie jest dostępna w momencie połączenia (na przykład jest wyraźnie wyłączona).
SERVICE_CALL_EXECUTION_FAILURE Nie udało się wykonać zadania z powodu problemów z wątkiem. W takim przypadku można spróbować ponownie.
SERVICE_CALL_PERMISSION_DENIED Rozmówca nie może nawiązać połączenia z usługą.
SERVICE_CALL_INVALID_ARGUMENT Żądanie zawiera nieprawidłowe dane (na przykład więcej niż dozwolona liczba klastrów).
SERVICE_CALL_INTERNAL Po stronie usługi wystąpił błąd.
SERVICE_CALL_RESOURCE_EXHAUSTED Wywoływanie usługi jest wykonywane zbyt często.

Krok 3. Obsługuj intencje transmisji

Oprócz wykonywania wywołań interfejsu Content API w zadaniu musisz też skonfigurować BroadcastReceiver, aby odbierać żądanie opublikowania treści.

Intencje dotyczące przesyłania służą głównie do reaktywacji aplikacji i wymuszania synchronizacji danych. Intencje transmisji nie są przeznaczone do wysyłania zbyt często. Jest wywoływane tylko wtedy, gdy usługa dla Agencji stwierdzi, że treści mogą być nieaktualne (np. sprzed tygodnia). Dzięki temu zyska on większą pewność, że użytkownik będzie mógł korzystać z nowych treści, nawet jeśli aplikacja nie była uruchamiana od dłuższego czasu.

BroadcastReceiver należy skonfigurować na dwa sposoby:

  • Dynamicznie zarejestruj instancję klasy BroadcastReceiver za pomocą Context.registerReceiver(). Umożliwia to komunikację z aplikacji, które wciąż są zapisane w pamięci.
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));

}
  • Statycznie zadeklaruj implementację za pomocą tagu <receiver> w pliku AndroidManifest.xml. Dzięki temu aplikacja może odbierać komunikaty, gdy nie jest uruchomiona, oraz publikować treści.
<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>

Usługa będzie wysyłać te zamiary:

  • com.google.android.engage.action.PUBLISH_RECOMMENDATION Zalecamy uruchomienie wywołania publishRecommendationClusters przy odbieraniu tej intencji.
  • com.google.android.engage.action.PUBLISH_FEATURED Zalecamy uruchomienie wywołania publishFeaturedCluster po otrzymaniu tej intencji.
  • com.google.android.engagement.action.publish_CONTINUATIONIt is recommended to start apublishContinuationCluster`, gdy otrzymasz tę intencję.

Przepływ pracy w integracji

Szczegółowy przewodnik dotyczący weryfikowania integracji po jej zakończeniu znajdziesz w artykule o procesie integracji programistycznej Google Workspace.

Najczęstsze pytania

Zapoznaj się z odpowiedziami na najczęstsze pytania dotyczące pakietu SDK dla Agencji.

Kontakt

Jeśli masz pytania dotyczące procesu integracji, wyślij e-maila na adres engagement-developers@google.com. Nasz zespół odpowie tak szybko, jak to będzie możliwe.

Dalsze kroki

Po zakończeniu integracji wykonaj te czynności:

  • Wyślij e-maila na adres Engage-developers@google.com i załącz zintegrowany pakiet APK, który jest gotowy do przetestowania przez Google.
  • Google przeprowadzi weryfikację i weryfikację wewnętrzną, aby sprawdzić, czy integracja działa zgodnie z oczekiwaniami. Jeśli konieczne będą zmiany, Google skontaktuje się z Tobą, aby przekazać Ci wszystkie niezbędne informacje.
  • Gdy testy zostaną zakończone i nie będą wymagane żadne zmiany, Google skontaktuje się z Tobą, aby poinformować, że możesz rozpocząć publikowanie zaktualizowanego i zintegrowanego pakietu APK w Sklepie Play.
  • Gdy Google potwierdzi, że zaktualizowany plik APK zostanie opublikowany w Sklepie Play, klastry Rekomendacja, Polecane i Kontynuacja zostaną opublikowane i będą widoczne dla użytkowników.