Google地图上的Fusion Tables v2 POI:Android示例?

时间:2017-01-28 18:00:11

标签: java android google-maps-api-3 google-fusion-tables google-api-client

我正在寻找一个关于如何在谷歌地图上显示兴趣点(保存在融合表中)的示例。

要在html和javascript中执行此操作,这非常简单,请查看我的javascript map with fusion tables example

请参阅Fusion Tables page containing my POIs

我的目标/问题是如何(在编码方面需要帮助)在Android应用中实现相同目标。我是Android开发的新手,我已经投入了数小时的基础知识和检查文档和示例。

检查这个非常好Google Maps example for Android我发现它已经开始了(我的测试应用基于此代码)。

Fusion Tables v2 reference(指向谷歌api客户端)

Google API Java client samples on github(最过时的:v1上的例子)

到目前为止,我已经实现了以我最后一个已知位置为中心显示地图并在其上显示标记。

因为我找不到好的例子,所以我决定发布并分享我的发现,请参阅:firepol / android-google-maps-fusion-tables on github

现在我想显示来自融合表的标记。 我坚持执行请求,我试图通过谷歌api客户端。

Google API client example for Android

ActivityFeed feed = listActivities.execute();

这是我的代码(我把它放在onCreate中):

protected void prepareFusion() {
    // Normally READONLY should be enough (see credential with one scope), but I checked online a console
    // and I could see a public table only if I would grant both permissions
    List<String> scopes = new ArrayList<>(Arrays.asList(FusiontablesScopes.FUSIONTABLES, FusiontablesScopes.FUSIONTABLES_READONLY));
    credential = GoogleAccountCredential.usingOAuth2(this, scopes);
    //credential = GoogleAccountCredential.usingOAuth2(this, Collections.singleton(FusiontablesScopes.FUSIONTABLES_READONLY));

    // TODO : get account name automatically
    // http://stackoverflow.com/questions/35789071/getting-the-gmail-id-of-the-user-in-android-6-0-marshmallow
    credential.setSelectedAccountName("YOUR_GOOGLE_ACCOUNT");

    client = new Fusiontables.Builder(
            transport, jsonFactory, credential).setApplicationName("TestMap/1.0")
            .build();

    try {
        String tableId = "1774o_WcrqSQlepLXlz1kgH_01NpCJ-6OyId9Pm1J";

        Fusiontables.Query.Sql sql = client.query().sql("SELECT FileName,Name,Location FROM " + tableId);
        //sql.execute();
        //java.lang.IllegalStateException: Calling this from your main thread can lead to deadlock

        Fusiontables.Table.Get table = client.table().get(tableId);
        table.setFields("items(FileName,Name,Location)");
        //table.execute();

        // TODO : can't execute like this on main thread as the documentation example "suggests"
        //https://developers.google.com/api-client-library/java/google-api-java-client/android

    } catch (IOException e) {
        e.printStackTrace();
    }
}

如果我尝试做同样的事情并调用sql.execute()或table.execute(),我得到:

  

java.lang.IllegalStateException:从主线程调用它   会导致死锁

所以我有点卡在这里,我想知道如何从有谷歌api客户端经验的人那里继续,如果你能帮助我在地图上得到结果,那就更好了!谢谢。

如何在地图上显示融合表POI?

@Override
public void onMapReady(GoogleMap googleMap) {
    mMap = googleMap;

    // Add a marker to Zurich Oerlikon and move the camera
    mMap.addMarker(new MarkerOptions().position(mDefaultLatLng).title("Zurich Oerlikon"));
    mMap.animateCamera(CameraUpdateFactory.newLatLngZoom(
            mDefaultLatLng, 13));

    // TODO: add fusion tables POIs
}

要查看我被困在哪里并帮助我,请克隆我的github repo firepol / android-google-maps-fusion-tables on github,在Android Studio中打开它,添加您自己的Google Maps API密钥并在您的设备上进行调试。感谢您的建设性意见,答案和帮助。随意推送github。

2 个答案:

答案 0 :(得分:0)

在Android网络中,调用永远不会在UI /主线程上进行。

如果您只想查看工作内容,请尝试使用异步任务;如果您正在开发完整项目,请尝试导入网络库,例如volley / robospice。

答案 1 :(得分:0)

This commit implements the fusion tables query and shows the resulting POIs on google maps

说明:GoogleAccountCredential错误,必须更换为GoogleCredential。要完成这项工作,您需要create a service account,角色项目&gt;服务帐户参与者(生成私钥),下载json文件并将其放在 app / res / raw / service_account_credentials.json 下(在我的提交中,我用这个精确的方式引用这个文件)名称,但随意命名并根据您的需要调整代码。)

确保在项目的API管理器中启用Fusion Tables API

我还实现了一个派生自AsyncTask的类来解决主线程的问题。

提交中有一些小的重构(位置已更改为LatLng),但这就是它。

谁需要制作一个Android应用程序并在谷歌地图上放置融合表POI可以克隆github仓库并开始使用(这也是我的问题的最初想法)。