4

Я пытаюсь интегрировать Google Диск в свое приложение с небольшим успехом. Использование кода из репозитория Quick Start, я получаю следующее сообщение об ошибке каждый раз, когда я выбираю учетную запись пользователя для журнала в:Не удалось подключиться GoogleApiClient: ConnectionResult {statusCode = SIGN_IN_REQUIRED,

I/DriveDemo: GoogleApiClient connection failed: ConnectionResult{statusCode=SIGN_IN_REQUIRED, resolution=PendingIntent{867e070: [email protected]}, message=null} 

Я следовал инструкциям на нижеприведенных ссылок:

  1. https://developers.google.com/drive/android/get-started
  2. https://github.com/googledrive/android-quickstart

и последовали видео на:

  1. https://youtu.be/RezC1XP6jcs

Я также посмотрел на многочисленные вопросы переполнению стека и ответы, не имея представления, что я делаю неправильно.

manifest.xml:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.lightkeeper54.chuck.drivedemo"> 

    <uses-permission android:name="android.permission.GET_ACCOUNTS" /> 
    <application 
     android:allowBackup="true" 
     android:icon="@mipmap/ic_launcher" 
     android:label="@string/app_name" 
     android:supportsRtl="true" 
     android:theme="@style/AppTheme"> 
     <activity android:name=".MainActivity"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 
       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
    </application> 

</manifest> 

Код:

protected void onResume() { 
    super.onResume(); 
    if (mGoogleApiClient == null) { 
     // Create the API client and bind it to an instance variable. 
     // We use this instance as the callback for connection and connection 
     // failures. 
     // Since no account name is passed, the user is prompted to choose. 
     mGoogleApiClient = new GoogleApiClient.Builder(this) 
       .addApi(Drive.API) 
       .addScope(Drive.SCOPE_FILE) 
       .addConnectionCallbacks(this) 
       .addOnConnectionFailedListener(this) 
       .build(); 
    } 
    // Connect the client. Once connected, the camera is launched. 
    mGoogleApiClient.connect(); 
} 

@Override 
protected void onPause() { 
    if (mGoogleApiClient != null) { 
     mGoogleApiClient.disconnect(); 
    } 
    super.onPause(); 
} 

@Override 
protected void onActivityResult(final int requestCode, final int resultCode, final Intent data) { 
    switch (requestCode) { 
     case REQUEST_CODE_CAPTURE_IMAGE: 
      // Called after a photo has been taken. 
      if (resultCode == Activity.RESULT_OK) { 
       // Store the image data as a bitmap for writing later. 
       mBitmapToSave = (Bitmap) data.getExtras().get("data"); 
      } 
      break; 
     case REQUEST_CODE_CREATOR: 
      // Called after a file is saved to Drive. 
      if (resultCode == RESULT_OK) { 
       Log.i(TAG, "Image successfully saved."); 
       mBitmapToSave = null; 
       // Just start the camera again for another photo. 
       startActivityForResult(new Intent(MediaStore.ACTION_IMAGE_CAPTURE), 
         REQUEST_CODE_CAPTURE_IMAGE); 
      } 
      break; 
    } 
} 

@Override 
public void onConnectionFailed(ConnectionResult result) { 
    // Called whenever the API client fails to connect. 
    Log.i(TAG, "GoogleApiClient connection failed: " + result.toString()); 
    if (!result.hasResolution()) { 
     // show the localized error dialog. 
     GoogleApiAvailability.getInstance().getErrorDialog(this, result.getErrorCode(), 0).show(); 
     return; 
    } 
    // The failure has a resolution. Resolve it. 
    // Called typically when the app is not yet authorized, and an 
    // authorization 
    // dialog is displayed to the user. 
    try { 
     result.startResolutionForResult(this, REQUEST_CODE_RESOLUTION); 
    } catch (IntentSender.SendIntentException e) { 
     Log.e(TAG, "Exception while starting resolution activity", e); 
    } 
} 

@Override 
public void onConnected(Bundle connectionHint) { 
    Log.i(TAG, "API client connected."); 
    if (mBitmapToSave == null) { 
     // This activity has no UI of its own. Just start the camera. 
     startActivityForResult(new Intent(MediaStore.ACTION_IMAGE_CAPTURE), 
       REQUEST_CODE_CAPTURE_IMAGE); 
     return; 
    } 
    saveFileToDrive(); 
} 

@Override 
public void onConnectionSuspended(int cause) { 
    Log.i(TAG, "GoogleApiClient connection suspended"); 
} 
+0

Вы регистрируете ключ разработки/выпуска в консоли Google API? –

+0

Выполнены все шаги по созданию и регистрации ключа. – lightkeeper

+0

@ lightkeeper сделать AuthKey в консоли разработчика, используя yourpackage и ключ SHA, и вам хорошо идти ... – Kushan2

ответ

0

На основе документации - SIGN_IN_REQUIRED

клиент пытался подключиться к службе, но пользователь не подписан . Клиент может продолжить работу без использования API. В качестве альтернативы, если hasResolution() возвращает true, клиент может позвонить startResolutionForResult(Activity, int), чтобы пригласить пользователя войти в систему. После того, как активность в знаке возвращается с RESULT_OK, дальнейшие попытки должны быть успешными.

Вы также можете проверить @ вопрос Чек, в так post, что предложил, чтобы правильно добавить SHA-1 и имя пакета, как просили и включить API сразу проецировать учетное все готовы.

Надеюсь, эта информация поможет.

+0

Я выполнил все шаги, чтобы создать ключ и зарегистрировать его в консоли API. API отображается как активный в консоли. Вот почему я застрял. – lightkeeper

0

У меня была аналогичная проблема, которая была исправлена ​​после я гарантировал, что каждый билд APK был подписан одним и тем же хранилище, что я использовал при выполнении «Получить Android сертификат и зарегистрировать приложение», как описано here

При использовании студии , Я выполнил «автоматическое подписание», выполнив шаги, описанные в «Настроить процесс сборки, чтобы автоматически подписывать APK», как описано here. Очевидно, используйте одно и то же хранилище ключей, которое используется при регистрации вашего приложения (см. Выше).

Смежные вопросы