2013-04-20 50 views
5

我被卡住了一個「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

回答

5

驗證您傳遞給「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

1

我在用戶名中缺少@gmail.com時得到了這個。認爲它是可選的,因爲它是在大多數谷歌形式...

1

請確保READ_CONTACTS權限已啓用。由於權限的限制,我在使用Youtube Data API v3時遇到了同樣的錯誤。

1

對於面臨同樣問題的其他人,

嘗試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,這僅僅是僞您基本的瞭解和代碼如果複製到您的項目中將不起作用。

相關問題