AndroidアプリからGoogleビジネスプロフィールの営業時間を変更する方法

概要

1. 初回ログイン

  • ユーザーがアプリを初めて使用するとき、Googleアカウントでのサインインを促します。
  • ユーザーがサインインすると、アクセストークンを取得します。

2. アクセストークンの保存

  • 取得したアクセストークンを安全に保存します(例:SharedPreferences)。
  • リフレッシュトークンも同様に保存し、アクセストークンが期限切れになった場合に新しいトークンを取得できるようにします。

3. APIリクエスト

  • 保存したアクセストークンを使用して、Google My Business APIにリクエストを送信し、営業時間を更新します。

4. トークンの更新

  • アクセストークンが期限切れの場合、リフレッシュトークンを使用して新しいアクセストークンを取得します。

構築手順

1. Google Cloudプロジェクトの準備

1. Google Cloudプロジェクトの作成

  • Google Cloud Consoleにアクセスし、プロジェクトを作成します。
  • プロジェクトIDをメモしておきます。

2. Google My Business APIを有効にする

  • Google Cloud Consoleで、APIライブラリにアクセスします。
  • 「Google My Business API」を検索して有効にします。

3. OAuth 2.0 認証情報の設定

  • Google Cloud Consoleの「APIとサービス」 > 「認証情報」から、OAuth 2.0 クライアントIDを作成します。
  • アプリケーションの種類として「Android」を選択し、必要な情報を入力します。
  • クライアントIDとクライアントシークレットをメモしておきます。

2. Androidアプリの準備

1. プロジェクトに必要なライブラリを追加

  • Google Sign-Inのライブラリを追加します。
  • Retrofitを使用してAPIリクエストを行います。
dependencies {
    implementation 'com.google.android.gms:play-services-auth:19.0.0'
    implementation 'com.squareup.retrofit2:retrofit:2.9.0'
    implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
}

2. Google Sign-Inの設定

  • Googleアカウントでのサインインを設定します。
GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
    .requestEmail()
    .requestScopes(new Scope("https://www.googleapis.com/auth/business.manage"))
    .build();

GoogleSignInClient googleSignInClient = GoogleSignIn.getClient(this, gso);

Intent signInIntent = googleSignInClient.getSignInIntent();
startActivityForResult(signInIntent, RC_SIGN_IN);

3. サインイン結果の処理

  • サインイン結果を受け取り、アクセストークンを取得します。
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if (requestCode == RC_SIGN_IN) {
        Task<GoogleSignInAccount> task = GoogleSignIn.getSignedInAccountFromIntent(data);
        handleSignInResult(task);
    }
}

private void handleSignInResult(Task<GoogleSignInAccount> completedTask) {
    try {
        GoogleSignInAccount account = completedTask.getResult(ApiException.class);
        String token = account.getIdToken();
        updateBusinessHours(token);
    } catch (ApiException e) {
        Log.w(TAG, "signInResult:failed code=" + e.getStatusCode());
    }
}

4. 営業時間の更新

  • 取得したアクセストークンを使用して、Google My Business APIにリクエストを送信し、営業時間を更新します。
public interface GoogleMyBusinessService {
    @PATCH("v4/accounts/{accountId}/locations/{locationId}")
    Call<Location> updateBusinessHours(
        @Path("accountId") String accountId,
        @Path("locationId") String locationId,
        @Body Location location,
        @Header("Authorization") String authorization
    );
}

public void updateBusinessHours(String token) {
    Retrofit retrofit = new Retrofit.Builder()
        .baseUrl("https://mybusiness.googleapis.com/")
        .addConverterFactory(GsonConverterFactory.create())
        .build();

    GoogleMyBusinessService service = retrofit.create(GoogleMyBusinessService.class);

    Location location = new Location();
    location.setRegularHours(new RegularHours(/* your hours here */));

    Call<Location> call = service.updateBusinessHours("your-account-id", "your-location-id", location, "Bearer " + token);
    call.enqueue(new Callback<Location>() {
        @Override
        public void onResponse(Call<Location> call, Response<Location> response) {
            if (response.isSuccessful()) {
                // 営業時間の更新に成功
            } else {
                // エラーハンドリング
            }
        }

        @Override
        public void onFailure(Call<Location> call, Throwable t) {
            // エラーハンドリング
        }
    });
}

アクセストークンの保存とリフレッシュトークンの処理

1. アクセストークンの保存

  • 取得したアクセストークンをSharedPreferencesに保存します。
private void saveToken(String token) {
    SharedPreferences preferences = getSharedPreferences("app_prefs", MODE_PRIVATE);
    SharedPreferences.Editor editor = preferences.edit();
    editor.putString("access_token", token);
    editor.apply();
}

private String getToken() {
    SharedPreferences preferences = getSharedPreferences("app_prefs", MODE_PRIVATE);
    return preferences.getString("access_token", null);
}

2. リフレッシュトークンの保存

  • 取得したリフレッシュトークンをSharedPreferencesに保存します。
private void saveRefreshToken(String refreshToken) {
    SharedPreferences preferences = getSharedPreferences("app_prefs", MODE_PRIVATE);
    SharedPreferences.Editor editor = preferences.edit();
    editor.putString("refresh_token", refreshToken);
    editor.apply();
}

private String getRefreshToken() {
    SharedPreferences preferences = getSharedPreferences("app_prefs", MODE_PRIVATE);
    return preferences.getString("refresh_token", null);
}

3. トークンの更新

  • リフレッシュトークンを使用して新しいアクセストークンを取得します。
private void refreshAccessToken(String refreshToken) {
    OkHttpClient client = new OkHttpClient();

    RequestBody requestBody = new FormBody.Builder()
        .add("client_id", CLIENT_ID)
        .add("client_secret", CLIENT_SECRET)
        .add("refresh_token", refreshToken)
        .add("grant_type", "refresh_token")
        .build();

    Request request = new Request.Builder()
        .url("https://oauth2.googleapis.com/token")
        .post(requestBody)
        .build();

    client.newCall(request).enqueue(new Callback() {
        @Override
        public void onFailure(Call call, IOException e) {
            // エラーハンドリング
        }

        @Override
        public void onResponse(Call call, Response response) throws IOException {
            if (response.isSuccessful()) {
                String responseBody = response.body().string();
                JSONObject json = new JSONObject(responseBody);
                String newAccessToken = json.getString("access_token");
                saveToken(newAccessToken);
                // 必要に応じてAPIリクエストを再試行
            } else {
                // エラーハンドリング
            }
        }
    });
}

注意点

  • アクセストークンとリフレッシュトークンの保存場所は、セキュリティに十分配慮してください。SharedPreferencesはシンプルですが、より安全な方法(例えばEncryptedSharedPreferences)を検討することも重要です。
  • ユーザーのプライバシーを尊重し、適切な通知と同意を得るようにしてください。

この方法で、ユーザーが初回にGoogleアカウントでログインした後、アプリを使用してGoogleビジネスプロフィールの営業時間を更新することができます。