GoogleApiClient を使用して Google API にアクセスする(非推奨)

GoogleApiClient(「Google API クライアント」)を使用できます。 Google Play 開発者サービス ライブラリで提供されている Google API にアクセスするためのオブジェクト。 (Google ログイン、ゲーム、ドライブなど)。Google API クライアントは、 Google Play 開発者サービスに共通のエントリ ポイントで、 ユーザーのデバイスと各 Google サービスの間の接続の責任を担います。

ただし、新しい GoogleApi インターフェースとその実装の方が簡単です。 Play 開発者サービスの API へのアクセスには、この方法を使用することをおすすめします。 Google API へのアクセスをご覧ください。

このガイドでは、以下の方法について説明します。

  • Google Play 開発者サービスへの接続を自動的に管理します。
  • Google Play 開発者サービスのいずれかに対して、同期および非同期の API 呼び出しを実行します。
  • 次のようなまれな状況で、Google Play 開発者サービスへの接続を手動で管理します。 できます。詳細については、手動で管理される接続をご覧ください。
で確認できます。 <ph type="x-smartling-placeholder">
</ph>
図 1: Google API クライアントがどのようにして 次のような利用可能な Google Play 開発者サービスに接続して呼び出すためのインターフェース Google Play Games と Google ドライブ。

まず、Google Play 開発者サービス ライブラリ(リビジョン 15 以降)をインストールする必要があります ダウンロードしてくださいまだ実施していない場合は、 Google Play 開発者サービス SDK をセットアップします。

自動管理接続を開始する

プロジェクトが Google Play 開発者サービス ライブラリにリンクされたら、 GoogleApiClient: GoogleApiClient.Builder アクティビティの API を onCreate() メソッドを呼び出します。「 GoogleApiClient.Builder クラスを使用すると、使用する Google API と API を指定できるメソッドを OAuth 2.0 スコープ。次のコードサンプルは、 Google ドライブ サービスに接続する GoogleApiClient インスタンス:

GoogleApiClient mGoogleApiClient = new GoogleApiClient.Builder(this)
    .enableAutoManage(this /* FragmentActivity */,
                      this /* OnConnectionFailedListener */)
    .addApi(Drive.API)
    .addScope(Drive.SCOPE_FILE)
    .build();

複数の API と複数のスコープを同じプロジェクトに追加することも GoogleApiClient 追加の呼び出しを addApi() に追加します。 および addScope()

重要: Wearable API を他の API と一緒に GoogleApiClient をサポートしているデバイスでは、クライアント接続エラーが発生することがあります。 Wear OS アプリがインストールされていません。宛先 接続エラーを回避するため、addApiIfAvailable() メソッドを呼び出して、 Wearable API を使用すると、クライアントで不足しているリソースを適切に処理できます。 API詳しくは、Wearable API にアクセスするをご覧ください。

自動的に管理される接続を開始するには、 OnConnectionFailedListener の実装 インターフェースを介して解決できない接続エラーを受信します。自動管理されたユーザーが GoogleApiClient インスタンスが Google API への接続を試みると、このインスタンスは自動的に 解決可能な接続エラー( Google Play 開発者サービスを更新する必要があります)。想定外のエラーが発生した場合は、 電話があります。 onConnectionFailed()

アプリがいつ通知を受けたかをアプリが認識する必要がある場合は、ConnectionCallbacks インターフェースの実装(省略可)を指定することもできます。 確立または一時停止されます。たとえば Google API にデータを書き込むためにアプリが呼び出した場合、これらの呼び出しは onConnected() メソッドが呼び出された後でのみ動作します。

コールバック インターフェースを実装し、 Google API クライアントに送信します。

import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.common.api.GoogleApiClient.OnConnectionFailedListener;
import gms.drive.*;
import android.support.v4.app.FragmentActivity;

public class MyActivity extends FragmentActivity
        implements OnConnectionFailedListener {
    private GoogleApiClient mGoogleApiClient;

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

        // Create a GoogleApiClient instance
        mGoogleApiClient = new GoogleApiClient.Builder(this)
                .enableAutoManage(this /* FragmentActivity */,
                                  this /* OnConnectionFailedListener */)
                .addApi(Drive.API)
                .addScope(Drive.SCOPE_FILE)
                .build();

        // ...
    }

    @Override
    public void onConnectionFailed(ConnectionResult result) {
        // An unresolvable error has occurred and a connection to Google APIs
        // could not be established. Display an error message, or handle
        // the failure silently

        // ...
    }
}

