#はじめに
ifLinkマイクロサービスを開発している八教と申します。
Google Fit API を用いて歩数取得をifLinkマイクロサービスを作成する際、
歩数を取得にはGoogleFitの情報にアクセスするための許可を得る必要があります。
UI有であれば特に気にせずアカウントID選択画面を表示するコードを組み込めば良いのですが、
UIがなくバックグラウンドでGoogle Fit情報を取得したい場合にどうやって
アカウントID選択画面を表示するかで難儀したので記載します。
#検証環境情報
開発環境:AndroidStudio 3.6
検証端末:Oppo A5 2020 Android version 10
#ifLinkとは
https://iflink.jp/
#GoogleFitのアカウント選択画面
GoogleFit情報にアクセスしたいアカウント選択の画面表示のソースコードは以下の通り
https://developers.google.com/fit/android/api-client-example
FitnessOptions fitnessOptions =
FitnessOptions.builder()
.addDataType(DataType.TYPE_STEP_COUNT_CUMULATIVE)
.addDataType(DataType.TYPE_STEP_COUNT_DELTA)
.addDataType(DataType.AGGREGATE_STEP_COUNT_DELTA)
.build();
GoogleSignIn.requestPermissions(
this,
REQUEST_OAUTH_REQUEST_CODE,
GoogleSignIn.getLastSignedInAccount(getActivity()),
fitnessOptions);
#ifLinkマイクロサービスへの実装
ifLinkマイクロサービスではIMS設定メニューでLOG出力可否を選択する画面があります。
今回はGoogleFIT情報を取得する際に必要なアカウントID選択をIMS設定メニューで設定できるようにし、
マイクロサービスをインストール後にGoogleFIT情報取得に必要なアカウントID選択を行い認証してからマイクロサービスを利用していただく流れとします。
BaseSettingsActivity クラスを継承したクラスでGoogleアカウントID選択をされた場合にGoogleアカウントID選択画面を表示するよう実装します。
Androidでは設定画面を作る仕組みがJetpackで提供されており、PreferenceFragmentCompatがその役割を提供しています。
@Override
protected PreferenceFragmentCompat getFragment() {
return new Fragment();
}
IMS設定メニューでGoogleFit情報取得のアカウントID選択をタップされた際にアカウントID選択画面を表示します。
public static class Fragment extends BasePreferenceFragment implements SharedPreferences.OnSharedPreferenceChangeListener {
@Override
public void onDisplayPreferenceDialog(Preference preference) {
if (preference.getKey().equals("googleaccountkey") ) {
Log.d(TAG, "onDisplayPreferenceDialog2");
FitnessOptions fitnessOptions =
FitnessOptions.builder()
.addDataType(DataType.TYPE_STEP_COUNT_CUMULATIVE)
.addDataType(DataType.TYPE_STEP_COUNT_DELTA)
.addDataType(DataType.AGGREGATE_STEP_COUNT_DELTA)
.build();
GoogleSignIn.requestPermissions(
this,
REQUEST_OAUTH_REQUEST_CODE,
GoogleSignIn.getLastSignedInAccount(getActivity()),
fitnessOptions);
}else{
super.onDisplayPreferenceDialog(preference);
Log.d(TAG, "onDisplayPreferenceDialog4");
}
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
Log.i(TAG, "requestCode=" + requestCode);
Log.i(TAG, "data=" + data);
if (resultCode == Activity.RESULT_OK) {
if (requestCode == REQUEST_OAUTH_REQUEST_CODE) {
Toast.makeText(getActivity().getApplicationContext(), "googleアカウントが有効です", Toast.LENGTH_LONG).show();
Log.i(TAG, "googleアカウントが有効です");
}
}
else{
Toast.makeText(getActivity().getApplicationContext(), "googleアカウントが無効です", Toast.LENGTH_LONG).show();
Log.i(TAG, "resultCode == " + resultCode);
Log.i(TAG, "googleアカウントが無効です");
}
}
}
IMS設定メニューでGoogleFitの情報を取得したいアカウント選択画面を表示します。
<MultiSelectListPreference
android:entries="@array/pref_log_level_list_title"
android:entryValues="@array/pref_log_level_list_values"
android:key="@string/pref_log_level_key"
android:summary="@string/pref_log_level_summary"
android:title="@string/pref_log_level" />
<EditTextPreference
android:defaultValue="@string/pref_ggfitimsdevice_settings_parameter_default1"
android:key="googleaccountkey"
android:selectAllOnFocus="true"
android:singleLine="true"
android:summary="@string/pref_ggfitimsdevice_settings_parameter_summary1"
android:title="@string/pref_ggfitimsdevice_settings_parameter_name1" />
<EditTextPreference
android:defaultValue="@string/pref_ggfitimsdevice_settings_parameter_default2"
android:key="@string/pref_ggfitimsdevice_settings_parameter_key2"
android:selectAllOnFocus="true"
android:singleLine="true"
android:summary="@string/pref_ggfitimsdevice_settings_parameter_summary2"
android:title="@string/pref_ggfitimsdevice_settings_parameter_name2" />
ifLinkエンジンの環境設定からGoogleアカウントを選択する画面が表示されます。