0

我对谷歌文档有疑问。我想使用 OAuth 2.0 检索您的所有文件。问题是,一旦你这样做了,尝试下载文件时的授权会给我这个错误:

Exception in thread "main" java.lang.NullPointerException
at GoogleBlack.readUrl(GoogleBlack.java:95)
at GoogleBlack.getDocument(GoogleBlack.java:87)
at GoogleBlack.go(GoogleBlack.java:187)
at GoogleBlack.main(GoogleBlack.java:222)

这是我使用的代码

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.URL;
import java.util.Arrays;
import java.util.List;

import com.google.api.client.auth.oauth2.Credential;
import com.google.api.client.googleapis.auth.oauth2.GoogleAuthorizationCodeRequestUrl;
import com.google.api.client.googleapis.auth.oauth2.GoogleAuthorizationCodeTokenRequest;
import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
import com.google.api.client.googleapis.auth.oauth2.GoogleTokenResponse;
import com.google.api.client.http.HttpTransport;
import com.google.api.client.http.javanet.NetHttpTransport;
import com.google.api.client.json.jackson.JacksonFactory;
import com.google.gdata.client.GoogleService;
import com.google.gdata.client.GoogleAuthTokenFactory.UserToken;
import com.google.gdata.client.docs.DocsService;
import com.google.gdata.data.MediaContent;
import com.google.gdata.data.docs.DocumentListEntry;
import com.google.gdata.data.docs.DocumentListFeed;
import com.google.gdata.data.media.MediaSource;
import com.google.gdata.util.ServiceException;