アクティビティの後に GoogleApiClient インスタンスが自動的に接続されます onStart() に電話をかけ、onStop() に発信した後で接続を解除する。 アプリはすぐに GoogleApiClient の作成後に、Google API に読み取りリクエストを 接続が完了するのを待っています

Google サービスとの通信

接続後、クライアントはサービス固有の API を使用して、 スコープによって指定されます。アプリが認可されている GoogleApiClient インスタンス。

注: 特定の Google サービスを呼び出す前に、 Google Play Console を開きます。手順については、 使用している API のスタートガイド Google ドライブ Google ログイン

GoogleApiClient を使用して読み取りまたは書き込みリクエストを実行すると、API クライアントはリクエストを表す PendingResult オブジェクトを返します。 この処理は、アプリが呼び出している Google サービスにリクエストが配信される直前に行われます。

たとえば、Google ドライブからファイルを読み取るリクエストは次のようになります。 PendingResult オブジェクト:

Query query = new Query.Builder()
        .addFilter(Filters.eq(SearchableField.TITLE, filename));
PendingResult<DriveApi.MetadataBufferResult> result = Drive.DriveApi.query(mGoogleApiClient, query);

アプリに PendingResult オブジェクトを作成した後、 アプリケーションは、リクエストを非同期呼び出しとして処理するか、同期呼び出しとして処理するかを指定できます。

ヒント: Google Play 開発者サービスに接続していないときでも、アプリは読み取りリクエストをキューに追加できます。対象 たとえば、GoogleApiClient インスタンスがまだ接続されているかどうかにかかわらず、アプリでメソッドを呼び出して Google ドライブからファイルを読み取ることができます。接続が確立されると、キューに登録された読み取りリクエストが実行されます。書き込みリクエストでエラーが発生すると、 Google API クライアントが接続されていない間は、Google Play 開発者サービスがメソッドを書き込む必要があります。

非同期呼び出しの使用

リクエストを非同期にするには、次のコマンドを実行します。 setResultCallback() PendingResultに 実装の ResultCallback インターフェースを使用します。対象 非同期で実行されるリクエストの例を次に示します。

private void loadFile(String filename) {
    // Create a query for a specific filename in Drive.
    Query query = new Query.Builder()
            .addFilter(Filters.eq(SearchableField.TITLE, filename))
            .build();
    // Invoke the query asynchronously with a callback method
    Drive.DriveApi.query(mGoogleApiClient, query)
            .setResultCallback(new ResultCallback<DriveApi.MetadataBufferResult>() {
        @Override
        public void onResult(DriveApi.MetadataBufferResult result) {
            // Success! Handle the query result.
            // ...
        }
    });
}

アプリが Result オブジェクトを onResult() コールバック、 使用している API に指定されている適切なサブクラスのインスタンスとして提供されます。 DriveApi.MetadataBufferResult

同期呼び出しの使用

厳密に定義された順序でコードを実行したい場合は、 必要な場合は、次を呼び出してリクエストを同期させることができます。 await(): PendingResult。スレッドがブロックされ、 Result オブジェクトが返されます。 表示されます。このオブジェクトは、 たとえば、使用している API DriveApi.MetadataBufferResult

await() を呼び出すため 結果が届くまでスレッドをブロックします。アプリは、 UI スレッド。アプリは、AsyncTask オブジェクトを使用して新しいスレッドを作成し、そのスレッドを使用して同期リクエストを行うことができます。

次の例は、同期呼び出しとして Google ドライブにファイル リクエストを行う方法を示しています。

private void loadFile(String filename) {
    new GetFileTask().execute(filename);
}

private class GetFileTask extends AsyncTask {
    protected void doInBackground(String filename) {
        Query query = new Query.Builder()
                .addFilter(Filters.eq(SearchableField.TITLE, filename))
                .build();
        // Invoke the query synchronously
        DriveApi.MetadataBufferResult result =
                Drive.DriveApi.query(mGoogleApiClient, query).await();

        // Continue doing other stuff synchronously
        // ...
    }
}

