Google Drive en error android: java.lang.IllegalArgumentException: el nombre no debe estar vacío: null

Me quedé atascado con una "java.lang.IllegalArgumentException: el nombre no debe estar vacío: null" Excepción en la aplicación Google Drive para Android.

He estado googleando varios días sin obtener ninguna pista. Este es mi código (un ejemplo fácil) para obtener una lista de archivos en Google Drive: (Se tomó desde aquí: Excepción de Google Drive SDK )

import java.io.IOException; import java.util.ArrayList; import android.accounts.Account; import android.accounts.AccountManager; import android.app.Activity; import android.app.ProgressDialog; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.os.AsyncTask; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.Button; import com.google.android.gms.auth.GoogleAuthException; import com.google.android.gms.auth.GoogleAuthUtil; import com.google.android.gms.auth.UserRecoverableAuthException; import com.google.android.gms.common.AccountPicker; import com.google.api.client.auth.oauth2.BearerToken; import com.google.api.client.auth.oauth2.Credential; import com.google.api.client.extensions.android.http.AndroidHttp; import com.google.api.client.googleapis.extensions.android.accounts.GoogleAccountManager; import com.google.api.client.googleapis.extensions.android.gms.auth.GoogleAccountCredential; import com.google.api.client.http.HttpRequestFactory; import com.google.api.client.http.HttpTransport; import com.google.api.client.http.json.JsonHttpRequest; import com.google.api.client.http.json.JsonHttpRequestInitializer; import com.google.api.client.json.jackson.JacksonFactory; import com.google.api.services.drive.Drive; import com.google.api.services.drive.Drive.Files; import com.google.api.services.drive.DriveRequest; import com.google.api.services.drive.DriveScopes; import com.google.api.services.drive.model.File; import com.google.api.services.drive.model.FileList; import com.maiko.xscanpet.R; import com.maiko.xscanpet.cloud.GDriveHelper; public class Fool_5 extends Activity { private static final int CHOOSE_ACCOUNT=0; private static String accountName; private static int REQUEST_TOKEN=0; private Button btn_drive; private Context ctx = this; private Activity a = this; GoogleAccountCredential mCredential= null; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // set up the GUI layout setContentView(R.layout.fool_5); // set the variables to access the GUI controls btn_drive = (Button) findViewById(R.id.btn_drive); btn_drive.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { chooseAccount(); } }); } public void chooseAccount() { Intent intent = AccountPicker.newChooseAccountIntent(null, null, new String[]{"com.google"}, false, null, null, null, null); startActivityForResult(intent, CHOOSE_ACCOUNT); } // Fetch the access token asynchronously. void getAndUseAuthTokenInAsyncTask(Account account) { AsyncTask<Account, String, String> task = new AsyncTask<Account, String, String>() { ProgressDialog progressDlg; AsyncTask<Account, String, String> me = this; @Override protected void onPreExecute() { progressDlg = new ProgressDialog(ctx, ProgressDialog.STYLE_SPINNER); progressDlg.setMax(100); progressDlg.setTitle("Validating..."); progressDlg.setMessage("Verifying the login data you entered...\n\nThis action will time out after 10 seconds."); progressDlg.setCancelable(false); progressDlg.setIndeterminate(false); progressDlg.setOnCancelListener(new android.content.DialogInterface.OnCancelListener() { public void onCancel(DialogInterface d) { progressDlg.dismiss(); me.cancel(true); } }); progressDlg.show(); } @Override protected String doInBackground(Account... params) { return getAccessToken(params[0]); } @Override protected void onPostExecute(String s) { if (s == null) { // Wait for the extra intent } else { accountName = s; getDriveFiles(); } progressDlg.dismiss(); } }; task.execute(account); } /** * Fetches the token from a particular Google account chosen by the user. DO NOT RUN THIS DIRECTLY. It must be run asynchronously inside an AsyncTask. * @param activity * @param account * @return */ private String getAccessToken(Account account) { try { return GoogleAuthUtil.getToken(ctx, account.name, "oauth2:" + DriveScopes.DRIVE); // IMPORTANT: DriveScopes must be changed depending on what level of access you want } catch (UserRecoverableAuthException e) { // Start the Approval Screen intent, if not run from an Activity, add the Intent.FLAG_ACTIVITY_NEW_TASK flag. a.startActivityForResult(e.getIntent(), REQUEST_TOKEN); e.printStackTrace(); return null; } catch (GoogleAuthException e) { e.printStackTrace(); return null; } catch (IOException e) { e.printStackTrace(); return null; } } private Drive getDriveService() { mCredential = GoogleAccountCredential.usingOAuth2(this, DriveScopes.DRIVE); mCredential.setSelectedAccountName(accountName); return GDriveHelper.getDriveService(mCredential,getResources().getString(R.string.app_name)); } /** * Obtains a list of all files on the signed-in user's Google Drive account. */ private void getDriveFiles() { Thread t = new Thread(new Runnable() { @Override public void run() { Drive service = getDriveService(); Log.d("SiteTrack", "FUNCTION getDriveFiles()"); Files.List request; try { request = service.files().list(); // .setQ("mimeType=\"text/plain\""); } catch (IOException e) { e.printStackTrace(); return; } do { FileList files; try { System.out.println("got here"); Log.d("SiteTrack", request.toString()); //mCredential.setSelectedAccountName(accountName); files = request.execute(); } catch (IOException e) { e.printStackTrace(); Log.d("SiteTrack", "Exception"); return; } ArrayList<File> fileList = (ArrayList<File>) files.getItems(); Log.d("SiteTrack", "Files found: " + files.getItems().size()); for (File f : fileList) { String fileId = f.getId(); String title = f.getTitle(); Log.d("SiteTrack", "File " + fileId + ": " + title); } request.setPageToken(files.getNextPageToken()); } while (request.getPageToken() != null && request.getPageToken().length() >= 0); } }); t.start(); } protected void onActivityResult(final int requestCode, final int resultCode, final Intent data) { if (requestCode == CHOOSE_ACCOUNT && resultCode == RESULT_OK) { accountName = data.getStringExtra(AccountManager.KEY_ACCOUNT_NAME); GoogleAccountManager gam = new GoogleAccountManager(this); getAndUseAuthTokenInAsyncTask(gam.getAccountByName(accountName)); Log.d("SiteTrack", "CHOOSE_ACCOUNT"); } else if (requestCode == REQUEST_TOKEN && resultCode == RESULT_OK) { accountName = data.getStringExtra(AccountManager.KEY_ACCOUNT_NAME); Log.d("SiteTrack", "REQUEST_TOKEN"); } } } 

Esto genera este rastreo en files = request.execute (); O cualquier request.execute ():

 04-20 01:40:26.105: E/AndroidRuntime(27203): FATAL EXCEPTION: Thread-39033 04-20 01:40:26.105: E/AndroidRuntime(27203): java.lang.IllegalArgumentException: the name must not be empty: null 04-20 01:40:26.105: E/AndroidRuntime(27203): at android.os.Parcel.readException(Parcel.java:1429) 04-20 01:40:26.105: E/AndroidRuntime(27203): at android.os.Parcel.readException(Parcel.java:1379) 04-20 01:40:26.105: E/AndroidRuntime(27203): at com.google.android.gms.internal.x$a$aa(Unknown Source) 04-20 01:40:26.105: E/AndroidRuntime(27203): at com.google.android.gms.auth.GoogleAuthUtil.getToken(Unknown Source) 04-20 01:40:26.105: E/AndroidRuntime(27203): at com.google.android.gms.auth.GoogleAuthUtil.getToken(Unknown Source) 04-20 01:40:26.105: E/AndroidRuntime(27203): at com.google.api.client.googleapis.extensions.android.gms.auth.GoogleAccountCredential.getToken(GoogleAccountCredential.java:192) 04-20 01:40:26.105: E/AndroidRuntime(27203): at com.google.api.client.googleapis.extensions.android.gms.auth.GoogleAccountCredential$RequestHandler.intercept(GoogleAccountCredential.java:217) 04-20 01:40:26.105: E/AndroidRuntime(27203): at com.google.api.client.http.HttpRequest.execute(HttpRequest.java:888) 04-20 01:40:26.105: E/AndroidRuntime(27203): at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:407) 04-20 01:40:26.105: E/AndroidRuntime(27203): at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:340) 04-20 01:40:26.105: E/AndroidRuntime(27203): at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.execute(AbstractGoogleClientRequest.java:458) 04-20 01:40:26.105: E/AndroidRuntime(27203): at com.maiko.fool.Fool_5$3.run(Fool_5.java:184) 04-20 01:40:26.105: E/AndroidRuntime(27203): at java.lang.Thread.run(Thread.java:856) 

