2012-12-18 90 views
0

我正在使用應用程序擁有帳戶來創建文件。但是,我希望文件的所有權轉移給其他用戶。下面的代碼工作,但權限設置被忽略,所以我不是該文件的所有者。文件所有權保留在應用程序擁有賬戶中,因此無法永久刪除文件。創建文件時忽略權限設置

public File uploadEmptyFile(String title, String subFolderName, String mimetype) throws GDriveAccessException { 
    File fileMetadata = new File(); 
    fileMetadata.setTitle(title); 
    fileMetadata.setMimeType(mimetype); 
    Permission newPermission = new Permission(); 

    newPermission.setValue("[email protected]"); 
    newPermission.setType("user"); 
    newPermission.setRole("owner"); 

    fileMetadata.setUserPermission(newPermission); 
    if (subFolderName==null){ 
     fileMetadata.setParents(Arrays.asList(new ParentReference().setId(FOLDER_ID))); 
    }else{ 
     fileMetadata.setParents(Arrays.asList(new ParentReference().setId(getFileIdByFolderNName(null,subFolderName)))); 
    } 


    File faux=null; 
    try { 
     faux= getDrive().files().insert(fileMetadata).execute(); 
     return faux; 
    } catch (IOException e1) { 
    throw new GDriveAccessException(e1); 
    } 

    } 

任何幫助確定權限設置被忽略的原因是值得歡迎的。

回答

0

您需要使用permissions.insert,如sharing and permissions文檔中所述。

+0

我收到出錯:com.google.api.client.googleapis.json.GoogleJsonResponseException:500 { 「代碼」:500, 「錯誤」:[{ 「域」: 「全局」, 「message」:「Internal Error」, 「reason」:「internalError」 }], 「message」:「Internal Error」 }是否可以將所有權轉移出域?如果是這樣,則不存在解決方案,因爲應用程序專用帳戶始終是@ developer.gserviceaccount.com – lanzalibre

0

嗯,首先,我發現問題是所有權無法在常規的谷歌應用程序帳戶中更改。您需要有一個高級許可證來傳輸文件所有權。

其次,我發現,我居然neeeded是模擬:

public static Drive getDrive() throws GDriveAccessException { 
    if(drive == null) { 
     HttpTransport httpTransport = new UrlFetchTransport(); 
     JacksonFactory jsonFactory = new JacksonFactory(); 
     GoogleCredential credential; 
      credential = new GoogleCredential.Builder() 
        .setTransport(httpTransport) 
        .setJsonFactory(jsonFactory) 
        .setServiceAccountId(SERVICE_ACCOUNT_EMAIL) 
        .setServiceAccountPrivateKey(getPrivateKey()) 
        .setServiceAccountScopes(DriveScopes.DRIVE) 
        .setServiceAccountUser("[email protected]")// Use this property for impersonation 
        .build(); 
     Drive service = new Drive.Builder(httpTransport, jsonFactory, null) 
      .setHttpRequestInitializer(credential).build(); 
     drive=service; 
     return service; 
    } 
    return drive; 
} 

這將是很好,有這個功能,谷歌更好的文檔。