Wearable API にアクセスする

Wearable API は、ハンドヘルド デバイスとウェアラブル デバイスで動作するアプリ用の通信チャネルを提供します。 この API は、システムが送信、同期できる一連のデータ オブジェクトで構成されます。 重要なイベントについてアプリに通知するリスナーが、データレイヤーを使用して作成されます。「 Wearable API は、Android 4.3(API レベル 18)以降を搭載しているデバイスで利用できます。 ウェアラブル デバイスが接続され、Wear OS コンパニオン アプリが接続されている がインストールされていることを確認します。

Wearable API をスタンドアロンで使用する

アプリで Wearable API のみを使用し、他の Google API は使用していない場合は、次の方法でこの API を追加できます。 addApi() メソッドを呼び出す。次の例は、 Wearable APIGoogleApiClient インスタンスに追加します。

GoogleApiClient mGoogleApiClient = new GoogleApiClient.Builder(this)
    .enableAutoManage(this /* FragmentActivity */,
                      this /* OnConnectionFailedListener */)
    .addApi(Wearable.API)
    .build();

Wearable API を使用できない場合は、以下の条件を満たす接続をリクエストします。 Wearable API を含めると失敗します。 API_UNAVAILABLE 表示されます。

次の例は、Wearable API が使用可能かどうかを判断する方法を示しています。

// Connection failed listener method for a client that only
// requests access to the Wearable API
@Override
public void onConnectionFailed(ConnectionResult result) {
    if (result.getErrorCode() == ConnectionResult.API_UNAVAILABLE) {
        // The Wearable API is unavailable
    }
    // ...
}

Wearable API と他の Google API を併用する

他の Google API に加えて Wearable API を使用するアプリの場合は、 addApiIfAvailable() メソッドを呼び出し、Wearable API を渡して利用可能かどうかを確認します。このチェックを使用すると、API が利用できないケースをアプリで適切に処理できます。

次の例は、Wearable APIDrive API:

// Create a GoogleApiClient instance
mGoogleApiClient = new GoogleApiClient.Builder(this)
        .enableAutoManage(this /* FragmentActivity */,
                          this /* OnConnectionFailedListener */)
        .addApi(Drive.API)
        .addApiIfAvailable(Wearable.API)
        .addScope(Drive.SCOPE_FILE)
        .build();

上記の例では、GoogleApiClient は正常に接続できる Wearable API を利用できない場合は接続せずに Google ドライブ。変更後 GoogleApiClient を接続します たとえば、API を呼び出す前に、Wearable API を使用できることを確認します。

boolean wearAvailable = mGoogleApiClient.hasConnectedApi(Wearable.API);

API 接続エラーの無視

addApi() を呼び出したときに、GoogleApiClient が その API に正常に接続できないと、そのクライアントの接続オペレーション全体が失敗し、 onConnectionFailed() コールバックをトリガーします。

次のコマンドを使用すると、無視する API 接続エラーを登録できます。 addApiIfAvailable()。API が Cloud Logging によって 修復不可能なエラーのため addApiIfAvailable() が接続できない (Wear の API_UNAVAILABLE など) GoogleApiClient からその API が削除され、クライアントが 他の API に接続できます。ただし、API 接続が回復可能なエラー( OAuth 同意解決インテントなど)、クライアント接続オペレーションは失敗します。日時 自動的に管理される接続を使用している場合、GoogleApiClient は エラーを解決します手動で管理する接続を使用する場合 解決インテントを含む ConnectionResult が、 onConnectionFailed() コールバックに配信されます。API 接続エラーが無視されるのは、エラーに対する解決策がない場合のみです API が追加されました addApiIfAvailable() に置き換えます。 手動接続エラーを実装する方法については、 接続エラーを処理するをご覧ください。

API によって追加された API は、 addApiIfAvailable() は、接続されている GoogleApiClient インスタンスでは、チェックを追加して、これらの API の呼び出しを保護する必要があります。 hasConnectedApi() を使用します。エラーの原因を クライアントに対する接続操作全体が成功したときに、特定の API が接続に失敗した場合は、次を呼び出します。 getConnectionResult(): ConnectionResult オブジェクト。API 呼び出しが行われていないときにクライアントが API を呼び出すと、 場合、呼び出しは失敗します。 API_NOT_AVAILABLE ステータス コード。

