API de Google Drive: el nombre no debe estar vacío: null (pero había pasado el nombre de cuenta válido a GoogleAccountCredential)

Recientemente, tengo el código de Android que accede a Google Drive. Estoy utilizando la biblioteca de clientes de API de Google para Java en lugar de la biblioteca de clientes de servicios de Google Play

private static GoogleCloudFile searchFromGoogleDrive(Drive drive, String qString, HandleUserRecoverableAuthIOExceptionable h, PublishProgressable p) { try { Files.List request = drive.files().list().setQ(qString); do { if (p.isCancelled()) { return null; } FileList fileList = request.execute(); 

El código funciona 100% bien durante varios años, si utilizo targetSdkVersion 21 .

Recientemente, targetSdkVersion 23 mi aplicación a targetSdkVersion 23 , con 0 cambios en el código relacionado con Google Drive.

Sin embargo, el código se bloquea misterio en FileList fileList = request.execute(); , Con la siguiente excepción.

Registro de errores al utilizar 1.18.0-rc

 Process: org.yccheok.jstock.gui, PID: 30317 java.lang.RuntimeException: An error occurred while executing doInBackground() at android.os.AsyncTask$3.done(AsyncTask.java:309) at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:354) at java.util.concurrent.FutureTask.setException(FutureTask.java:223) at java.util.concurrent.FutureTask.run(FutureTask.java:242) at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588) at java.lang.Thread.run(Thread.java:818) Caused by: java.lang.IllegalArgumentException: the name must not be empty: null at android.accounts.Account.<init>(Account.java:48) at com.google.android.gms.auth.zzd.getToken(Unknown Source) at com.google.android.gms.auth.GoogleAuthUtil.getToken(Unknown Source) at com.google.api.client.googleapis.extensions.android.gms.auth.GoogleAccountCredential.getToken(GoogleAccountCredential.java:255) at com.google.api.client.googleapis.extensions.android.gms.auth.GoogleAccountCredential$RequestHandler.intercept(GoogleAccountCredential.java:279) at com.google.api.client.http.HttpRequest.execute(HttpRequest.java:859) at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:410) at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:343) at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.execute(AbstractGoogleClientRequest.java:460) at org.yccheok.jstock.gui.Utils.searchFromGoogleDrive(Utils.java:208) at org.yccheok.jstock.gui.Utils._loadFromGoogleDrive(Utils.java:277) at org.yccheok.jstock.gui.Utils.loadFromGoogleDrive(Utils.java:344) at org.yccheok.jstock.gui.LoadFromCloudTask.doInBackground(LoadFromCloudTask.java:23) at org.yccheok.jstock.gui.LoadFromCloudTask.doInBackground(LoadFromCloudTask.java:9) at android.os.AsyncTask$2.call(AsyncTask.java:295) at java.util.concurrent.FutureTask.run(FutureTask.java:237) at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588) at java.lang.Thread.run(Thread.java:818) 

Si me google, tengo Google Drive en error android: java.lang.IllegalArgumentException: el nombre no debe estar vacío: null , que indica que el nombre de cuenta no se pasa al objeto de credencial.