Me siento perdido por esto, sin ninguna pista sobre lo que podría estar mal. He seguido este tutorial sobre la configuración de los Servicios de la API de Google: https://plus.google.com/u/0/114042449736049687152/posts/CD3L8zcJg5Z

Gracias por tu ayuda.

Verifique la var "accountName" que está pasando al objeto "mCredential". Normalmente esa es la razón de esos errores. Saludos.

Conseguí esto cuando @gmail.com faltaba del nombre de usuario. Pensé que era opcional porque está en la mayoría de los formularios de Google …

Asegúrese de que el permiso READ_CONTACTS está habilitado. Tengo el mismo error al usar Youtube Data API v3 debido al permiso.

Para otras personas que enfrentan el mismo problema,

Pruebe credential.setAccount () en lugar de credential.setAccountName ();

Ya que hay un parámetro "tipo" adicional en un objeto de cuenta que se requiere a veces. Para el almacenamiento podría hacer algo como en el caso a continuación: (pseudo código)

 GoogleSignInAccount account = initAccount(); Account acct = account.getAccount(); storeStringInPrefs("NAME" , acct.name); storeStringInPrefs("TYPE" , acct.type); 

Entonces para la recuperación

 GoogleAccountCredential credential = GoogleAccountCredential.usingOauth(...); String name = getPrefs("NAME"); String type = getPrefs("TYPE"); credential.setSelectedAccount(new Account(name , type)); 

Ahora debería funcionar: D, Esto es sólo pseudo-código para su comprensión básica y no funcionará si se copia en su proyecto.

  • Appcompat "java.lang.IllegalArgumentException: el parámetro debe ser un descendiente de esta vista" en ViewGroup.offsetRectBetweenParentAndChild
  • Obtener una IllegalArgumentException al agregar datos de línea
  • Error de tiempo de ejecución: java.lang.IllegalArgumentException: provider = gps
  • Android TabView error?
  • Java.lang.IllegalArgumentException: registra demasiados receptores de difusión
  • IllegalArgumentException al instanciar HttpClient en Android
  • Id. Duplicada, etiqueta nula o identificador padre con otro fragmento para com.google.android.gms.maps.MapFragment
  • Vista no adjunta al administrador de ventanas (cuál es la solución?)
  • Android - java.lang.IllegalArgumentException: contentIntent error requerido por la notificación?
  • Android Proguard - IllegalArgumentException en la clase TypeReference de Jackson
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.