addApiIfAvailable() を使用して追加する API に、 追加する場合は、それらのスコープをパラメータとして addApiIfAvailable() メソッド呼び出し( addScope() メソッドを使用します。この方法で追加したスコープは、API リクエストによってリクエストが OAuth の同意を取得する前に接続が失敗するのに対し、サービス アカウントを addScope() は常にリクエストされます。

手動で管理される接続

このガイドでは、 enableAutoManage メソッドで 接続を自動的に管理します。ほぼ この方法が、ご利用のクラウド プロバイダから Google API に Android アプリ。ただし、場合によっては、kubectl の 手動で管理する接続をアプリで使用する必要があります。

  • アクティビティの外部で Google API にアクセスするため、または API の制御を保持するため 接続
  • 接続エラーの処理と解決をカスタマイズするため

このセクションでは、これらを含む高度なユースケースの例を示します。

手動で管理する接続を開始する

GoogleApiClient への手動で管理された接続を開始するには、次のことを行う必要があります。 コールバック インターフェースの実装を指定する ConnectionCallbacks および OnConnectionFailedListener。 これらのインターフェースは、非同期リクエストへのレスポンスとして connect() メソッドが Google Play 開発者サービスへの接続が成功、失敗、または停止されました。

    mGoogleApiClient = new GoogleApiClient.Builder(this)
            .addApi(Drive.API)
            .addScope(Drive.SCOPE_FILE)
            .addConnectionCallbacks(this)
            .addOnConnectionFailedListener(this)
            .build()

接続を手動で管理する場合は、Terraform で connect() および disconnect() メソッドをアプリのライフサイクルの適切な時点で使用する必要があります。アクティビティ内 ベスト プラクティスは、アクティビティの onStart()connect() を呼び出すことです。 メソッドと disconnect() をアクティビティの onStop() メソッド内で呼び出します。 connect()disconnect() メソッド 自動管理接続を使用すると、自動的に呼び出されます。

GoogleApiClient を使用して、必要な API に接続している場合 Google ドライブや Google Play Games などの認証では、 最初の接続試行が失敗し、アプリが通話を受信します onConnectionFailed() まで SIGN_IN_REQUIRED を使用 エラーが発生します。

接続エラーを処理する

アプリが onConnectionFailed() への呼び出しを受信したとき コールバックの場合は、hasResolution() を呼び出します。 指定: ConnectionResult 渡されます。true が返された場合、アプリは startResolutionForResult() を呼び出し中 ConnectionResult オブジェクト。 startResolutionForResult() メソッド この場合、startActivityForResult() と同じように動作します。 エラーの解決に役立つコンテキストに適したアクティビティ(たとえば、ユーザーがエラーの解決に アカウントを選択)。

hasResolution() の場合 false が返された場合、アプリは GoogleApiAvailability.getErrorDialog()、 このメソッドにエラーコードを渡します。このメソッドは、 Dialog(Google Play から提供) サービスを提供します。ダイアログでは、単にメッセージとして、 または、エラーを解決できるアクティビティを起動するためのアクションが提示されることもあります。 (ユーザーが新しいバージョンの Google Play 開発者サービスをインストールする必要がある場合など)。

たとえば、 onConnectionFailed() コールバック メソッドは次のようになります。

public class MyActivity extends Activity
        implements ConnectionCallbacks, OnConnectionFailedListener {

    // Request code to use when launching the resolution activity
    private static final int REQUEST_RESOLVE_ERROR = 1001;
    // Unique tag for the error dialog fragment
    private static final String DIALOG_ERROR = "dialog_error";
    // Bool to track whether the app is already resolving an error
    private boolean mResolvingError = false;

    // ...

    @Override
    public void onConnectionFailed(ConnectionResult result) {
        if (mResolvingError) {
            // Already attempting to resolve an error.
            return;
        } else if (result.hasResolution()) {
            try {
                mResolvingError = true;
                result.startResolutionForResult(this, REQUEST_RESOLVE_ERROR);
            } catch (SendIntentException e) {
                // There was an error with the resolution intent. Try again.
                mGoogleApiClient.connect();
            }
        } else {
            // Show dialog using GoogleApiAvailability.getErrorDialog()
            showErrorDialog(result.getErrorCode());
            mResolvingError = true;
        }
    }

    // The rest of this code is all about building the error dialog

    /* Creates a dialog for an error message */
    private void showErrorDialog(int errorCode) {
        // Create a fragment for the error dialog
        ErrorDialogFragment dialogFragment = new ErrorDialogFragment();
        // Pass the error that should be displayed
        Bundle args = new Bundle();
        args.putInt(DIALOG_ERROR, errorCode);
        dialogFragment.setArguments(args);
        dialogFragment.show(getSupportFragmentManager(), "errordialog");
    }

    /* Called from ErrorDialogFragment when the dialog is dismissed. */
    public void onDialogDismissed() {
        mResolvingError = false;
    }

    /* A fragment to display an error dialog */
    public static class ErrorDialogFragment extends DialogFragment {
        public ErrorDialogFragment() { }

        @Override
        public Dialog onCreateDialog(Bundle savedInstanceState) {
            // Get the error code and retrieve the appropriate dialog
            int errorCode = this.getArguments().getInt(DIALOG_ERROR);
            return GoogleApiAvailability.getInstance().getErrorDialog(
                    this.getActivity(), errorCode, REQUEST_RESOLVE_ERROR);
        }

        @Override
        public void onDismiss(DialogInterface dialog) {
            ((MyActivity) getActivity()).onDialogDismissed();
        }
    }
}

表示されるダイアログをユーザーが startResolutionForResult() GoogleApiAvailability.getErrorDialog() から提供されたメッセージを閉じるか、 アクティビティは onActivityResult() コールバック関数が RESULT_OK 結果コード。 これにより、アプリは もう一度 connect()。 例:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == REQUEST_RESOLVE_ERROR) {
        mResolvingError = false;
        if (resultCode == RESULT_OK) {
            // Make sure the app is not already connected or attempting to connect
            if (!mGoogleApiClient.isConnecting() &&
                    !mGoogleApiClient.isConnected()) {
                mGoogleApiClient.connect();
            }
        }
    }
}

