在后台服务中连接到Google API Java客户端

时间:2016-10-27 12:20:58

标签: android google-drive-api google-drive-android-api

我正在尝试开发一款应用,其中我使用Google云端硬盘在service上传和共享文件。但问题是共享链接具有private访问权限。我想更改anyone with link的访问权限。为了实现这一点,我正在使用Google Drive REST API,但是当我执行代码时似乎没有任何事情发生。这是我的代码:

public void changePermissionSettings(String resourceId) throws GeneralSecurityException, IOException, URISyntaxException {

        com.google.api.services.drive.Drive driveService = getDriveService();

        JsonBatchCallback<Permission> callback = new JsonBatchCallback<com.google.api.services.drive.model.Permission>() {
            @Override
            public void onFailure(GoogleJsonError e, HttpHeaders responseHeaders) throws IOException {
                Log.e("upload", "Permission Setting failed");
            }

            @Override
            public void onSuccess(com.google.api.services.drive.model.Permission permission, HttpHeaders responseHeaders) throws IOException {
                Log.e("upload", "Permission Setting success");
            }
        };

        final BatchRequest batchRequest = driveService.batch();

        com.google.api.services.drive.model.Permission contactPermission = new com.google.api.services.drive.model.Permission()
                .setType("anyone")
                .setRole("reader");
        driveService.permissions().create(resourceId, contactPermission)
                .setFields("id")
                .queue(batchRequest, callback);

        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    batchRequest.execute();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }).start();
    }


    private com.google.api.services.drive.Drive getDriveService() throws GeneralSecurityException,
            IOException, URISyntaxException {

        Collection<String> elenco = new ArrayList<>();
        elenco.add("https://www.googleapis.com/auth/drive");

        GoogleAccountCredential credential = GoogleAccountCredential.usingOAuth2(this, elenco)
                .setSelectedAccountName(getAccountName());

        return new com.google.api.services.drive.Drive.Builder(
                AndroidHttp.newCompatibleTransport(), new JacksonFactory(), credential).build();
    }

我在这里有两个问题:

  1. 同时使用Google Drive Android API和Google Drive REST API是对的吗?

  2. 如何将文件的权限设置从private更改为anyone with linkDocumentation提及Authorization happens in response to receiving an error when sending a request.如何在service ??

  3. 中实现这一目标

1 个答案:

答案 0 :(得分:0)

“同时使用Google Drive Android API和Google Drive REST API是否正确?”

如上所述here,这是可能的。 “只看这个Lifecycle of a Drive file,你可以想象你的应用程序位于该图片(Android应用程序)和底部的REST API(驱动服务)之上。” < / p>

  

但要记住以下几点:

     
      
  1. GDAA的主要标识符DriveId仅存在于GDAA(GooPlaySvcs)中,并且不存在于REST Api中。您必须检索“ResourceId”,它是REST Api中的主要标识符(请参阅SO 29030110)。

  2.   
  3. 只有在GDAA提交(上传)文件/文件夹后才能从DriveId获取ResourceId(参见SO 22874657

  4.   
  5. 由于GDAA会根据自己的时间表(系统优化)缓存网络请求,因此会遇到很多时间问题,而REST Api会让您的应用控制等待响应。一般来说,如果你扫描这些SO questions,你会发现很多关于这些问题的喋喋不休(虽然这很麻烦)。

  6.         

    我为GDAAREST API维护了一个最小的CRUD包装器,如果你合并它们可以帮助你(两者中的MainActivity几乎相同,并且CRUD方法具有相同的签名)。

“如何将文件的权限设置从private更改为anyone with link ?? Documentation提及Authorization happens in response to receiving an error when sending a request.如何在服务中实现?”

根据此thread,您必须设置以下permissions

private Permission insertPermission(Drive service, String fileId) throws Exception{
   Permission newPermission = new Permission();
   newPermission.setType("anyone");
   newPermission.setRole("reader");
   newPermission.setValue("");
   newPermission.setWithLink(true);
   return service.permissions().insert(fileId, newPermission).execute();
}

您还可以查看以下链接:Google Drive SDK - change item sharing permissions