Engage SDK for TV 整合指南

「繼續觀看」會運用接續叢集,在一個 UI 群組中顯示多個應用程式提供的未看完影片,以及同一電視影集季別中待觀看的下一集。您可以在這個延續性叢集中推薦他們的實體。請按照本指南操作,瞭解如何使用 Engage SDK,透過「繼續觀看」體驗提升使用者參與度。

事前作業

開始之前,請先完成下列步驟:

  1. 更新至目標 API 19 以上版本

  2. com.google.android.engage 程式庫新增至應用程式:

    整合時需要使用不同的 SDK:一個用於行動應用程式,另一個用於電視應用程式。

    行動裝置

    
      dependencies {
        implementation 'com.google.android.engage:engage-core:1.5.5
      }
    

    電視

    
      dependencies {
        implementation 'com.google.android.engage:engage-tv:1.0.2
      }
    
  3. AndroidManifest.xml 檔案中,將 Engage 服務環境設為正式版。

    行動裝置

    
    <meta-data
        android:name="com.google.android.engage.service.ENV"
        android:value="PRODUCTION" />
    

    電視

    
    <meta-data
        android:name="com.google.android.engage.service.ENV"
        android:value="PRODUCTION" />
    
  4. 為 TV APK 新增 WRITE_EPG_DATA 權限

    <uses-permission android:name="com.android.providers.tv.permission.WRITE_EPG_DATA" />
    
  5. 使用背景服務 (例如 androidx.work) 安排發布時間,確保內容發布作業可靠。

  6. 為提供順暢的觀看體驗,請在發生下列事件時發布「繼續觀看」資料:

    1. 首次登入:使用者首次登入時,請發布資料,確保他們可以立即查看觀看記錄。
    2. 建立或切換設定檔 (多設定檔應用程式):如果應用程式支援多個設定檔,請在使用者建立或切換設定檔時發布資料。
    3. 影片播放中斷:為協助使用者接續上次的進度,請在使用者暫停或停止播放影片,或在播放期間離開應用程式時發布資料。
    4. 更新「繼續觀看」匣 (如支援):使用者從「繼續觀看」匣中移除項目時,請發布更新資料,反映這項變更。
    5. 影片觀看率:
      1. 如果是電影,請從「繼續觀看」專區移除已看完的電影。 如果電影屬於系列作品,請加入下一部電影,讓使用者持續觀看。
      2. 如果是劇集,請移除已看完的集數,並新增該系列節目的下一集 (如有),鼓勵使用者繼續觀看。

程式碼範例

這個範例應用程式示範開發人員如何整合影片探索 API,將個人化使用者資料傳送至 Google。這個範例應用程式也會示範如何建構可同時匯入行動裝置和 TV 應用程式的通用模組、何時叫用發布和刪除 API,以及如何使用 Worker 叫用發布和刪除 API。

整合

AccountProfile

如要在 Google TV 上享有個人化的「繼續觀看」體驗,請提供帳戶和個人資料資訊。使用 AccountProfile 提供下列資訊:

  1. 帳戶 ID:代表應用程式內使用者帳戶的專屬 ID。可以是實際帳戶 ID,也可以是適當的模糊處理版本。

  2. 設定檔 ID (選用):如果應用程式支援單一帳戶內的多個設定檔,請提供特定使用者設定檔的專屬 ID (同樣是真實或經過模糊處理的 ID)。

// If your app only supports account
val accountProfile = AccountProfile.Builder()
    .setAccountId("your_users_account_id")
    .build()

// If your app supports both account and profile
val accountProfile = AccountProfile.Builder()
    .setAccountId("your_users_account_id")
    .setProfileId("your_users_profile_id")
    .build()

建立實體

SDK 定義了不同實體,用來代表各種項目類型。後續對話群組支援下列實體:

  1. MovieEntity
  2. TvEpisodeEntity
  3. LiveStreamingVideoEntity
  4. VideoClipEntity

指定這些實體的平台專屬 URI 和海報圖片。

此外,如果尚未建立各個平台的播放 URI (例如 Android TV、Android 或 iOS),請一併建立。因此,當使用者在各個平台繼續觀看時,應用程式會使用目標播放 URI 播放影片內容。

// Required. Set this when you want continue watching entities to show up on
// Google TV
val playbackUriTv = PlatformSpecificUri.Builder()
    .setPlatformType(PlatformType.TYPE_ANDROID_TV)
    .setActionUri(Uri.parse("https://www.example.com/entity_uri_for_tv"))
    .build()