上記のコードでは、ブール値 mResolvingError に気づいたでしょう。これにより、 ユーザーがエラーを解決している間にアプリの状態が続き、同じ事象の解決が繰り返し試行されないようにする エラーが発生します。たとえば、アカウント選択ツールのダイアログが表示され、ユーザーが SIGN_IN_REQUIRED ユーザーが画面を回転させる可能性があります。これによりアクティビティが再作成され onStart() メソッド 再度呼び出されると、次が呼び出されます。 もう一度 connect() してください。この 再度呼び出しが行われ、 startResolutionForResult() これにより、既存のアカウントの前に、別のアカウント選択ダイアログが作成されます。

このブール値は、アクティビティ インスタンス間で持続する場合にのみ、本来の用途に使用されます。 次のセクションでは、他のユーザー アクションにかかわらずアプリのエラー処理状態を維持する方法について説明します。 デバイスで発生するイベントを追跡できます

エラーを解決しながら状態を維持する

Deployment に含まれるコードの実行を onConnectionFailed() 以前にエラーの解決を試みている間、 アプリがすでにエラーを解決しようとしているかどうかを追跡します。

上記のコードサンプルに示すように、アプリで呼び出すたびにブール値を true に設定する必要があります。 startResolutionForResult() からダイアログを表示するか、 GoogleApiAvailability.getErrorDialog()。 その後、アプリが RESULT_OK: onActivityResult() ブール値を false に設定します。

アクティビティの再起動以降(ユーザーが画面を回転させたときなど)にわたってブール値を追跡するには、 次のコマンドを使用して、アクティビティの保存済みインスタンス データにブール値を保存します。 onSaveInstanceState():

private static final String STATE_RESOLVING_ERROR = "resolving_error";

@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putBoolean(STATE_RESOLVING_ERROR, mResolvingError);
}

復元中に保存された状態を復元します。 onCreate():

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

    // ...
    mResolvingError = savedInstanceState != null
            && savedInstanceState.getBoolean(STATE_RESOLVING_ERROR, false);
}

これで、アプリを安全に実行し、Google Play 開発者サービスに手動で接続する準備が整いました。