Android 升級邀請

升級邀請是使用者流程,可展示目前可用的 Android 作業系統主要升級版本所含的重要新功能。

這個流程的目的是說服使用者將裝置升級至最新 OS 版本。

如果裝置有待使用者核准的 OS 升級,使用者會收到推播通知,當中會顯示新功能並邀請他們執行升級。

裝置製造商可以提交「要求啟用 Android 升級邀請」表單,為 Android OS 裝置啟用升級派對。

自訂升級邀請體驗

您可以透過下列方式自訂升級邀請體驗:

  • 移除不相關的功能。
  • 更新文字方塊中的語言。
  • 修改動畫、顏色和字型,配合您的品牌。

如要自訂流程,請參閱「升級邀請樣式指南」,並在表單回覆中提供自訂資訊。

升級邀請樣式指南

使用這份樣式指南修改升級邀請的外觀,以符合您的品牌 (畫面、顏色、字型)。強烈建議您保留原始設計的尺寸和結構。

升級邀請流程包含下列三個元件:

  • 簡介畫面
  • 功能畫面
  • 結尾畫面
圖 1. 升級邀請流程中的三種畫面類型

每個畫面都會顯示動畫,說明各項功能。

簡介畫面

簡介畫面包含簡短動畫,歡迎使用者並鼓勵他們啟動簡介畫面中顯示的流程。

版面配置
圖 2. 升級邀請簡介畫面的線框配置

裝置動畫一律包含:

  • 白色背景和彩色形狀
  • 裝置外框
  • UI 內容
樣式

如果選擇採用 Material You 樣式,可以使用範例中顯示的預設顏色和形狀。

圖 3. 升級邀請流程的預設色彩配置。

如果使用自己的品牌顏色,請確認該顏色與使用者介面背景相襯。

動作

方法 1:透過主畫面上的時鐘

  1. 數字進入畫面。
  2. 數字會移至中心,並縮小。系統會顯示手機框架。
  3. 手機會縮小,形狀開始進入畫面。
  4. 動畫已完成。形狀會持續輕輕移動。
圖 4. 升級邀請的線框配置 簡介畫面動畫,附有時鐘。
圖 5. 簡介畫面時鐘的動畫範例。

方法 2:主畫面沒有時鐘

  1. 手機進入畫面。
  2. 手機移至中央,並放大尺寸。形狀開始進入畫面。
  3. 手機達到最大尺寸,形狀會持續移動。
圖 6. 升級邀請簡介畫面動畫的線框配置,不含時鐘。
圖 7. 不含時鐘的簡介畫面動畫範例。

功能畫面

每個功能畫面都會強調新 OS 的一項功能。

版面配置
圖 8. 升級邀請功能畫面的線框版面配置。

裝置動畫一律包含:

  • 彩色背景
  • 裝置邊框
  • UI 內容
樣式
  • 選擇與 UI 內容和整體外觀相符的背景顏色。
  • 在畫面中設定容易辨識的字型大小。視需要設定較大的字型大小。
動作

錄製每個功能的流程動畫,包括觸控互動。 將錄製內容匯出為 Lottie 檔案

結尾畫面

結尾畫面會完成整個流程。向使用者表示他們已瀏覽所有畫面。

版面配置
圖 9. 升級邀請片尾畫面的線框配置。

裝置動畫一律包含:

  • 背景上的半圓形 (加上動畫形狀)
  • 裝置邊框
  • UI 內容
樣式
  • 選取與 UI 內容和整體外觀相符的背景顏色。
  • 使用半圓形。
動作

按照標準結尾畫面動畫流程操作:

  1. 手機稍微向上移動。
  2. 背景會顯示圓圈。
  3. 手機後方出現各種形狀。
  4. 形狀會像五彩碎紙一樣從背景飛出。
圖 10. Wireframe layout for the Upgrade Invite outro screen animation.
圖 11. 結尾畫面動畫範例。

測試升級邀請流程

  1. 在 Android 裝置上,依序前往「設定」>「Google」>「升級派對偵錯」
  2. 準備相關裝置作業系統的升級邀請觸發條件 (視目前的作業系統版本而定,以及要測試的特定升級邀請流程)。執行以下其中一項:
    1. 按一下「Write Fake upgrade (current version)」(寫入假的升級 (目前版本))。(舉例來說,如果您執行 Android 13 作業系統,系統會觸發 Android 13 測試流程)
    2. 按一下「Write pending upgrade (current version + 1)」(寫入待處理的升級 (目前版本 + 1))。(舉例來說,如果您執行 Android 12 作業系統,系統會觸發 Android 13 測試流程)
    3. 按一下「回報 OS 升級」
  3. 按一下收到的通知,或按一下「開啟升級邀請」

升級邀請的觸發選項

觸發升級邀請流程的方式有 3 種: 1. 自動 2. 廣播 3. 觸發 Play 服務 SDK

自動 - Google 觸發的通知 (僅適用於執行 gOTA 的裝置)

如果 OEM 裝置執行 gOTA,系統會自動整合,因此不需要執行「升級邀請」整合步驟。系統偵測到有待處理的重大 OS 升級時,Google Play 服務會傳送推播通知到裝置,引導使用者完成升級邀請流程。

Android Broadcast - Google 觸發的通知 (建議)

應用程式播送是整合升級邀請流程最簡單且建議使用的方式。

廣播接收器可讓您使用廣播訊息,從應用程式觸發升級邀請流程。Google Play 服務會將推播通知傳送至裝置,引導使用者完成升級邀請流程。

廣播的必要條件

如要讓應用程式做好準備,請完成下列各節的步驟。

