概要
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ビジネスプロフィールの営業時間を更新することができます。