0

В Accessing Google APIs говоритсяМожет ли Google Drive Android Drive.API Android сочетаться с другими API?

Вы можете добавить несколько API, и несколько областей к тому же GoogleApiClient путем добавления дополнительных вызовов к addApi() и addScope().

Вдоль этой линии я пытался что-то вроде этого:

private GoogleApiClient buildGoogleApiClient() { 
    return new GoogleApiClient.Builder(this) 
     .addApi(Drive.API) 
     .addScope(Drive.SCOPE_APPFOLDER) // Required for AppFolder access 
     .addConnectionCallbacks(this) 
     .addOnConnectionFailedListener(this) 
     .addApi(Auth.GOOGLE_SIGN_IN_API)  // I added this because I need Auth.GoogleSignInApi.signOut(client) method 
     .build(); 
} 

public void onClickBtnDeleteFromDrive(View v) { 
    mGoogleApiClient = buildGoogleApiClient(); 
    mGoogleApiClient.connect(); 
} 

Как вы видите, я пытаюсь объединить два API, потому что мне нужен метод Auth.GoogleSignInApi.signOut (клиент). Зачем? Поскольку у GoogleApiClient нет метода для автоматического выхода из учетной записи пользователя по умолчанию. Да, я знаю, что есть clearDefaultAndRecconect(), но это требует уже подписания, а также принудительного повторного подключения. Оба они против моего рабочего процесса. выше buildGoogleApiClient() производит исключение:

02-14 08:49:07.760: E/AndroidRuntime(5436): FATAL EXCEPTION: main 
02-14 08:49:07.760: E/AndroidRuntime(5436): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.testgoogleapi/com.example.testgoogleapi.ActivityMain}: java.lang.IllegalStateException: Must not set scopes in GoogleApiClient.Builder when using Auth.GOOGLE_SIGN_IN_API. Set account in GoogleSignInOptions.Builder instead. 
02-14 08:49:07.760: E/AndroidRuntime(5436):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2110) 
02-14 08:49:07.760: E/AndroidRuntime(5436):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2135) 
02-14 08:49:07.760: E/AndroidRuntime(5436):  at android.app.ActivityThread.access$700(ActivityThread.java:140) 
02-14 08:49:07.760: E/AndroidRuntime(5436):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1237) 
02-14 08:49:07.760: E/AndroidRuntime(5436):  at android.os.Handler.dispatchMessage(Handler.java:99) 
02-14 08:49:07.760: E/AndroidRuntime(5436):  at android.os.Looper.loop(Looper.java:137) 
02-14 08:49:07.760: E/AndroidRuntime(5436):  at android.app.ActivityThread.main(ActivityThread.java:4921) 
02-14 08:49:07.760: E/AndroidRuntime(5436):  at java.lang.reflect.Method.invokeNative(Native Method) 
02-14 08:49:07.760: E/AndroidRuntime(5436):  at java.lang.reflect.Method.invoke(Method.java:511) 
02-14 08:49:07.760: E/AndroidRuntime(5436):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1027) 
02-14 08:49:07.760: E/AndroidRuntime(5436):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:794) 
02-14 08:49:07.760: E/AndroidRuntime(5436):  at dalvik.system.NativeStart.main(Native Method) 
02-14 08:49:07.760: E/AndroidRuntime(5436): Caused by: java.lang.IllegalStateException: Must not set scopes in GoogleApiClient.Builder when using Auth.GOOGLE_SIGN_IN_API. Set account in GoogleSignInOptions.Builder instead. 
02-14 08:49:07.760: E/AndroidRuntime(5436):  at com.google.android.gms.common.internal.zzx.zza(Unknown Source) 
02-14 08:49:07.760: E/AndroidRuntime(5436):  at com.google.android.gms.common.api.GoogleApiClient$Builder.zzoZ(Unknown Source) 
02-14 08:49:07.760: E/AndroidRuntime(5436):  at com.google.android.gms.common.api.GoogleApiClient$Builder.build(Unknown Source) 
02-14 08:49:07.760: E/AndroidRuntime(5436):  at com.example.testgoogleapi.ActivityMain.buildGoogleApiClient(ActivityMain.java:81) 
02-14 08:49:07.760: E/AndroidRuntime(5436):  at com.example.testgoogleapi.ActivityMain.onCreate(ActivityMain.java:458) 
02-14 08:49:07.760: E/AndroidRuntime(5436):  at android.app.Activity.performCreate(Activity.java:5206) 
02-14 08:49:07.760: E/AndroidRuntime(5436):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1094) 
02-14 08:49:07.760: E/AndroidRuntime(5436):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2074) 
02-14 08:49:07.760: E/AndroidRuntime(5436):  ... 11 more 
02-14 08:49:22.710: I/Process(5436): Sending signal. PID: 5436 SIG: 9 

