簡體   English   中英

Android Google Drive Api令牌錯誤

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM