ifLinkマイクロサービスでGoogleアカウント選択画面を表示するには


はじめに

ifLinkマイクロサービスを開発している八教と申します。

Google Fit API を用いて歩数取得をifLinkマイクロサービスを作成する際、
歩数を取得にはGoogleFitの情報にアクセスするための許可を得る必要があります。
UI有であれば特に気にせずアカウントID選択画面を表示するコードを組み込めば良いのですが、
UIがなくバックグラウンドでGoogle Fit情報を取得したい場合にどうやって
アカウントID選択画面を表示するかで難儀したので記載します。

検証環境情報

開発環境:AndroidStudio 3.6
検証端末:Oppo A5 2020 Android version 10

ifLinkとは

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アカウントを選択する画面が表示されます。