Sin embargo, estoy bastante seguro de que mi objeto de credencial se pasa con un nombre de cuenta válido (en formato [email protected])

 protected void onActivityResult(final int requestCode, final int resultCode, final Intent data) { switch (requestCode) { case RequestCode.REQUEST_ACCOUNT_PICKER_LOAD_FROM_CLOUD: if (resultCode == RESULT_OK && data != null && data.getExtras() != null) { String accountName = data.getStringExtra(AccountManager.KEY_ACCOUNT_NAME); Log.i("CHEOK", "accountName = " + accountName); if (accountName != null) { JStockApplication.instance().getJStockOptions().setUsername(accountName); Utils.getGoogleAccountCredential().setSelectedAccountName(accountName); 

Utils.java

 public static GoogleAccountCredential getGoogleAccountCredential() { return googleAccountCredential; } private static final GoogleAccountCredential googleAccountCredential = GoogleAccountCredential.usingOAuth2(JStockApplication.instance(), Arrays.asList( DriveScopes.DRIVE_APPDATA, // Legacy. Shall be removed after a while... DriveScopes.DRIVE ) ); private Drive getDriveService() { return new Drive.Builder(AndroidHttp.newCompatibleTransport(), new GsonFactory(), Utils.getGoogleAccountCredential()).build(); } 

Además, estoy bastante seguro de que mi OAuth 2.0 correctamente a través de la consola de desarrolladores de Google (tanto para depurar keystore y keystore de producción) Recientemente, Android 6 introduce permisos en tiempo de ejecución. Me preguntaba, ¿puede esta excepción relacionada con eso?

También intento con la última versión de la biblioteca 1.21.0. Sin embargo, todavía obtengo un registro de errores similar

Registro de errores mientras usa 1.21.0

 java.lang.RuntimeException: An error occurred while executing doInBackground() at android.os.AsyncTask$3.done(AsyncTask.java:309) at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:354) at java.util.concurrent.FutureTask.setException(FutureTask.java:223) at java.util.concurrent.FutureTask.run(FutureTask.java:242) at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588) at java.lang.Thread.run(Thread.java:818) Caused by: java.lang.IllegalArgumentException: the name must not be empty: null at android.accounts.Account.<init>(Account.java:48) at com.google.android.gms.auth.zzd.getToken(Unknown Source) at com.google.android.gms.auth.GoogleAuthUtil.getToken(Unknown Source) at com.google.api.client.googleapis.extensions.android.gms.auth.GoogleAccountCredential.getToken(GoogleAccountCredential.java:255) at com.google.api.client.googleapis.extensions.android.gms.auth.GoogleAccountCredential$RequestHandler.intercept(GoogleAccountCredential.java:279) at com.google.api.client.http.HttpRequest.execute(HttpRequest.java:859) at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:419) at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:352) at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.execute(AbstractGoogleClientRequest.java:469) at org.yccheok.jstock.gui.Utils.searchFromGoogleDrive(Utils.java:208) at org.yccheok.jstock.gui.Utils._loadFromGoogleDrive(Utils.java:277) at org.yccheok.jstock.gui.Utils.loadFromGoogleDrive(Utils.java:344) at org.yccheok.jstock.gui.LoadFromCloudTask.doInBackground(LoadFromCloudTask.java:23) at org.yccheok.jstock.gui.LoadFromCloudTask.doInBackground(LoadFromCloudTask.java:9) at android.os.AsyncTask$2.call(AsyncTask.java:295) at java.util.concurrent.FutureTask.run(FutureTask.java:237) at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588) at java.lang.Thread.run(Thread.java:818) 

Actualización de mis nuevas pruebas

Los 2 registros de errores anteriores se generan mientras estoy probando usando Nexus 5, Android versión 6.0.1

Sin embargo, si realizo las mismas pruebas utilizando Nexus 4, Android versión 5.1.1, no se produce ningún error! Ambos 1.18.0-rc y 1.21.0 están funcionando bien

Por lo tanto, parece que el accidente está fuertemente relacionado con la versión de Android.

Parece que la biblioteca de cliente API de Drive para Java llama a GoogleAuthUtil.getToken() , que requiere el permiso GET_ACCOUNTS . Necesita tener ese permiso en su manifiesto y solicitarlo en tiempo de ejecución, según corresponda.

Esto se debe a que desde Android 6.0 (API level 23) necesita obtener el permiso de Contactos antes de invocar puntos finales de Google.

Puedes ver detalles completos aquí – https://developer.android.com/training/permissions/requesting.html

Esto es cierto sólo para permisos peligrosos y grupos de permisos (basados ​​en cuánto están relacionados con la privacidad del usuario). Más detalles – https://developer.android.com/guide/topics/security/permissions.html#perm-groups

Tuve el mismo problema, todos los permisos se concedieron y todavía tengo este error.

Mi problema simple era, que el googleSignInAccount.getSignInAccount().getAccount() era null . Este es el caso, si NO solicita los permisos de correo electrónico ( GoogleSignInOptions.Builder.requestEmail ). Parece que esta cuenta no se puede crear sin el correo electrónico del usuario.

Así que asegúrate de añadir este permiso a GoogleSignInOptions

  • Google Drive OCR Android
  • Fecha de la modificación de la unidad de google dar tiempo incorrecto
  • Subir archivo de texto a Google Drive mediante Android
  • Cómo subir una copia de seguridad del teléfono Llamar / sms / contactos a Google Cloud
  • Uso de Google Drive para realizar copias de seguridad y restaurar bases de datos SQLite
  • Cómo subir FILE_URI con Google Drive API: Insertar archivo
  • Copia de seguridad de datos de Google Cloud Almacén de datos Vs google drive Vs otro servicio de almacenamiento
  • Excepción de autenticación de Google Drive: ¿necesita permiso? (V2)
  • ¿Cómo descargar el archivo de Google Drive con Drive.API?
  • ¿Es Google Drive RealTime API para Android?
  • Descargar un archivo de Google Drive por URL En Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.