// Required. Set this when you want continue watching entities to show up on
// Google TV Android app, Entertainment Space, Playstore Widget
val playbackUriAndroid = PlatformSpecificUri.Builder()
    .setPlatformType(PlatformType.TYPE_ANDROID_MOBILE)
    .setActionUri(Uri.parse("https://www.example.com/entity_uri_for_android"))
    .build()

// Optional. Set this when you want continue watching entities to show up on
// Google TV iOS app
val playbackUriIos = PlatformSpecificUri.Builder()
    .setPlatformType(PlatformType.TYPE_IOS)
    .setActionUri(Uri.parse("https://www.example.com/entity_uri_for_ios"))
    .build()

val platformSpecificPlaybackUris =
    Arrays.asList(playbackUriTv, playbackUriAndroid, playbackUriIos)

海報圖片需要 URI 和像素尺寸 (高度和寬度)。提供多張海報圖片,鎖定不同外型規格,但請確認所有圖片都維持 16:9 的長寬比,且高度至少為 200 像素,確保「繼續觀看」實體能正確顯示,尤其是在 Google 的娛樂空間中。高度小於 200 像素的圖片可能不會顯示。

val images = Arrays.asList(
    Image.Builder()
        .setImageUri(Uri.parse("http://www.example.com/entity_image1.png"))
        .setImageHeightInPixel(300)
        .setImageWidthInPixel(169)
        .build(),
    Image.Builder()
        .setImageUri(Uri.parse("http://www.example.com/entity_image2.png"))
        .setImageHeightInPixel(640)
        .setImageWidthInPixel(360)
        .build()
    // Consider adding other images for different form factors
)
MovieEntity

以下範例說明如何建立包含所有必要欄位的 MovieEntity

val movieEntity = MovieEntity.Builder()
   .setWatchNextType(WatchNextType.TYPE_CONTINUE)
   .setName("Movie name")
   .addPlatformSpecificPlaybackUri(platformSpecificPlaybackUris)
   .addPosterImages(images)
   // Timestamp in millis for sample last engagement time 12/1/2023 00:00:00
   .setLastEngagementTimeMillis(1701388800000)
   // Suppose the duration is 2 hours, it is 72000000 in milliseconds
   .setDurationMills(72000000)
   // Suppose last playback offset is 1 hour, 36000000 in milliseconds
   .setLastPlayBackPositionTimeMillis(36000000)
   .build()

提供類型和內容分級等詳細資料,可讓 Google TV 以更多動態方式展示你的內容,並將內容推薦給合適的觀眾。

val genres = Arrays.asList("Action", "Science fiction")
val rating1 = RatingSystem.Builder().setAgencyName("MPAA").setRating("PG-13").build()
val contentRatings = Arrays.asList(rating1)
val movieEntity = MovieEntity.Builder()
    ...
    .addGenres(genres)
    .addContentRatings(contentRatings)
    .build()

除非您指定較短的到期時間,否則實體會自動保留 60 天。只有在需要於預設期限前移除實體時,才設定自訂到期日。

// Set the expiration time to be now plus 30 days in milliseconds
val expirationTime = DisplayTimeWindow.Builder()
    .setEndTimestampMillis(now().toMillis()+2592000000).build()
val movieEntity = MovieEntity.Builder()
    ...
    .addAvailabilityTimeWindow(expirationTime)
    .build()
TvEpisodeEntity

以下範例說明如何建立 TvEpisodeEntity,並填入所有必填欄位:

val tvEpisodeEntity = TvEpisodeEntity.Builder()
    .setWatchNextType(WatchNextType.TYPE_CONTINUE)
    .setName("Episode name")
    .addPlatformSpecificPlaybackUri(platformSpecificPlaybackUris)
    .addPosterImages(images)
    // Timestamp in millis for sample last engagement time 12/1/2023 00:00:00
    .setLastEngagementTimeMillis(1701388800000)
    .setDurationMills(72000000) // 2 hours in milliseconds
    // 45 minutes and 15 seconds in milliseconds is 2715000
    .setLastPlayBackPositionTimeMillis(2715000)
    .setEpisodeNumber("2")
    .setSeasonNumber("1")
    .setShowTitle("Title of the show")
    .build()

集數字串 (例如 "2") 和季別號碼字串 (例如 "1") 會先擴展為適當格式,再顯示在「繼續觀看」資訊卡上。請注意,這些值應為數字字串,請勿輸入「e2」、「episode 2」、「s1」或「season 1」。