Так как объединить эти два API и использовать функциональные возможности от обоих?

ответ

0

Сообщение об ошибке также сообщает об этом решении. Вы должны инициализировать их используя GoogleSigninOptions

GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) 
        .requestScopes(Scopes.DRIVE_APPFOLDER) 
        .build() 

Затем передать это Google API клиента строителем, так что ваш код будет выглядеть следующим образом

... rest of the code 
    GoogleApiClient.Builder(this)    
      .addConnectionCallbacks(this) 
      .addOnConnectionFailedListener(this) 
      .addApi(Auth.GOOGLE_SIGN_IN_API, gso)  // Pass the GoogleSignInOptions object here 
      .build(); 
0

Использование Google Войти для Android -> Это Лучшая практика как зефира

https://developers.google.com/identity/sign-in/android/

GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) 
.requestEmail() 
.build(); 

// Build a GoogleApiClient with access to GoogleSignIn.API and the options above. 

mGoogleApiClient = new GoogleApiClient.Builder(this) 
.enableAutoManage(this, this) 
.addApi(Auth.GOOGLE_SIGN_IN_API, gso) 
.build(); 

Intent signInIntent = Auth.GoogleSignInApi.getSignInInten(mGoogleApiClient); 
startActivityForResult(signInIntent, RC_SIGN_IN); 

Результат:

@Override public void onActivityResult(int requestCode, int resultCode, Intent data) { 
super.onActivityResult(requestCode, resultCode, data); 

// Result returned from launching the Intent from 
// GoogleSignInApi.getSignInIntent(...); 

if (requestCode == RC_SIGN_IN) { 
    GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data); 
    if (result.isSuccess()) { 
     GoogleSignInAccount acct = result.getSignInAccount(); 
     // Get account information 
     mFullName = acct.getDisplayName(); 
     mEmail = acct.getEmail(); 
    } 
} 
} 

@Override public void onActivityResult(int requestCode, int resultCode, Intent data) { 
super.onActivityResult(requestCode, resultCode, data); 

// Result returned from launching the Intent from 

if (requestCode == RC_SIGN_IN) { 
    GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data); 
    if (result.isSuccess()) { 
     GoogleSignInAccount acct = result.getSignInAccount(); 
     // Get account information 
     mFullName = acct.getDisplayName(); 
     mEmail = acct.getEmail(); 
    } 
} 

Вы можете добавить несколько API, и несколько областей к тому же GoogleApiClient путем добавления дополнительных вызовов к addApi() и addScope().

https://developers.google.com/android/guides/api-client

+0

Проблема с этим предложением в том, что она не сочетается с Google Drive API. И, как оказалось, GoogleSignInApi не предлагает какой-либо optioun для очистки учетной записи по умолчанию. Таким образом, он имеет ту же ошибку, что и Drive API. –

+0

см. Ниже код для выхода из системы и отмены доступа –

0
private void signOut() { 
    Auth.GoogleSignInApi.signOut(mGoogleApiClient).setResultCallback(
      new ResultCallback<Status>() { 
       @Override 
       public void onResult(Status status) { 
        Toast.makeText(getApplicationContext(), "Logged out", Toast.LENGTH_SHORT).show(); 
       } 
      }); 
} 

private void revokeAccess() { 
    Auth.GoogleSignInApi.revokeAccess(mGoogleApiClient).setResultCallback(
      new ResultCallback<Status>() { 
       @Override 
       public void onResult(Status status) { 
        Toast.makeText(getApplicationContext(), "Access Revoked", Toast.LENGTH_SHORT).show(); 
       } 
      }); 
} 
Смежные вопросы