从Google Drive使用Java获取列表文件

时间:2013-07-19 09:07:26

标签: java android google-drive-api

我正在开发一款可以从Google云端硬盘登录,下载,上传和显示列表文件的应用。

我发现了来自Google Drive SDKJava代码,但它运行速度很慢而且不起作用。

我正在阅读solution,但不知道在哪里更改该范围

我的主要活动:

        // google
        static final int REQUEST_ACCOUNT_PICKER = 1;
        static final int REQUEST_AUTHORIZATION = 2;
        static final int CAPTURE_IMAGE = 3;
        private GoogleAccountCredential credential;
        private static Uri fileUri;
        private static Drive service;

        public void onLoginGoogle(View v) {
                credential = GoogleAccountCredential.usingOAuth2(this, DriveScopes.DRIVE);
                startActivityForResult(credential.newChooseAccountIntent(), REQUEST_ACCOUNT_PICKER);
        }

        public void onUploadGoogle(View v) {
                Thread t = new Thread(new Runnable() {
                        @Override
                        public void run() {
                                try {
                                        // File's binary content
                                        java.io.File fileContent = new java.io.File("/sdcard/a.jpg");
                                        FileContent mediaContent = new FileContent("image/jpeg", fileContent);

                                        // File's metadata.
                                        com.google.api.services.drive.model.File body = new com.google.api.services.drive.model.File();
                                        body.setTitle(fileContent.getName());
                                        body.setMimeType("image/jpeg");

                                        com.google.api.services.drive.model.File file = service.files().insert(body, mediaContent).execute();
                                        if (file != null) {
                                                showToast("Photo uploaded: " + file.getTitle());
                                                // startCameraIntent();
                                        }
                                } catch (UserRecoverableAuthIOException e) {
                                        startActivityForResult(e.getIntent(), REQUEST_AUTHORIZATION);
                                } catch (IOException e) {
                                        e.printStackTrace();
                                }
                        }
                });
                t.start();
        }

        public void onDownloadGoogle(View v) {
                downloadFile();
        }

        private void downloadFile() {
                Thread thread = new Thread(new Runnable() {

                        @Override
                        public void run() {
                                try {
                                        com.google.api.services.drive.model.File file = service.files().get("0B-Iak7O9SfIpYk9zTjZvY2xreVU").execute();
                                        // FileList file = service.files().list().execute();
                                        // List<com.google.api.services.drive.model.File> fileList =
                                        // file.getItems();
                                        // com.google.api.services.drive.model.File fileItem =
                                        // fileList.get(0);
                                        // Log.d("FileID" , fileItem.getId());
                                        // Log.d("Count", "Retreived file list");
                                        if (file.getDownloadUrl() != null && file.getDownloadUrl().length() > 0) {
                                                HttpResponse resp = service.getRequestFactory().buildGetRequest(new GenericUrl(file.getDownloadUrl())).execute();
                                                InputStream inputStream = resp.getContent();
                                                // writeToFile(inputStream);
                                        }
                                } catch (IOException e) {
                                        Log.e("WriteToFile", e.toString());
                                        e.printStackTrace();
                                }
                        }
                });
                thread.start();
        }

        List<File> mGFile;

        public void onListGoogle(View v) {
                AsyncTask<Void, Void, String> task = new AsyncTask<Void, Void, String>() {

                        @Override
                        protected String doInBackground(Void... arg0) {
                                // TODO Auto-generated method stub
                                try {
                                        mGFile = retrieveAllFiles();
                                        int i = 0;
                                } catch (IOException e) {
                                        // TODO Auto-generated catch block
                                        e.printStackTrace();
                                }
                                return null;
                        }

                        protected void onPostExecute(String result) {
                                Log.d("Dolphin get glist", String.valueOf(mGFile.size()));
                        };
                };
                task.execute();
                Log.d("Dolphin counting", "aa");
        }

        private List<File> retrieveAllFiles() throws IOException {
                List<File> result = new ArrayList<File>();
                Files.List request = service.files().list();

                do {
                        try {
                                FileList files = request.execute();

                                result.addAll(files.getItems());
                                request.setPageToken(files.getNextPageToken());
                        } catch (IOException e) {
                                System.out.println("An error occurred: " + e);
                                request.setPageToken(null);
                        }
                } while (request.getPageToken() != null && request.getPageToken().length() > 0);

                return result;
        }

        private Drive getDriveService(GoogleAccountCredential credential) {
                return new Drive.Builder(AndroidHttp.newCompatibleTransport(), new GsonFactory(), credential).build();
        }

@Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {

                switch (requestCode) {
                case REQUEST_ACCOUNT_PICKER:
                        if (resultCode == RESULT_OK && data != null && data.getExtras() != null) {
                                String accountName = data.getStringExtra(AccountManager.KEY_ACCOUNT_NAME);
                                if (accountName != null) {
                                        credential.setSelectedAccountName(accountName);
                                        service = getDriveService(credential);
                                }
                        }
                        break;
                case REQUEST_AUTHORIZATION:
                        if (resultCode == Activity.RESULT_OK) {
                                // saveFileToDrive();
                                Toast.makeText(this, "Login complete", Toast.LENGTH_SHORT);
                        } else {
                                startActivityForResult(credential.newChooseAccountIntent(), REQUEST_ACCOUNT_PICKER);
                        }
                        break;
                }
        }

logcat:

"Application name is not set. Call Builder#setApplicationName."

如何从文件夹中获取文件列表?如果有一个有效的例子,那真是太棒了

2 个答案:

答案 0 :(得分:6)

它对我有用:

private List<File> sendRequest(){
    List<File> result = new ArrayList<File>();

    try{
        Files.List request = service.files().list().setQ("trashed = false");

        do{
            try{
                FileList files = request.execute();

                result.addAll(files.getItems());
                request.setPageToken(files.getNextPageToken());
            }
            catch(IOException e){
                System.out.println("An error occurred: " + e);
                request.setPageToken(null);
            }
        }
        while(request.getPageToken() != null
                && request.getPageToken().length() > 0);

    }
    catch(IOException e1){
        e1.printStackTrace();
    }

    for(File file : result){
        Log.d(TAG, "file : " + file.getTitle());
    }
    return result;
}

如果您需要特定文件夹中的文件,可以尝试此请求:

Files.List request = service.files().list().setQ("'" + folderId + "' in parents and trashed = false");

正如你所说,它很慢,但我不知道如何做得更好。

答案 1 :(得分:1)

var express = require('express')
  , request = require('request')
  , oauth = require('./oauth')
  , app = express();

// Setup middleware
app.use(express.static(__dirname));


// List out file that are in your Google Drive
app.get('/list', function(req, res) {
  // Check to see if user has an access_token first
    if (oauth.access_token) {

    // URL endpoint and params needed to make the API call
        var url = 'https://www.googleapis.com/drive/v2/files';
        var params = {
            access_token: oauth.access_token
        };

    // Send the API request
        request.get({url:url, qs:params}, function(err, resp, body) {
      // Handle any errors that may occur
      if (err) return console.error("Error occured: ", err);
            var list = JSON.parse(body);
      if (list.error) return console.error("Error returned from Google: ", list.error);

      // Generate output
            if (list.items && list.items.length > 0) {
                var file = ''
                  , iconLink = ''
                  , link = ''
                  , output = '<h1>Your Google Drive</h1><ul>';

                for(var i=0; i<list.items.length; i++) {
                    file = list.items[i].title;
                    iconLink = list.items[i].iconLink;
                    link = list.items[i].alternateLink;

                    output += '<li style="list-style-image:url('+iconLink+');"><a href="'+link+'" target="_blank">'+file+'</a></li>';
                }
                output += '</ul>';

        //Send output as response
        res.writeHead(200, {'Content-Type': 'text/html'});
                res.end(output);

            } else { // Alternate output if no files exist on Drive
                console.log('Could not retrieve any items.');

        res.writeHead(200, {'Content-Type': 'text/html'});
                res.end('<p>Your drive appears to be empty.</p>')
            }
    });
  // If no access_token was found, start the OAuth flow
    } else {
        console.log("Could not determine if user was authed. Redirecting to /");
        res.redirect('/');
    }
});

// Handle OAuth Routes
app.get('/login', oauth.login);
app.get('/callback', oauth.callback);

app.listen(process.env.OPENSHIFT_NODEJS_PORT, process.env.OPENSHIFT_NODEJS_IP);

来自runnable