public class GoogleBlack {

private static final String APPLICATION_NAME = "Homework";
public DocsService service;
public GoogleService spreadsheetsService;
static String CLIENT_ID = "***********";
static String CLIENT_SECRET = "**************";
static String REDIRECT_URI = "urn:ietf:wg:oauth:2.0:oob";
static List<String> SCOPES = Arrays.asList("https://docs.google.com/feeds");

public void getSpreadSheet(String id, String i, String ids, String type) throws Exception {
    UserToken docsToken = (UserToken) service.getAuthTokenFactory()
            .getAuthToken();
    UserToken spreadsheetsToken = (UserToken) spreadsheetsService
            .getAuthTokenFactory().getAuthToken();
    service.setUserToken(spreadsheetsToken.getValue());

    URL url = null;

    if(type.equals("doc"))
    {
        url = new URL("https://docs.google.com/feeds/download/documents/Export?id="+ ids);
    }

    else
    {
         url = new URL("https://docs.google.com/feeds/download/spreadsheets/Export?key="+ ids +"&exportFormat="+ type + "&gid=0");
         i += ".xls";
    }

    System.out.println("Spred = " + url.toString());

    readUrl1(url.toString(), i, type);
    service.setUserToken(docsToken.getValue());
}

public void readUrl1(String url, String i, String type) throws IOException, ServiceException
{
     MediaContent mc = new MediaContent();
     mc.setUri(url);
     MediaSource ms = service.getMedia(mc);   

     System.out.println("Name: "+i);
     BufferedInputStream bin = new BufferedInputStream(ms.getInputStream());
     OutputStream out = new FileOutputStream(i);
     BufferedOutputStream bout = new BufferedOutputStream(out);

     while (true) {
       int datum = bin.read();
       if (datum == -1)
         break;
       bout.write(datum);
     }
     bout.flush();
}

public void getDocument(String id, String i) throws Exception {
    URL url = new URL(id);
    readUrl(url,i);
}

public void readUrl(URL url, String i) throws Exception {
    MediaContent mc = new MediaContent();
    mc.setUri(url.toString());
    System.out.println("Url "+ url.toString());
    System.out.println("MC: " + mc.toString());
    MediaSource ms = service.getMedia(mc);   

    System.out.println("Name: "+i);
    BufferedInputStream bin = new BufferedInputStream(ms.getInputStream());
    OutputStream out = new FileOutputStream(i);
    BufferedOutputStream bout = new BufferedOutputStream(out);

    while (true) {
      int datum = bin.read();
      if (datum == -1)
        break;
      bout.write(datum);
    }
    bout.flush();






 //     FileOutputStream fout = null;
 //     fout = new FileOutputStream(i);
//      fout.write(cbuf.);
//        fout.close();

}

static Credential getCredentials() {
    HttpTransport transport = new NetHttpTransport();
    JacksonFactory jsonFactory = new JacksonFactory();

    // Step 1: Authorize -->
    String authorizationUrl =
        new GoogleAuthorizationCodeRequestUrl(CLIENT_ID, REDIRECT_URI, SCOPES).build();

    // Point or redirect your user to the authorizationUrl.
    System.out.println("Go to the following link in your browser:");
    System.out.println(authorizationUrl);

    // Read the authorization code from the standard input stream.
    BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
    System.out.println("What is the authorization code?");
    String code = null;
    try {
        code = in.readLine();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    // End of Step 1 <--

    // Step 2: Exchange -->
    GoogleTokenResponse response = null;
    try {
        response = new GoogleAuthorizationCodeTokenRequest(transport, jsonFactory, CLIENT_ID, CLIENT_SECRET,
            code, REDIRECT_URI).execute();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    // End of Step 2 <--

    // Build a new GoogleCredential instance and return it.
    return new GoogleCredential.Builder().setClientSecrets(CLIENT_ID, CLIENT_SECRET)
        .setJsonFactory(jsonFactory).setTransport(transport).build()
        .setAccessToken(response.getAccessToken()).setRefreshToken(response.getRefreshToken());
  }

public void go() throws Exception {


    DocsService service = new DocsService(APPLICATION_NAME);
    service.setOAuth2Credentials(getCredentials());

    URL feedUrl = new URL("https://docs.google.com/feeds/default/private/full/");

    DocumentListFeed feed = service.getFeed(feedUrl, DocumentListFeed.class);

    System.out.println("Feed " + feed.getEntries().size());

    for(int i = 0; i < feed.getEntries().size(); i++)
    {

            DocumentListEntry entry = feed.getEntries().get(i);
            if(entry.getType().equals("file"))
            {
                MediaContent mc1 = (MediaContent) entry.getContent();
                String UrlForDownload = mc1.getUri();
                System.out.println("Type is: " + entry.getType());
                System.out.println("File Name is: " + entry.getTitle().getPlainText());
                System.out.println("URL "+ UrlForDownload);

                getDocument(UrlForDownload, entry.getFilename());
            }

            else
            {
                MediaContent mc1 = (MediaContent) entry.getContent();
                String UrlForDownload = mc1.getUri();
                System.out.println("URL "+ UrlForDownload);
                System.out.println("Type is: " + entry.getType());
                System.out.println("File Name is: " + entry.getTitle().getPlainText());

                if(entry.getTitle().getPlainText().equals("Web Design 2011/2012 - Материали"))
                {
                    continue;
                }

                if(entry.getType().equals("spreadsheet"))
                {
                    String name = entry.getTitle().getPlainText().replaceAll(" ", "");
                    System.out.println("name: " + name);
                    getSpreadSheet(UrlForDownload, name, entry.getDocId(),"xls");
                }
                else
                {
                    String name = entry.getTitle().getPlainText().replaceAll(" ", "");
                    System.out.println("name: " + name);
                    getSpreadSheet(UrlForDownload, name, entry.getDocId(),"doc");
                }
            }
    }

}

public static void main(String[] args) throws Exception {

    new GoogleBlack().go();

}

}

第 95 行 - MediaSource ms = service.getMedia(mc);

87 行 - readUrl(url,i);

第187行-​​getDocument(UrlForDownload,entry.getFilename());

222 行 - 新的 GoogleBlack().go();

如果我没有得到很好的解释,我深表歉意!!!

4

1 回答 1

1

您从未初始化“公共 DocsService 服务”;您的 GoogleBlack 课程的成员,因此当您调用“service.getMedia(mc);”时 你得到一个 NullPointerException。

于 2012-07-10T18:24:16.103 回答