Android SDK を使ってみる

コレクションでコンテンツを整理 必要に応じて、コンテンツの保存と分類を行います。

Android SDK を使用する前に、前提条件を満たしていることを確認してください。

Android SDK を使用すると、Google ウォレットにパスを追加できます。アプリに [Google ウォレット] ボタンを追加すると、ユーザーは簡単かつ快適に Google Pay にパスを追加できます。

次の手順に沿って、[Google Wallet] ボタンを Android アプリに追加します。

1. パス オブジェクトを作成する

注: Pass オブジェクトを作成するには、Passs クラスが必要です。まだ作成していない場合は、パスクラスを作成するの手順に従ってください。

対応する LoyaltyObject を定義します。次の必須属性を含めます。

- classId: 前提条件で作成されたパスクラスの ID。- id: オブジェクトの一意の ID。

  • state: このフィールドは、オブジェクトの表示方法を決定するために使用されます。たとえば、アクティブでないオブジェクトは「期限切れのパス」セクションに移動されます。

ポイントカードでこれらの属性がどのように表示されるかについて詳しくは、レイアウト テンプレートをご覧ください。

ポイントカードのサンプルの定義は次のとおりです。

JSON

      
{
  "id": "ISSUER_ID.OBJECT_ID",
  "classId": "CLASS_ID",
  "state": "ACTIVE"
}
      
    

2. オブジェクトを使用して未署名の JWT を作成する

LoyaltyObject を作成したら、payload.LoyaltyObjects スニペット付きの未署名の JWT でラップします。次のスニペットをご覧ください。

JSON

{
  "iss": "OWNER_EMAIL_ADDRESS",
  "aud": "google",
  "typ": "savetowallet",
  "iat": "UNIX_TIME",
  "origins": [],
  "payload": {
      "loyaltyObjects": [ NEW_OBJECT ]
  }
}

3. UI に Google ウォレット ボタンを含める

Google ウォレットには、アプリケーションでの「Google ウォレットに追加」フローをトリガーするための使い慣れたボタンが用意されています。ボタンのベクター アセットについては、ボタン ガイドラインをご覧ください。

Android Studio の File > New > Vector Asset で、ベクター アセットをインポートできます。ウィザードで [ローカル ファイル] を選択し、名前を追加します(例:add_to_google_wallet_button.xml など)に移動して、そのファイルをローカル ドライブで見つけ、インポートします。

これで、インポートしたドローアブルを使用して、ユーザー インターフェースにボタンを追加できるようになりました。

<ImageButton
    android:id="@+id/addToGoogleWalletButton"
    android:layout_width="match_parent"
    android:layout_height="48dp"
    android:minWidth="200dp"
    android:clickable="true"
    android:src="@drawable/add_to_google_wallet_button" />

ボタンの layout_height は 48 dp で、幅は 200 dp 以上である必要があります。

4. 対象デバイスで Google ウォレット API が利用可能かどうかを確認する

新しいオブジェクトを保存する前に、PayClient クラスの getPayApiAvailabilityStatus メソッドを呼び出して、対象デバイスで Google ウォレット API が使用可能であることを確認します。まず、アクティビティを表示するメンバー変数を追加します。このボタンに、アクティビティの作成時にボタンを表示します。

Kotlin

import com.google.android.gms.pay.PayClient

private lateinit var walletClient: PayClient

override fun onCreate(savedInstanceState: Bundle?) {
  super.onCreate(savedInstanceState)

  walletClient = Pay.getClient(this)

  // Additional logic in your onCreate method
}

Java

import com.google.android.gms.pay.PayClient;

private final PayClient walletClient;

@Override
protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);

  walletClient = Pay.getClient(application);

  // Additional logic in your onCreate method
}

次に、クライアントを使用して API が利用可能かどうかを確認します。

Kotlin

import com.google.android.gms.pay.PayApiAvailabilityStatus

private fun fetchCanUseGoogleWalletApi() {
  walletClient
    .getPayApiAvailabilityStatus(PayClient.RequestType.SAVE_PASSES)
    .addOnSuccessListener { status ->
      if (status == PayApiAvailabilityStatus.AVAILABLE) {
        // The API is available, show the button in your UI
      } else {
        // The user or device is not eligible for using the Pay API
      }
    }
    .addOnFailureListener {
      // Hide the button and optionally show an error message
    }
}

Java

import com.google.android.gms.pay.PayApiAvailabilityStatus;

