GoogleApiClient
('Google API 클라이언트')를 사용할 수 있습니다.
Google Play 서비스 라이브러리에서 제공되는 Google API에 액세스하기 위한 객체
(예: Google 로그인, 게임, Drive) Google API 클라이언트는
Google Play 서비스의 공통 진입점이며 네트워크를 관리합니다.
사용자 기기와 각 Google 서비스 간의 연결입니다.
그러나 최신 GoogleApi
인터페이스와 구현은
Play 서비스 API에 액세스하는 데 선호되는 방법입니다.
Google API 액세스를 참조하세요.
이 가이드에서는 다음을 수행하는 방법을 보여줍니다.
- Google Play 서비스 연결을 자동으로 관리합니다.
- Google Play 서비스에 동기 및 비동기 API 호출을 수행합니다.
- 드물지만 Google Play 서비스 연결을 수동으로 관리하세요. 있습니다. 자세한 내용은 수동 관리 연결을 참조하세요.
시작하려면 먼저 Google Play 서비스 라이브러리 (버전 15 이상)를 설치해야 합니다. 생성합니다. 아직 하지 않았다면 Google Play 서비스 SDK 설정
자동 관리 연결 시작
프로젝트가 Google Play 서비스 라이브러리에 연결되면
GoogleApiClient
:
GoogleApiClient.Builder
액티비티의
onCreate()
메서드를 사용하여 축소하도록 요청합니다. 이
GoogleApiClient.Builder
드림
클래스는 사용하려는 Google API와 원하는
OAuth 2.0 범위입니다. 여기 표시된 코드는
Google Drive 서비스에 연결되는 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에 연결을 시도하면 자동으로
해결 가능한 연결 실패를 해결하기 위해 UI를 표시합니다 (예:
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 서비스를 호출하기 전에 먼저 앱을 설치해야 합니다. 자세한 내용은 사용 중인 API에 대한 시작 가이드(예: Google Drive 또는 Google 로그인.
GoogleApiClient
를 사용하여 읽기 또는 쓰기 요청을 수행하면 API 클라이언트에서 요청을 나타내는 PendingResult
객체를 반환합니다.
이는 앱이 호출하는 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 Drive에서 파일을 읽을 수 있습니다. 연결이 설정되면 큐에 추가된 읽기 요청이 실행됩니다. 앱이 다음을 호출하면 쓰기 요청으로 오류가 발생합니다.
Google Play 서비스는 Google API 클라이언트가 연결되어 있지 않은 동안 메서드를 작성합니다.
비동기 호출 사용
요청을 비동기식으로 만들려면 다음을 호출합니다.
setResultCallback()
드림
PendingResult
에서
Google Cloud 콘솔의
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 Drive에 파일을 요청하는 방법을 보여줍니다.
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는 사용하지 않는 경우
addApi()
메서드를 호출합니다. 다음 예는
Wearable API를 GoogleApiClient
인스턴스에 추가합니다.
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 } // ... }
다른 Google API와 함께 Wearable API 사용
앱에서 다른 Google API 외에 Wearable API도 사용하는 경우
addApiIfAvailable()
메서드를 호출하고 Wearable API를 전달하여 사용할 수 있는지 확인합니다. 이 확인 기능을 사용하면 앱에서 API를 사용할 수 없는 사례를 적절하게 처리하도록 할 수 있습니다.
다음 예는 Wearable API에 액세스하는 방법을 Drive 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 Drive에 연결합니다. 후(After)
GoogleApiClient
에 연결하는 경우
API를 호출하기 전에 Wearable API를 사용할 수 있는지 확인하세요.
boolean wearAvailable = mGoogleApiClient.hasConnectedApi(Wearable.API);
API 연결 실패 무시
addApi()
를 호출하는데 GoogleApiClient
에서 다음과 같은 작업을 할 수 없는 경우
해당 API에 성공적으로 연결되면 해당 클라이언트의 전체 연결 작업이 실패하고
onConnectionFailed()
콜백을 트리거합니다.
API 연결 실패가 무시되도록 등록할 수 있습니다.
addApiIfAvailable()
만약
복구할 수 없는 오류로 인해 addApiIfAvailable()
연결 실패
(예: Wear의 경우 API_UNAVAILABLE
)
해당 API가 GoogleApiClient
에서 삭제되고 클라이언트는
다른 API에 연결할 수 있습니다 하지만 복구 가능한 오류 (예:
OAuth 동의 확인 인텐트) 클라이언트 연결 작업이 실패합니다. 날짜
자동 관리 연결을 사용하여 GoogleApiClient
에서 연결을 시도합니다.
가능한 경우 이러한 오류를 해결할 수 있습니다. 수동 관리 연결을 사용하는 경우
확인 인텐트가 포함된 ConnectionResult
는 다음과 같습니다.
onConnectionFailed()
콜백에 전달됩니다. API
연결 실패는 실패에 대한 해결 방법이 없는 경우에만 무시됩니다.
이 API는
addApiIfAvailable()
와 함께 사용할 수 있습니다.
수동 연결 실패를 구현하는 방법 알아보기
연결 실패 처리를 참고하세요.
API는
addApiIfAvailable()
이(가) 연결된
GoogleApiClient
인스턴스의 경우, 검사를 추가하여 이러한 API에 대한 호출을 보호해야 합니다.
hasConnectedApi()
사용 그 이유를 알아보기 위해
전체 연결 작업이 성공했을 때 특정 API의 연결에 실패한 경우
getConnectionResult()
를 호출하여
ConnectionResult
객체. 클라이언트가
연결되면 호출이 실패하고
API_NOT_AVAILABLE
드림
확인할 수 있습니다
addApiIfAvailable()
를 통해 추가하는 API에 하나 이상의
더 많은 범위를 지정하려면 해당 범위를
addApiIfAvailable()
메서드를 호출하는 방법은 다음과 같습니다.
addScope()
메서드를 사용하여 지도 가장자리에
패딩을 추가할 수 있습니다. 이 접근 방식을 사용하여 추가한 범위는
연결이 실패하는 반면
addScope()
는 항상 요청됩니다.
수동 관리형 연결
이 가이드의 대부분에서는
enableAutoManage
메서드를 호출하여
자동으로 해결된 오류가 있는 자동 관리형 연결을 사용할 수 있습니다. 거의
모든 경우에 Google API에 연결하는 가장 쉽고 효과적인
Android 앱 하지만 일부 상황에서는
Google API에 대한 수동 관리 연결을 제공합니다.
- 활동 외부에서 Google API에 액세스하거나 API에 대한 제어 권한을 유지하기 위해 연결
- 연결 오류 처리 및 해결 방법 맞춤설정
이 섹션에서는 이러한 사용 사례 및 기타 고급 사용 사례의 예를 제공합니다.
수동 관리 연결 시작
GoogleApiClient
에 대한 수동 관리 연결을 시작하려면 다음을 수행해야 합니다.
콜백 인터페이스의 구현을 지정합니다.
ConnectionCallbacks
및 OnConnectionFailedListener
.
이러한 인터페이스는 비동기식
connect()
메서드를 호출하면 됩니다.
연결 성공, 실패 또는 정지 상태가 되는 경우
mGoogleApiClient = new GoogleApiClient.Builder(this) .addApi(Drive.API) .addScope(Drive.SCOPE_FILE) .addConnectionCallbacks(this) .addOnConnectionFailedListener(this) .build()
연결을 수동으로 관리할 때는
connect()
드림
및
disconnect()
메서드를 사용할 수 있도록 합니다. 활동에서
컨텍스트에서는 활동의 onStart()
에서 connect()
를 호출하는 것이 좋습니다.
메서드의 onStop()
메서드에는 disconnect()
가 있습니다.
connect()
및
disconnect()
메서드
자동 관리 연결을 사용할 때 자동으로 호출됩니다.
GoogleApiClient
를 사용하여
Google Drive 또는 Google Play 게임즈와 같은 인증을 사용하는 경우
첫 번째 연결 시도가 실패하고 앱에서 호출을 수신합니다.
받는사람: 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()
님,
기존 계정 선택 도구 앞에 또 다른 계정 선택 도구 대화상자가 생성됩니다.
이 불리언은 활동 인스턴스 간에 지속되는 경우에만 의도된 용도로 사용됩니다. 다음 섹션에서는 다른 사용자 작업에도 불구하고 앱의 오류 처리 상태를 유지하는 방법을 설명합니다. 또는 기기에서 발생하는 이벤트로 간주됩니다.
오류를 해결하는 동안 상태 유지
코드가 실행되는 것을 방지하기 위해
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 서비스에 수동으로 연결할 준비가 되었습니다.