谷歌驱动器android错误:java.lang.IllegalArgumentException:该名称不能为空:空

问题描述:

我被卡住了一个“java.lang.IllegalArgumentException:名称不能为空:null”Google Drive Android应用程序的例外。谷歌驱动器android错误:java.lang.IllegalArgumentException:该名称不能为空:空

我一直googling几天没有得到任何线索。 这是我的代码(一个简单的例子),以获得在谷歌云端硬盘中的文件列表: (这是从这里取:Google Drive SDK Exception))

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"); 
    } 
} 
} 

这将生成的文件此跟踪= request.execute(;或任何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$a.a(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) 

我觉得失去了这一点,没有任何关于这可能是wrong.I线索都遵循本教程中有关配置谷歌API服务:https://plus.google.com/u/0/114042449736049687152/posts/CD3L8zcJg5Z

感谢您帮帮我。

+0

at com.maiko.fool.Fool_5 $ 3.run(Fool_5.java:184) - 什么是184行? – ianhanniballake 2013-04-20 02:48:39

+0

184 is:files = request.execute(); (如前所述) – MaikoMobile 2013-04-20 21:54:21

+0

@MaikoMobile你有解决这个问题吗?我也面临同样的问题,我也设置了选定的帐户名称。 – 2017-01-06 08:47:48

验证您传递给“mCredential”对象的var“accountName”。通常这就是这些错误的原因。 问候。

+0

从何时起,GoogleAuthUtil.getToken()方法开始针对未在设备上注册的电子邮件抛出一个带有“BadUsername”消息的GoogleAuthException,而不是之前发生的带有消息“Non existing account'email_address'”的异常IllegalArgumentException? http://developer.android.com/reference/com/google/android/gms/auth/GoogleAuthUtil.html#getToken(android.content.Context,java.lang.String,java.lang.String) – toobsco42 2013-11-06 02:35:11

我在用户名中缺少@gmail.com时得到了这个。认为它是可选的,因为它是在大多数谷歌形式...

请确保READ_CONTACTS权限已启用。由于权限的限制,我在使用Youtube Data API v3时遇到了同样的错误。

对于面临同样问题的其他人,

尝试credential.setAccount()而不是credential.setAccountName();

由于在有时需要的账户对象中存在额外的“类型”参数。对于存储你可以做如下的情况:(伪代码)

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

然后进行检索

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

现在它应该工作:d,这仅仅是伪您基本的了解和代码如果复制到您的项目中将不起作用。