我在 google 中创建了服务帐户以访问和上传融合表中的数据。我能够使用 OAuth 进行身份验证并将数据推送到服务帐户的融合表中。但是当我尝试使用地图中的 tableid 访问同一个表时我无法访问相同的。创建的表未显示在我的主帐户中。我在 stackoverflow 中读到了一些问题,他们谈到了给予 FT 的许可(我什至做不到)
我的代码:
/
*
* Copyright (c) 2012 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
* in compliance with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software distributed under the License
* is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
* or implied. See the License for the specific language governing permissions and limitations under
* the License.
*/
package com.google.api.services.samples.fusiontables.cmdline;
import com.google.api.client.auth.oauth2.Credential;
import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
import com.google.api.client.http.HttpTransport;
import com.google.api.client.http.javanet.NetHttpTransport;
import com.google.api.client.json.JsonFactory;
import com.google.api.client.json.jackson2.JacksonFactory;
import com.google.api.client.util.DateTime;
import com.google.api.services.drive.Drive;
import com.google.api.services.drive.DriveScopes;
import com.google.api.services.drive.Drive.Permissions;
import com.google.api.services.drive.model.Permission;
import com.google.api.services.fusiontables.Fusiontables;
import com.google.api.services.fusiontables.Fusiontables.Query.Sql;
import com.google.api.services.fusiontables.Fusiontables.Table.Delete;
import com.google.api.services.fusiontables.FusiontablesScopes;
import com.google.api.services.fusiontables.model.Column;
import com.google.api.services.fusiontables.model.Sqlresponse;
import com.google.api.services.fusiontables.model.Table;
import com.google.api.services.fusiontables.model.TableList;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.UUID;
/**
* @author Christian Junk
*
*/
public class FusionTablesSample {
/** E-mail address of the service account. */
private static final String SERVICE_ACCOUNT_EMAIL = "XXXXXXXXXXXXXX@developer.gserviceaccount.com";
/** Global instance of the HTTP transport. */
private static final HttpTransport HTTP_TRANSPORT = new NetHttpTransport();
/** Global instance of the JSON factory. */
private static final JsonFactory JSON_FACTORY = new JacksonFactory();
private static Fusiontables fusiontables;
/** Authorizes the installed application to access user's protected data. */
private static Credential authorizeNew() throws Exception {
// Build service account credential.
GoogleCredential credential = new GoogleCredential.Builder().setTransport(HTTP_TRANSPORT)
.setJsonFactory(JSON_FACTORY)
.setServiceAccountId(SERVICE_ACCOUNT_EMAIL)
.setServiceAccountScopes(FusiontablesScopes.FUSIONTABLES)
.setServiceAccountPrivateKeyFromP12File(new File("key.p12"))
.build();
return credential;
}
/** Authorizes the installed application to access user's protected data. */
private static Credential authorizeNewDrive() throws Exception {
GoogleCredential credential = new GoogleCredential.Builder().setTransport(HTTP_TRANSPORT)
.setJsonFactory(JSON_FACTORY)
.setServiceAccountId(SERVICE_ACCOUNT_EMAIL)
.setServiceAccountScopes(DriveScopes.DRIVE)
.setServiceAccountPrivateKeyFromP12File(new File("key.p12"))
.build();
return credential;
}
/**
* Insert a new permission.
*
* @param service Drive API service instance.
* @param fileId ID of the file to insert permission for.
* @param value User or group e-mail address, domain name or {@code null}
"default" type.
* @param type The value "user", "group", "domain" or "default".
* @param role The value "owner", "writer" or "reader".
* @return The inserted permission if successful, {@code null} otherwise.
*/
private static Permission insertPermission(Drive service, String fileId,
String value, String type, String role) {
Permission newPermission = new Permission();
newPermission.setValue(value);
newPermission.setType(type);
newPermission.setRole(role);
try {
System.out.println("service"+service.permissions());
return service.permissions().insert(fileId, newPermission).execute();
} catch (IOException e) {
System.out.println("An error occurred: " + e);
}
return null;
}
/** Global Drive API client. */
private static Drive drive;
public static void main(String[] args) {
try {
try {
// System.out.println(System.getProperty("user.home"));
// authorization
Credential credential = authorizeNew();
Credential credential1 = authorizeNewDrive();
// set up global FusionTables instance
fusiontables = new Fusiontables.Builder(
HTTP_TRANSPORT, JSON_FACTORY, credential).setApplicationName(
"FusionTable").build();
// set up the global Drive instance
drive = new Drive.Builder(HTTP_TRANSPORT, JSON_FACTORY, credential1).setApplicationName(
"FusionTable").build();
System.out.println(drive.files().list());
Permissions perms=drive.permissions();
System.out.println(perms);
// run commands
// listTables();
ArrayList<String> list=listTables("");
// String tableId = createTable();
// insertData(tableId);
for(String tableid:list)
{
insertPermission(drive, tableid, "XXXXXXXXX@gmail.com","anyone","owner");
// System.out.print(" permission for table id is " + perms.list(tableid));
showRows(tableid);
// deleteTable(tableid);
}
listTables();
// deleteTable(tableId);
// success!
return;
} catch (IOException e) {
System.err.println(e.getMessage());
}
} catch (Throwable t) {
t.printStackTrace();
}
System.exit(1);
}
/**
* @param tableId
* @throws IOException
*/
private static void showRows(String tableId) throws IOException {
View.header("Start Showing Rows From Table");
Sql sql = fusiontables.query().sql("SELECT Text,Number,Location,Address,Date FROM " + tableId);
try {
Sqlresponse response= sql.execute();
System.out.println( response.getColumns());
System.out.println( response.getRows());
} catch (IllegalArgumentException e) {
// For google-api-services-fusiontables-v1-rev1-1.7.2-beta this exception will always
// been thrown.
// Please see issue 545: JSON response could not be deserialized to Sqlresponse.class
// http://code.google.com/p/google-api-java-client/issues/detail?id=545
}
View.header("End Showing Rows From Table");
}
/** List tables for the authenticated user. */
private static void listTables() throws IOException {
View.header("Listing My Tables");
// Fetch the table list
Fusiontables.Table.List listTables = fusiontables.table().list();
TableList tablelist = listTables.execute();
if (tablelist.getItems() == null || tablelist.getItems().isEmpty()) {
System.out.println("No tables found!");
return;
}
for (Table table : tablelist.getItems()) {
View.show(table);
View.separator();
}
}
private static ArrayList<String> listTables(String a) throws IOException {
View.header("Listing My Tables");
ArrayList<String> rt=new ArrayList<String>();
// Fetch the table list
Fusiontables.Table.List listTables = fusiontables.table().list();
TableList tablelist = listTables.execute();
if (tablelist.getItems() == null || tablelist.getItems().isEmpty()) {
System.out.println("No tables found!");
return rt;
}
for (Table table : tablelist.getItems()) {
rt.add(table.getTableId());
View.show(table);
View.separator();
}
return rt;
}
/** Create a table for the authenticated user. */
private static String createTable() throws IOException {
View.header("Create Sample Table");
// Create a new table
Table table = new Table();
table.setName(UUID.randomUUID().toString());
table.setIsExportable(true);
table.setDescription("Sample Table");
// Set columns for new table
table.setColumns(Arrays.asList(new Column().setName("Text").setType("STRING"),
new Column().setName("Number").setType("NUMBER"),
new Column().setName("Location").setType("LOCATION"),
new Column().setName("Address").setType("STRING"),
new Column().setName("Date").setType("DATETIME")));
// Adds a new column to the table.
Fusiontables.Table.Insert t = fusiontables.table().insert(table);
Table r = t.execute();
View.show(r);
return r.getTableId();
}
/** Inserts a row in the newly created table for the authenticated user. */
private static void insertData(String tableId) throws IOException {
Sql sql = fusiontables.query().sql("INSERT INTO " + tableId + " (Text,Number,Location,Address,Date) "
+ "VALUES (" + "'Google Inc', " + "1, " + "'22.816694,70.850418', " + "'1600 Amphitheatre Parkway Mountain View, "
+ "CA 94043, USA','" + new DateTime(new Date()) + "')");
try {
sql.execute();
} catch (IllegalArgumentException e) {
// For google-api-services-fusiontables-v1-rev1-1.7.2-beta this exception will always
// been thrown.
// Please see issue 545: JSON response could not be deserialized to Sqlresponse.class
// http://code.google.com/p/google-api-java-client/issues/detail?id=545
e.printStackTrace();
}
}
/** Deletes a table for the authenticated user. */
private static void deleteTable(String tableId) throws IOException {
View.header("Delete Sample Table");
// Deletes a table
Delete delete = fusiontables.table().delete(tableId);
delete.execute();
}
}