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
.
- Google Drive en error android: java.lang.IllegalArgumentException: el nombre no debe estar vacío: null
- Google Drive + ACTION_GET_CONTENT
- ¿Cómo crear archivos para ir a qué cuenta con las API de Google Drive al realizar la autenticación con una cuenta de servicio?
- Comprobación de la sincronización de archivos mediante Drive API
- Abrir un URI de contenido de archivo de Google Drive después de usar KitKat Storage Access Framework
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.
- API de Google Drive \ Docs para Android
- ¿Cómo puedo crear y editar un archivo de hoja de cálculo en una unidad de Google con las API de Google Drive solo desde mi aplicación para Android?
- Error de la carpeta principal no válida para AppFolder en Drive API
- GooglePlayServices no está disponible debido al error 2
- Error: GooglePlayServicesUtil: Se ha producido un error interno. Consulte los registros para obtener información detallada. ¿Cómo puedo solucionar esto?
- Notificaciones de la API REST de Google Drive no funcionan para cambios en la carpeta de aplicaciones
- ¿GoogleAccountCredential proporciona token de actualización?
- Carga reanudable en Drive Rest API V3
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
…
- ¿Puedo usar GreenBox EventBus para la comunicación entre la actividad y el servicio?
- Estudio portátil Android