如果特定電視節目只有一季,請將季別設為 1。

為盡量提高觀眾在 Google TV 上找到你內容的機會,建議提供其他資料,例如類型、內容分級和供應時間範圍,因為這些詳細資料可改善顯示方式和篩選選項。

val genres = Arrays.asList("Action", "Science fiction")
val rating1 = RatingSystem.Builder().setAgencyName("MPAA").setRating("PG-13").build()
val contentRatings = Arrays.asList(rating1)
val tvEpisodeEntity = TvEpisodeEntity.Builder()
    ...
    .addGenres(genres)
    .addContentRatings(contentRatings)
    .setSeasonTitle("Season Title")
    .setShowTitle("Show Title")
    .build()
VideoClipEntity

以下範例說明如何建立 VideoClipEntity,並填入所有必填欄位。

VideoClipEntity 代表使用者生成的短片,例如 YouTube 影片。

val videoClipEntity = VideoClipEntity.Builder()
    .setPlaybackUri(Uri.parse("https://www.example.com/uri_for_current_platform")
    .setWatchNextType(WatchNextType.TYPE_CONTINUE)
    .setName("Video clip name")
    .addPlatformSpecificPlaybackUri(platformSpecificPlaybackUris)
    .addPosterImages(images)
    // Timestamp in millis for sample last engagement time 12/1/2023 00:00:00
    .setLastEngagementTimeMillis(1701388800000)
    .setDurationMills(600000) //10 minutes in milliseconds
    .setLastPlayBackPositionTimeMillis(300000) //5 minutes in milliseconds
    .addContentRating(contentRating)
    .build()

您可以選擇設定建立者、建立者圖片、建立時間 (以毫秒為單位) 或可用時間範圍。

LiveStreamingVideoEntity

以下範例說明如何建立 LiveStreamingVideoEntity,並填入所有必要欄位。

val liveStreamingVideoEntity = LiveStreamingVideoEntity.Builder()
    .setPlaybackUri(Uri.parse("https://www.example.com/uri_for_current_platform")
    .setWatchNextType(WatchNextType.TYPE_CONTINUE)
    .setName("Live streaming name")
    .addPlatformSpecificPlaybackUri(platformSpecificPlaybackUris)
    .addPosterImages(images)
    // Timestamp in millis for sample last engagement time 12/1/2023 00:00:00
    .setLastEngagementTimeMillis(1701388800000)
    .setDurationMills(72000000) //2 hours in milliseconds
    .setLastPlayBackPositionTimeMillis(36000000) //1 hour in milliseconds
    .addContentRating(contentRating)
    .build()

你可以選擇設定直播實體的開始時間、廣播員、廣播員圖示或播放時間範圍。

如要進一步瞭解屬性和規定,請參閱 API 參考資料

提供接續叢集資料

AppEngagePublishClient 負責發布接續叢集。您可以使用 publishContinuationCluster() 方法發布 ContinuationCluster 物件。

首先,您應使用 isServiceAvailable() 檢查服務是否可供整合。

client.publishContinuationCluster(
    PublishContinuationClusterRequest
        .Builder()
        .setContinuationCluster(
            ContinuationCluster.Builder()
                .setAccountProfile(accountProfile)
                .addEntity(movieEntity1)
                .addEntity(movieEntity2)
                .addEntity(tvEpisodeEntity1)
                .addEntity(tvEpisodeEntity2)
                .setSyncAcrossDevices(true)
                .build()
        )
        .build()
)

服務收到要求後,系統會在單一交易中執行以下動作:

  • 移除開發合作夥伴提供的現有 ContinuationCluster 資料。
  • 剖析要求所提供的資料並儲存在更新後的ContinuationCluster

如果發生錯誤,整個要求都會遭到拒絕,現有狀態則維持不變。

發布 API 屬於更新/插入 API,會取代現有內容。如要更新 ContinuationCluster 中的特定實體,您必須重新發布所有實體。

請只為成人帳戶提供 ContinuationCluster 資料。 只有在 AccountProfile 屬於成人時發布。

跨裝置同步

SyncAcrossDevices 旗標可控制使用者的 ContinuationCluster 資料是否要在電視、手機、平板電腦等裝置之間同步。根據預設,跨裝置同步功能會停用。

值:

  • true:在使用者所有裝置間分享 ContinuationCluster 資料,提供順暢的觀看體驗。強烈建議您選用這個選項,以獲得最佳跨裝置體驗。
  • false:ContinuationCluster 資料僅限目前裝置使用。

媒體應用程式必須提供明確的設定,讓使用者啟用/停用跨裝置同步功能。向使用者說明優點,並儲存使用者的偏好設定一次,然後在 publishContinuationCluster 中套用。

// Example to allow cross device syncing.
client.publishContinuationCluster(
    PublishContinuationClusterRequest
        .Builder()
        .setContinuationCluster(
            ContinuationCluster.Builder()
                .setAccountProfile(accountProfile)
                .setSyncAcrossDevices(true)
                .build()
        )
        .build()
)

如要充分運用跨裝置功能,請確認應用程式已取得使用者同意聲明,並啟用 SyncAcrossDevices true。這樣一來,內容就能在裝置間順暢同步,進而提升使用者體驗和參與度。舉例來說,某合作夥伴導入這項功能後,由於內容顯示在多部裝置上,「繼續觀看」點擊次數增加了 40%。

刪除影片探索資料

如要在標準 60 天保留期限前,手動從 Google TV 伺服器刪除使用者資料,請使用 client.deleteClusters() 方法。服務收到要求後,會刪除帳戶設定檔或整個帳戶的所有現有影片探索資料。

DeleteReason 列舉會定義資料刪除原因。 以下程式碼會在登出時移除「繼續觀看」資料。


// If the user logs out from your media app, you must make the following call
// to remove continue watching data from the current google TV device,
// otherwise, the continue watching data will persist on the current
// google TV device until 60 days later.
client.deleteClusters(
    DeleteClustersRequest.Builder()
        .setAccountProfile(AccountProfile())
        .setReason(DeleteReason.DELETE_REASON_USER_LOG_OUT)
        .setSyncAcrossDevices(true)
        .build()
)

測試

使用驗證應用程式,確認 Engage SDK 整合是否正常運作。驗證應用程式提供多種工具,可協助您驗證資料,並確認廣播意圖是否獲得妥善處理。

呼叫發布 API 後,請檢查驗證應用程式,確認資料是否正確發布。應用程式介面中應會顯示獨立的續傳叢集列。

  • 在應用程式的 Android 資訊清單檔案中,只為非正式版建構作業設定「參與服務」旗標
  • 安裝並開啟 Engage Verify 應用程式
  • 如果「isServiceAvailable」為「false」,請按一下「切換」按鈕啟用。
  • 輸入應用程式的套件名稱,開始發布後即可自動查看已發布的資料。
  • 在應用程式中測試下列動作:
    • 登入。
    • 切換設定檔(如適用)。
    • 開始播放影片、暫停播放,或返回首頁。
    • 在影片播放期間關閉應用程式。
    • 從「繼續觀看」列中移除項目 (如支援)。
  • 每次執行動作後,請確認應用程式已叫用 publishContinuationClusters API,且驗證應用程式中顯示的資料正確無誤。
  • 如果實體實作正確,驗證應用程式會顯示綠色的「一切正常」勾號。

    驗證應用程式成功螢幕截圖
    圖 1. 驗證應用程式成功
  • 驗證應用程式會標示任何有問題的實體。

    驗證應用程式錯誤螢幕截圖
    圖 2. 驗證應用程式錯誤
  • 如要排解實體錯誤,請使用電視遙控器選取並點按驗證應用程式中的實體。系統會顯示特定問題,並以紅色醒目顯示供你查看 (請參閱下方範例)。

    驗證應用程式錯誤詳細資料
    圖 3. 驗證應用程式錯誤詳細資料

REST API

Engage SDK 提供 REST API,可在 iOS、Roku TV 等非 Android 平台上,提供一致的「繼續觀看」體驗。開發人員可透過這項 API,從非 Android 平台更新選擇加入的使用者的「繼續觀看」狀態。

必要條件

  • 您必須先完成以裝置端 Engage SDK 為基礎的整合。這個重要步驟會在 Google 的使用者 ID 和應用程式的 AccountProfile 之間建立必要的關聯。
  • API 存取權和驗證:如要在 Google Cloud 專案中查看及啟用 API,必須先通過許可清單程序。所有 API 要求都必須通過驗證。

取得存取權

如要在 Google Cloud 控制台中查看及啟用 API,必須先註冊帳戶。

  1. 請提供 Google Workspace 客戶 ID。如果沒有,您可能需要設定 Google Workspace,以及要用於呼叫 API 的任何 Google 帳戶。
  2. 使用與 Google Workspace 相關聯的電子郵件,透過 Google Cloud 控制台設定帳戶。
  3. 建立新專案
  4. 建立用於 API 驗證的服務帳戶。建立服務帳戶後,您會取得兩項項目:
    • 服務帳戶 ID。
    • 內含服務帳戶金鑰的 JSON 檔案。請妥善保管這個檔案,後續步驟將會用到,驗證用戶端是否可存取 API。
  5. Workspace 和相關聯的 Google 帳戶現在可以使用 REST API。 變更傳播完畢後,系統會通知您服務帳戶是否已可呼叫 API。
  6. 請按照這些步驟,準備發出委派的 API 呼叫。

發布接續叢集

如要發布影片探索資料,請使用下列語法,對 publishContinuationCluster API 執行 POST 要求。

https://tvvideodiscovery.googleapis.com/v1/packages/{package_name}/accounts/{account_id}/profiles/{profile_id}/publishContinuationCluster

地點:

  • package_name:媒體供應器套件名稱
  • accountId:使用者帳戶在您系統中的專屬 ID。必須與裝置端路徑中使用的 accountId 相符。
  • profileId:使用者在您系統中帳戶的個人資料專屬 ID。必須與裝置端路徑中使用的 profileId 相符。

不含個人資料的帳戶網址為:

https://tvvideodiscovery.googleapis.com/v1/packages/{package_name}/accounts/{account_id}/publishContinuationCluster

要求酬載會以 entities 欄位表示。entities 代表內容實體清單,可以是 MovieEntityTVEpisodeEntity。這是必填欄位。

要求主體

欄位

類型

必要

說明

實體

MediaEntity 物件清單

內容實體清單 (最多 5 個),系統只會保留前 5 個,其餘則會捨棄。允許空白清單,表示使用者已看完所有實體。

欄位 entities 包含個別的 movieEntitytvEpisodeEntity

欄位

類型

必要

說明

movieEntity

MovieEntity

代表 ContinuationCluster 內電影的物件。

tvEpisodeEntity

TvEpisodeEntity

代表 ContinuationCluster 內電視節目的物件。

實體陣列中的每個物件都必須是可用的 MediaEntity 類型之一,即 MovieEntityTvEpisodeEntity,以及通用和類型專屬的欄位。

下列程式碼片段展示 publishContinuationCluster API 的要求主體酬載。

{
  "entities": [
    {
      "movieEntity": {
        "watch_next_type": "WATCH_NEXT_TYPE_CONTINUE",
        "name": "Movie1",
        "platform_specific_playback_uris": [
          "https://www.example.com/entity_uri_for_android",
          "https://www.example.com/entity_uri_for_iOS"
        ],
        "poster_images": [
          "http://www.example.com/movie1_img1.png",
          "http://www.example.com/movie1_imag2.png"
        ],
        "last_engagement_time_millis": 864600000,
        "duration_millis": 5400000,
        "last_play_back_position_time_millis": 3241111
      }
    },
    {
      "tvEpisodeEntity": {
        "watch_next_type": "WATCH_NEXT_TYPE_CONTINUE",
        "name": "TV SERIES EPISODE 1",
        "platform_specific_playback_uris": [
          "https://www.example.com/entity_uri_for_android",
          "https://www.example.com/entity_uri_for_iOS"
        ],
        "poster_images": [
          "http://www.example.com/episode1_img1.png",
          "http://www.example.com/episode1_imag2.png"
        ],
        "last_engagement_time_millis": 864600000,
        "duration_millis": 1800000,
        "last_play_back_position_time_millis": 2141231,
        "episode_display_number": "1",
        "season_number": "1",
        "show_title": "title"
      }
    }
  ]
}

刪除影片探索資料

使用 clearClusters API 移除影片探索資料。

使用 POST 網址從影片探索資料中移除實體。 如要刪除後續叢集資料,請使用下列語法,對 clearClusters API 執行 POST 要求。

https://tvvideodiscovery.googleapis.com/v1/packages/{package_name}/accounts/{account_id}/profiles/{profile_id}/clearClusters

地點:

  • package_name:媒體供應器套件名稱。
  • accountId:使用者帳戶在您系統中的專屬 ID。必須與裝置端路徑中使用的 accountId 相符。
  • profileId:使用者在您系統中帳戶的個人資料專屬 ID。必須與裝置端路徑中使用的 profileId 相符。

clearClusters API 的酬載只包含一個欄位 reason,其中包含 DeleteReason,指定移除資料的原因。

{
  "reason": "DELETE_REASON_LOSS_OF_CONSENT"
}

測試

成功發布資料後,請使用使用者測試帳戶,確認預期內容是否顯示在目標 Google 服務 (例如 Google TV、Android 和 iOS 版 Google TV 行動應用程式) 的「繼續觀看」列中。

測試時,請等待幾分鐘的合理傳播延遲時間,並遵守觀看規定,例如觀看部分電影或看完一集節目。詳情請參閱應用程式開發人員的「接下來請看」指南

下載

下載前,請先同意以下條款及細則。

條款及細則

這是《Android 軟體開發套件授權協議》

1. 簡介

1.1 Android 軟體開發套件 (在《授權協議》中稱為「SDK」,具體包含 Android 系統檔案、封裝的 API 及 Google API 外掛程式) 根據《授權協議》的條款向您授權。《授權協議》構成您與 Google 之間具法律約束效力的合約,用於規範您對 SDK 的使用行為。1.2「Android」是指裝置的 Android 軟體堆疊,根據 Android 開放原始碼計畫提供使用,網址為 https://source.android.com/,並且不時更新。1.3「相容實作」是指符合以下條件的任何 Android 裝置:(i) 遵守 Android 相容性定義說明文件,這列載於 Android 相容性網站 (https://source.android.com/compatibility) 且可能不時更新;以及 (ii) 成功通過 Android Compatibility Test Suite (CTS)。1.4「Google」是指 Google LLC,該公司根據美國德拉瓦州法律成立,並根據美國法律營運,主要營運地點位於 1600 Amphitheatre Parkway, Mountain View, CA 94043, USA。

2. 接受本《授權協議》

2.1 您必須同意《授權協議》才能使用 SDK。如果您不接受《授權協議》,則無法使用 SDK。2.2 按下接受和/或使用此 SDK 即表示您同意遵守《授權協議》的條款。2.3 如果您受到美國或其他國家/地區法律 (包括您居住或使用 SDK 時所在的國家/地區) 的法律禁止使用 SDK,則不得接受《授權協議》且不得使用 SDK。2.4 如果您代表雇主或其他實體同意接受本《授權協議》的約束,即表示您聲明及擔保已獲得完整法律授權,可約束雇主或這類實體遵守本《授權協議》。如果您沒有必要的授權,則不得代表雇主或其他實體接受《授權協議》或使用 SDK。

3. Google 提供的 SDK 授權

3.1 根據《授權協議》的條款,Google 授予您有限、全球、免權利金、不可轉讓、非專屬且不可轉授權的授權以使用 SDK,且 SDK 用途僅限於開發與 Android 實作相容的應用程式。3.2 您不得使用此 SDK 開發其他平台的應用程式 (包括不相容的 Android 實作) 或開發其他 SDK。您當然可以開發其他平台的應用程式 (包括不相容的 Android 實作),前提是 SDK 並未用於上述用途。3.3 您同意 Google 或第三方擁有 SDK 的所有法律權利、所有權和利益,包括 SDK 既有的任何智慧財產權。「智慧財產權」是指根據專利法、著作權法、營業秘密法、商標法所述之所有權利,並享有所有其他財產權利。Google 保留未授予您的所有權利。 3.4 您不得將 SDK 用於《授權協議》未明確允許的任何目的。除了適用第三方授權要求的範圍內,您不得複製 (除了備份用途)、修改、調整、轉散佈、反編譯、反向工程、反組譯 SDK 或 SDK 的任何部分,或建立其衍生作品。3.5 依據開放原始碼軟體授權所授權的 SDK 元件之使用、複製和發布,僅受該開放原始碼軟體授權條款所規範,而非《授權協議》。3.6 您同意 Google 可在未向您事先通知的情況下變更 SDK 的格式和性質,而且日後推出的 SDK 版本可能會與先前 SDK 版本開發的應用程式不相容。您同意,Google 可自行斟酌 (永久或暫時) 停止向您或所有使用者提供 SDK (或 SDK 中的任何功能),無需事先通知。 3.7《授權協議》中沒有任何內容讓您有權利使用 Google 的任何商業名稱、商標、服務商標、標誌、網域名稱或其他獨特品牌特徵。3.8 您同意不會移除、遮掩或竄改 SDK 隨附或包含的任何專屬權利聲明 (包括版權和商標聲明)。

4. 您使用 SDK 的方式

4.1 Google 同意,依據您使用 SDK 開發的任何軟體應用程式的《授權協議》,Google 並未向您 (或您的授權者) 取得任何權利、所有權或利益,包括這類應用程式既有的智慧財產權。4.2 您同意僅依據下列各項允許的目的,使用 SDK 及編寫應用程式:(a)《授權協議》以及 (b) 相關管轄區的任何適用法律、法規或一般接受的實務或準則 (包括將資料或軟體匯入及匯出美國或其他相關國家/地區的相關法律)。4.3 您同意在使用 SDK 為一般大眾使用者開發應用程式時,保護這些使用者的隱私權和法律權利。如果使用者提供您使用者名稱、密碼或其他登入資訊或個人資訊,您必須確保使用者知道這些資訊將用於您的應用程式,且您必須為這些使用者提供具有足夠法律依據的隱私權聲明和保護。如果您的應用程式會儲存使用者提供的個人資訊或機密資訊,就必須採用安全的儲存方式。如果使用者向您的應用程式提供 Google 帳戶資訊,則您的應用程式僅能基於使用者已授權的用途且存取使用者「Google 帳戶」時,使用該項資訊存取使用者的「Google 帳戶」。 4.4 您同意不會參與任何使用 SDK 的活動 (包括應用程式的開發或發布),因而乾擾、中斷、損害或以其他方式存取任何行動服務,包括幹擾、中斷、損害或存取其他電信業者網路服務。4.5 您同意,就您透過 Android 和/或應用程式建立、傳輸或顯示的任何資料、內容或資源,以及因您的行為 (包括 Google 可能遭受的損失或損害) 而引致的任何後果 (包括 Google 可能遭受的任何損失或損害),您必須自行承擔責任 (且 Google 對您或任何第三方概不負責)。

5. 您的開發人員憑證

5.1 任何由 Google 核發予您或由您自行選擇的開發人員憑證,您同意負責維護其機密性,且對於使用您開發人員憑證所開發的全部應用程式,您同意承擔所有責任。

6. 隱私權及資訊

6.1 為持續創新及改善 SDK,Google 會從軟體蒐集特定的使用統計資料,包括但不限於唯一 ID、相關 IP 位址、軟體版本編號,以及關於使用 SDK 中工具和/或服務及其使用方式的資訊。蒐集任何上述資訊前,SDK 會通知您,並徵得您的同意。如果您不同意,系統將不會蒐集這些資訊。6.2 蒐集的資料會進行匯總檢視以改善 SDK,並依據《Google 隱私權政策》處理,其內容列載於以下網址:https://policies.google.com/privacy 6.3 可能會與 Google 合作夥伴分享去識別化和匯總的資料集以改善 SDK。

7. 第三方應用程式

7.1 如果您使用 SDK 執行第三方開發的應用程式,或是存取第三方提供的資料、內容或資源,您同意 Google 對這些應用程式、資料、內容或資源概不負責。您瞭解,對於您透過這類第三方應用程式存取的所有資料、內容或資源,均由最初提供這些內容的人員全權負責,且對於您因使用或存取任何這些第三方應用程式、資料、內容或資源可能遭受的任何損失或損害,Google 概不負責。 7.2 您應瞭解,透過這類第三方應用程式呈現的資料、內容和資源,可能受到供應商 (或其代表人員或公司) 擁有的智慧財產權保護。除非相關擁有者已特別向您提供權限,否則您不得根據這些資料、內容或資源 (無論是全部或其中一部分) 修改、出租、租用、貸款、銷售、發布或建立衍生作品。7.3 您確認使用這類第三方應用程式、資料、內容或資源時,可能必須遵守您和相關第三方另外簽訂的條款。在這種情況下,《授權協議》不會影響您與這些第三方的法律關係。

8. 使用 Android API

8.1 Google Data API 8.1.1 如果您使用任何 API 從 Google 擷取資料,即表示您確認該資料可能受到 Google 擁有,或是由提供資料的一方 (或其代表人員或公司) 擁有的智慧財產權保護。您使用任何這類 API 時可能須遵守其他服務條款。除非相關《服務條款》允許,否則您不得根據此資料 (無論是全部或其中一部分) 修改、出租、租用、貸款、銷售、發布或建立衍生作品。8.1.2 如果您使用任何 API 從 Google 擷取使用者的資料,即表示您瞭解並同意只有在使用者明確同意的情況下,您才能擷取資料,而且擷取的資料僅能用於使用者已授權的有限用途。如果您使用 https://developer.android.com/reference/android/speech/RecognitionService 列載的 Android Recognition Service API (本 API 會不時更新),即表示您瞭解使用 API 時必須遵守《Data Processing Addendum for Products where Google is a Data Processor》(Google 做為資料處理者時的產品資料處理附加條款),詳情請參閱 https://privacy.google.com/businesses/gdprprocessorterms/。提醒您,本附加條款會不時更新。您按下接受後,即表示同意《Data Processing Addendum for Products where Google is a Data Processor》的條款。

9. 終止本《授權協議》

9.1《授權協議》效力將持續至您或 Google 按以下規定終止為止。9.2 如果您想終止《授權協議》,停止使用 SDK 和任何相關開發人員憑證即可。9.3 如果發生下列情況,Google 可隨時終止《授權協議》:(A) 您違反《授權協議》的任何規定;或 (B) Google 必須依法終止您的行為;或 (C) Google 向您提供 SDK 特定部分 (例如 API) 的合作夥伴終止與您或 Google 停止向您提供 SDK 的特定部分或停止向您提供 SDK 的特定部分,或者 Google 決定不再向您提供 SDK 的特定部分,或停止向您提供 SDK 的特定部分 (D)9.4 本《授權協議》終止時,您和 Google 所因此而受益的所有法律權利、義務和責任,均不適用 (或在《授權協議》有效期間持續累積) 或明確表示持續有效,則不受本「協議」影響,第 14.7 項條款亦應無限期適用。

10. 免責事項

10.1 您明確瞭解並同意,您使用 SDK 時必須自行承擔全部風險,且 SDK 是依「現況」與「適用情形」提供的服務,Google 不提供任何形式的擔保。10.2 因您使用 SDK 及任何下載或其他軟體而衍生的損害,均須由您自行承擔風險和風險,且您需承擔任何因裝置遭受或損害而遭受損害或損失。10.3 Google 明確不提供任何形式之任何擔保和條件 (包括明示或默示) 之任何擔保和條件,但不僅限於適售性、適用性及規定。

11. 責任限制

11.1 您明確說明並同意,Google、其子公司和關係企業、其授權人無法就任何直接、間接或衍生的任何責任或授權,就任何衍生情形或授權就承擔任何責任、

12. 賠償

12.1 在法律允許的最大範圍內,若您因侵害您的商標權而違反、使您的

13. 《授權協議》變更

13.1 Google 得在發布新版 SDK 時變更《授權協議》。如有變更,Google 會在提供 SDK 的網站上提供新版《授權協議》。 14.1《授權協議》構成您與 Google 之間的完整法律協議,用於規範您對 SDK 的使用行為 (排除 Google 可能根據另外撰寫的協議向您提供的任何服務),且完全取代任何您與 Google 先前就 SDK 所簽訂的協議。14.2 您同意,如果 Google 未行使或執行《授權協議》所載明 (或 Google 在任何適用法律下所擁有) 的任何法律權利或補救措施,不應構成權利之正式拋棄,且 Google 仍然可以行使這類權利或補救措施。 14.3 如果任何具管轄權的法院判定本《授權協議》的任何條款無效,則該條款將自本《授權協議》中移除,其他條款效力不受影響。「授權協議」的其餘條款仍具有有效且可執行的效力。 14.4 您瞭解並同意,Google 子公司的每位成員皆為本《授權協議》的受益第三人,且這些公司有權直接執行《授權協議》條款,並根據本《授權協議》條款的規定主張相關利益 (或有利於這些公司的權利)。除此之外的任何其他個人或公司,均非「授權協議」的第三方受益人。 14.5 出口限制。SDK 必須遵守美國出口法律和法規。您必須遵守適用於 SDK 的所有國內和國際出口法律和法規。這些法律含對目的地、終端使用者和終端用途的限制。 14.6 未經另一方的事先書面許可,您或 Google 不得轉讓或轉移《授權協議》所授予的權利,亦不得將「本協議」所賦予之責任與義務委派予他人。14.7《授權協議》以及您與 Google 在《授權協議》規定下的關係受到美國加州法律約束,但不適用美國加州法律衝突條款。您與 Google 同意服從位於加州聖克拉拉郡法院之專屬管轄權,解決任何因《授權協議》而引致之法律事務。除上述規定之外,您亦同意 Google 仍可向任何管轄區的法院申請假處分救濟 (或同類緊急法律救濟處分)。2021 年 7 月 27 日
下載

verify_app_multiplatform_public_20250602.apk