請確認應用程式的設定檔為下列值:

  • minSdkVersion 為 14 以上版本
  • compileSdkVersion 為 28 以上版本
  • android.permission.RECOVERY 的 usesPermission

發送廣播

請參閱下方的 OEM 應用程式 (或程式碼) 操作說明,瞭解如何傳送 Android 廣播來觸發推播通知:

  1. 使用動作傳送廣播。

    com.google.android.gms.growth.upgradeparty.upgradeinvite.ACTION_SYSTEM_UPDATE
    
  2. com.google.android.gms 套件新增至廣播。

    com.google.android.gms
    

補充規定

使用者也可以透過升級邀請流程,直接升級作業系統。

如要讓這項功能正常運作,請公開自訂意圖,讓 Google 可從「升級邀請」流程呼叫該意圖,觸發更新下載作業。

廣播功能使用範例

請參閱下列應用程式廣播範例:

Context context = getApplicationContext();
Intent upgradeInviteIntent = new Intent()
  .setAction( "com.google.android.gms.growth.upgradeparty.upgradeinvite.ACTION_SYSTEM_UPDATE")
  .setPackage("com.google.android.gms");
  .putExtra("com.google.android.gms.growth.upgradeparty.upgradeinvite.EXTRA_PENDING_ANDROID_OS_VERSION_NUMBER", 14);

context.sendBroadcast(updateIntent);

EXTRA_PENDING_ANDROID_OS_VERSION_NUMBER 鍵的值是整數,表示待處理的 OS 版本 (在本例中,要安裝的 Android 版本是 14)。這項資訊會用來決定要觸發哪個升級邀請流程。

Play 服務 SDK - 僅觸發流程

第三方 SDK 可讓您從應用程式或自己的 OTA 通知觸發升級邀請流程。使用第三方外部 API 啟動升級邀請流程。我們較不建議使用這個方法。

必要條件

如要讓應用程式做好準備,請完成下列各節的步驟。

請確認應用程式的版本檔案使用下列的值:

  • minSdkVersion 為 14 以上版本
  • compileSdkVersion 為 28 以上版本

設定應用程式

如要設定應用程式,請按照下列步驟操作:

1. Extract the library from the provided .zip file, and place it in your

存放區。 2. 將 Google Growth SDK 的依附元件加進模組的應用程式層級 Gradle 檔案,通常位於 app/build.gradle

   dependencies {
    implementation files('<PATH_TO_BINARY>/play-services-growth-16.1.0-eap04.aar')
   }
  1. 如要提供用戶端的依附元件,請加入下列程式庫:

    com.google.android.gms:play-services-base:18.0.1
    com.google.android.gms:play-services-basement:18.0.0
    com.google.android.gms:play-services-tasks:18.0.1
    

API 初始化

  1. 如要初始化用戶端,請使用 UpgradeParty 類別:

    import com.google.android.gms.growth.UpgradeParty;
    UpgradeParty.getClient(activity);
    
  2. 活動參數應為啟動的 Activity 物件。

API 函式

產生的 UpgradePartyClient 會公開下列功能。

isEligibleForUpgradeInvite

import com.google.android.gms.growth.UpgradeInviteEligibilityParams;

Task<Boolean> isEligibleForUpgradeInvite(UpgradeInviteEligibilityParams params);

/** Contains parameters for the eligibility query. */
class UpgradeInviteEligibilityParams {


/** Integer indicating the pending OS version (in this example, the Android version to be installed is 14). This is used to determine which Upgrade Invite flow will be triggered. */
  int pendingAndroidOsVersionNumber;
}

傳回 Task,以非同步方式驗證使用者是否符合升級邀請資格。產生的布林值會指出使用者是否符合資格。

invokeUpgradeInvite

Task<Void> invokeUpgradeInvite();

叫用升級邀請活動。產生的 _Task _ 物件會指出啟動活動時是否發生錯誤。

錯誤代碼

這兩種 API 方法都可能失敗,並產生 com.google.android.gms.common.api.ApiException 類型的例外狀況。在這種情況下,呼叫端應稍後再重試。預期常見狀態碼)包括:

  • INTERNAL_ERROR - 基礎邏輯流程中的任何錯誤
  • TIMEOUT - if the request couldn't be handled in a timely manner
  • API_NOT_CONNECTED - API 無法使用 (即 UpgradeParty 模組尚未準備就緒)
  • NETWORK_ERROR:網路發生錯誤,因此無法處理要求
  • DEVELOPER_ERROR - 呼叫套件無法存取 UpgradeParty API

SDK 使用範例

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import com.google.android.gms.growth.UpgradeParty;
import com.google.android.gms.growth.UpgradePartyClient;

public class SampleActivity extends Activity {

 @Override
 protected void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
   final UpgradePartyClient client = UpgradeParty.getClient(this);

   // Hide the invocation button initially
   View startUpgradeInviteButton = findViewById(R.id.__some_button__);
   startUpgradeInviteButton.setVisibility(View.GONE);

   // Register an onClick handler to invoke the Upgrade Party Activity
   startUpgradeInviteButton
       .setOnClickListener(
           view -> {
             client
                 .invokeUpgradeInvite()
                 .addOnCompleteListener(
                     task -> {
                       if (!task.isSuccessful()) {
                         // Do something with error, see task.getException()
                       }
                     });
           });
   }

   // Check if eligible for an Upgrade Party
   client
       .isEligibleForUpgradeInvite()
       .addOnCompleteListener(
           task -> {
             if (!task.isSuccessful()) {
               // Do something with error, see task.getException()
             } else {
                  // Show/Hide invocation button, based on the result
                  int visibility = 
                        task.getResult() ? View.VISIBLE : View.GONE;
                  startUpgradeInviteButton.setVisibility(visibility);
             }
           });
   }