0

我在 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();
  }
}

4

2 回答 2

0

我在 stackoverflow 中读到了一些问题,他们谈到了给予 FT 的许可(我什至做不到)

您的代码已经包含它。看看你的 insertPermission() 方法。复制粘贴的奇迹... :)

根据 Google Maps 文档,您只能在地图上显示以“公共”或“未列出”形式共享的融合表。来源:https ://developers.google.com/maps/documentation/javascript/layers#FusionTablesSetup

要实现这一点,请使用角色“reader”在您的表上设置权限并输入“anyone”。有关更多信息和 java 示例,请参阅:https ://developers.google.com/drive/v2/reference/permissions/insert

于 2012-12-21T09:59:48.090 回答
0

Java 对我来说是希腊语……发布通用 FT Java 模块有什么意义?我在这里看不到任何 Google 地图代码,甚至看不到您尝试访问的表格 ID。使用 UI 到达您的餐桌:

https://www.google.com/fusiontables/DataSource?docid=[编码表ID]

在共享设置中,选择“在网络上公开”或“任何有链接的人”。现在应该可以通过 Google Maps javascript API 访问它了。

于 2012-12-21T01:29:05.267 回答