private void fetchCanAddPassesToGoogleWallet() {
  walletClient
    .getPayApiAvailabilityStatus(PayClient.RequestType.SAVE_PASSES)
    .addOnSuccessListener(status -> {
      if (status == PayApiAvailabilityStatus.AVAILABLE) {
        // The API is available, show the button in your UI
      } else {
        // The user or device is not eligible for using the Pay API
      };
    })
    .addOnFailureListener(exception -> {
      // Google Play Services is too old, or API availability not verified
      // Hide the button and optionally show an error message
    });
}

API の可用性を判断する必要がある場合は、アプリケーションで上記のメソッドを呼び出します。

5. オブジェクトを Google ウォレットに追加する

LoyaltyObject を追加するには、ステップ 2 の署名なし JWT を savePasses メソッドに渡します。Google ウォレット ボタンをクリックすると、追加オペレーションを開始できます。

Kotlin

import android.os.Bundle
import android.view.View
import com.google.android.gms.samples.wallet.databinding.ActivityCheckoutBinding

private val addToGoogleWalletRequestCode = 1000

private lateinit var layout: ActivityCheckoutBinding
private lateinit var addToGoogleWalletButton: View

override fun onCreate(savedInstanceState: Bundle?) {
  super.onCreate(savedInstanceState)

  // Use view binding to access the UI elements
  layout = ActivityCheckoutBinding.inflate(layoutInflater)
  setContentView(layout.root)

  addToGoogleWalletButton = layout.addToGoogleWalletButton
  addToGoogleWalletButton.setOnClickListener {
    walletClient.savePasses(newObjectJson, this, addToGoogleWalletRequestCode)
  }

  // Additional logic in your onCreate method
}

Java

import android.os.Bundle;
import android.view.View;
import com.google.android.gms.samples.wallet.databinding.ActivityCheckoutBinding;

private static final int ADD_TO_GOOGLE_WALLET_REQUEST_CODE = 999;

private ActivityCheckoutBinding layout:
private View addToGoogleWalletButton;

@Override
protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);

  // Use view binding to access the UI elements
  layout = ActivityCheckoutBinding.inflate(getLayoutInflater());
  setContentView(layout.getRoot());

  addToGoogleWalletButton = layout.addToGoogleWalletButton;
  addToGoogleWalletButton.setOnClickListener(v -> {
    walletClient.savePasses(newObjectJson, this, ADD_TO_GOOGLE_WALLET_REQUEST_CODE);
  });

  // Additional logic in your onCreate method
}

savePasses メソッドは保存フローをトリガーし、保存フローの完了後に onActivityResult メソッドを呼び出します。onActivityResult の実装は次のようになります。

Kotlin

import android.content.Intent

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
  super.onActivityResult(requestCode, resultCode, data)

  if (requestCode == addToGoogleWalletRequestCode) {
    when (resultCode) {
      RESULT_OK -> {
        // Pass saved successfully
      }

      RESULT_CANCELED -> {
        // Save operation canceled
      }

      PayClient.SavePassesResult.SAVE_ERROR -> data?.let { intentData ->
        val errorMessage = intentData.getStringExtra(PayClient.EXTRA_API_ERROR_MESSAGE)
        // Handle error
      }

      else -> {
          // Handle unexpected (non-API) exception
      }
    }
  }
}

Java

import android.content.Intent;

@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
  super.onActivityResult(requestCode, resultCode, data);

  if (requestCode == ADD_TO_GOOGLE_WALLET_REQUEST_CODE) {
    switch (resultCode) {
      case RESULT_OK: {
        // Pass saved successfully
        break;
      }

      case RESULT_CANCELED: {
        // Save operation canceled
        break;
      }

      case PayClient.SavePassesResult.SAVE_ERROR: {
        if (data != null) {
          String apiErrorMessage = data.getStringExtra(PayClient.EXTRA_API_ERROR_MESSAGE);
          // Handle error
        }
        break;
      }

      default: {
        // Handle unexpected (non-API) exception
      }
    }
  }
}

パスが正常に追加されると、resultCode には Activity.RESULT_OK の値が含まれます。

次のステップ

  • ポイントカードのユースケースを評価し、ビジネスニーズに適したポイントカードを実装する
  • ブランド ガイドラインに沿って、ポイントカードの外観をカスタマイズする
  • Google Pay and Wallet Console の「Google Wallet API」での最終審査のために UX フローを送信する
  • ご不明な点がありましたら、よくある質問をご確認ください。