4

私はグーグルドライブSDKで言及されたすべてのステップに従いました。デバイス(android、ジェリービーンズを実行)でサンプルアプリケーションを作成し、ドライブにファイルをアップロードできます。同じファイルをダウンロードしようとすると、fileID、fileTitle、fileDownloadURLなどのメタデータを取得できますが、コンテンツをダウンロードできません。401Unauthorizedエラーが発生します。

私のアプリのAUTHSCOPEはAUTH_TOKEN_TYPE="oauth2:https ://www.googleapis.com/auth/drive.file ";

OAUTHトークンを取得するために次のことを行っています。

AccountManager am = AccountManager.get(this);
        Bundle options = new Bundle();
        am.getAuthToken(
                mAccount,                               
                AUTH_TOKEN_TYPE,                        
                options,                                
                this,                                   
                new OnTokenAcquired(),                  
                new Handler(){
                    @Override
                    public void handleMessage(Message msg) {
                        invadiateToken();                       
                        super.handleMessage(msg);
                    }
                });  

トークンに基づいて、これは私がドライブオブジェクトを構築する方法です

Drive buildService(final String AuthToken) {
    HttpTransport httpTransport = new NetHttpTransport();
    JacksonFactory jsonFactory = new JacksonFactory();

    Drive.Builder b = new Drive.Builder(httpTransport, jsonFactory, null);
    b.setJsonHttpRequestInitializer(new JsonHttpRequestInitializer() {

        @Override
        public void initialize(JsonHttpRequest request) throws IOException {
            DriveRequest driveRequest = (DriveRequest) request;
            driveRequest.setPrettyPrint(true);
            driveRequest.setKey(API_KEY);
            driveRequest.setOauthToken(AuthToken);
        }
    });

    return b.build();
}

次のコードを使用してファイルをアップロードできます。

private void uploadLocalFileToDrive(Drive service) throws IOException{

        // File's metadata.
        String mimeType = "text/plain";
        File body = new File();
        body.setTitle("myText.txt");
        body.setDescription("sample app by varun");
        body.setMimeType("text/plain");

        // File's content.
        java.io.File fileContent = new java.io.File(mInternalFilePath);
        FileContent mediaContent = new FileContent(mimeType, fileContent);

        service.files().insert(body, mediaContent).execute();

    }

このアプリによってアップロードされた同じファイルをダウンロードしようとするとHttpResponse resp = service.getRequestFactory().buildGetRequest(url).execute()、次のコードスニペットからこの行で401の不正なエラーが発生します

private void downloadFileFromDrive(Drive service) throws IOException {
        Files.List request;
            request = service.files().list();
            do {
                FileList files = request.execute(); 
                for(File file:files.getItems()){
                    String fieldId = file.getId();
                    String title = file.getTitle();
                    Log.e("MS", "MSV::  Title-->"+title+"  FieldID-->"+fieldId+" DownloadURL-->"+file.getDownloadUrl());
                    if (file.getDownloadUrl() != null && file.getDownloadUrl().length() > 0 ) {
                        GenericUrl url = new GenericUrl(file.getDownloadUrl());
                        HttpResponse resp = service.getRequestFactory().buildGetRequest(url).execute();
                        InputStream isd = resp.getContent();
                        Log.e("MS", "MSV:: FileOutPutStream--->"+getFilesDir().getAbsolutePath()+"/downloaded.txt");

                    } else {
                        Log.e("MS", "MSV:: downloadURL for this file is null");
                    }
                }
                request.setPageToken(files.getNextPageToken());
            } while (request.getPageToken()!=null && request.getPageToken().length()>0);
    }

誰かが私を助けて、私が間違っていることを教えてもらえますか?

4

3 に答える 3

6

これは既知の問題であり、 Google Play サービスAPIのリリースで解決される予定です。

アプリケーションはhttps://www.googleapis.com/auth/drive.fileスコープに対して承認されており、ダウンロード エンドポイントは?key=クエリ パラメータをサポートしていないため、どのプロジェクトがリクエストを発行しているかをサーバーが知る方法はありません (アプリがこのファイルのコンテンツを読み取る権限を持っていることを確認するため)。 .

それまでの間、私が推奨できる唯一の回避策は、広い範囲を使用することです: https://www.googleapis.com/auth/drive. アプリケーションを開発し、Google Play Services がリリースされるのを待っている間は、それのみを使用してください。

Android で新しい Authorization API をどのように使用できるようになるかについて詳しく知るには、次の 2 つの Google I/O トークに興味があるかもしれません: Web APIを 使用する Android アプリケーションの構築と Android用の効率的なドライブ アプリの記述

于 2012-07-17T16:19:08.300 に答える
2

この質問と、関連する Drive on Android のすべての質問にここで回答しました。

Android Google ドライブ SDK との間でファイルを開いたり保存したりします

その回答では、Googleドライブからファイルをダウンロードするために使用した方法のコードを投稿しました(次のコード自体が明確でない場合は、リンクした完全な回答を見てください。)

private java.io.File downloadGFileToJFolder(Drive drive, String token, File gFile, java.io.File jFolder) throws IOException {
    if (gFile.getDownloadUrl() != null && gFile.getDownloadUrl().length() > 0 ) {
        if (jFolder == null) {
            jFolder = Environment.getExternalStorageDirectory();
            jFolder.mkdirs();
        }
        try {

            HttpClient client = new DefaultHttpClient();
            HttpGet get = new HttpGet(gFile.getDownloadUrl());
            get.setHeader("Authorization", "Bearer " + token);
            HttpResponse response = client.execute(get);

            InputStream inputStream = response.getEntity().getContent();
            jFolder.mkdirs();
            java.io.File jFile = new java.io.File(jFolder.getAbsolutePath() + "/" + getGFileName(gFile)); // getGFileName() is my own method... it just grabs originalFilename if it exists or title if it doesn't.
            FileOutputStream fileStream = new FileOutputStream(jFile);
            byte buffer[] = new byte[1024];
            int length;
            while ((length=inputStream.read(buffer))>0) {
                fileStream.write(buffer, 0, length);
            }
            fileStream.close();
            inputStream.close();
            return jFile;
        } catch (IOException e) {        
            // Handle IOExceptions here...
            return null;
        }
    } else {
        // Handle the case where the file on Google Drive has no length here.
        return null;
    }
}
于 2012-09-26T16:59:16.397 に答える