[英]Android Google Drive Api token error
我無法將Google驅動器集成到我的android應用中。
我希望能夠上傳,下載和瀏覽文件。
到目前為止,我只是試圖使用Java API來獲取驅動器的文件列表,因為Google表示它更靈活。
我這樣連接到Google雲端硬盤:
googleAccountCredential = GoogleAccountCredential.usingOAuth2(getActivity(), Arrays.asList(DriveScopes.DRIVE));
googleAccountCredential.setSelectedAccountName(Arrays.asList(DriveScopes.DRIVE).get(0));
//startActivityForResult(googleAccountCredential.newChooseAccountIntent(), REQUEST_ACCOUNT_PICKER);
driveService = getDriveService(googleAccountCredential);
之后,我試圖獲取文件列表:
private List<File> retrieveAllFiles(Drive service) throws IOException {
List<File> result = new ArrayList<File>();
Files.List request = service.files().list().setQ("trashed = false");
this.logMessage("Attempting to get files");
this.logMessage("Size of reply is: "+request.size());
do {
try {
FileList files = request.execute();
result.addAll(files.getItems());
request.setPageToken(files.getNextPageToken());
this.logMessage("Got files. Size is: " + result.size());
} catch (IOException e) {
this.logMessage("Error: " + e);
request.setPageToken(null);
}
} while (request.getPageToken() != null &&
request.getPageToken().length() > 0);
return result;
}
這是它給出的錯誤:
Process: com.some.package, PID: 12439
java.lang.IllegalArgumentException: the name must not be empty: null
at android.accounts.Account.<init>(Account.java:48)
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 com.some.package.Thing.DriveManager.retrieveAllFiles(DriveManager.java:144)
at com.some.package.Thing.DriveManager.loadAccount(DriveManager.java:121)
at com.some.package.Thing.DriveManager.onCreateView(DriveManager.java:95)
at android.app.Fragment.performCreateView(Fragment.java:2053)
at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:894)
at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1067)
at android.app.BackStackRecord.run(BackStackRecord.java:834)
at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1452)
at android.app.FragmentManagerImpl$1.run(FragmentManager.java:447)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5289)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:904)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:699)
我忘記了到底是哪里錯了,所以以我的方式列出了整個過程。
首先檢查SharedPrefrences
是否有一個帳戶
SharedPreferences settings = fragment.getActivity().getPreferences(Context.MODE_PRIVATE);
googleAccountCredential = GoogleAccountCredential.usingOAuth2(
fragment.getActivity().getApplicationContext(), Arrays.asList(SCOPES))
.setBackOff(new ExponentialBackOff())
.setSelectedAccountName(settings.getString(PREF_ACCOUNT_NAME, null));
如果沒有帳戶,則settings.getString(PREF_ACCOUNT_NAME
返回的名稱為null。
因此調用帳戶選擇方法
private void chooseAccount() {
fragment.getActivity().startActivityForResult(googleAccountCredential.newChooseAccountIntent(), REQUEST_ACCOUNT_PICKER);
}
在onActivityResult
我們進行檢查。
if (resultCode == Activity.RESULT_OK && data != null &&
data.getExtras() != null) {
String accountName =
data.getStringExtra(AccountManager.KEY_ACCOUNT_NAME);
if (accountName != null) {
credential.setSelectedAccountName(accountName);
SharedPreferences settings =
getPreferences(Context.MODE_PRIVATE);
SharedPreferences.Editor editor = settings.edit();
editor.putString(PREF_ACCOUNT_NAME, accountName);
editor.commit();
}
}
現在,您擁有所需的帳戶,但必須對其進行授權。
除了列出文件,使用上面列出的方法外,我沒有發現其他啟動授權活動的方法,但是嘗試會有所不同。
您還需要抓住
catch (UserRecoverableAuthIOException e){
fragment.getActivity().startActivityForResult(e.getIntent(),
REQUEST_AUTHORIZATION);
}
之后,您的應用應該可以完全訪問Google雲端硬盤。
如果您仍然遇到問題,請檢查此鏈接
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.