Android上的百度地图:访问密钥不适用于位置搜索

时间:2014-11-20 09:27:54

标签: android

我正在为中国客户创建一个Android应用,他们需要地图集成,因此Google地图不是一个选项,因为所有Google服务都在中国被屏蔽。我正在尝试使用百度地图,这就是所谓的百度LBS(基于位置的服务)云。

获取没有叠加层工作的基本地图相对容易。 The process is described here(中文,但如果您不懂语言,代码就会说明问题)。下载最新的百度Android SDK(编写时为v3.2.0)并将其作为库集成到我的Eclipse项目中是没有问题的,但即使它是官方文档,也不要太信任该链接中的文档。他们的示例通常包含甚至无法编译的代码。例如,.jar文件的名称与您在屏幕截图中看到的完全不同。

哦,他们的.jar库也是混淆的,这对于使用起来非常烦人: - (

我需要注册一个百度帐户并转到他们的控制中心来生成一个密钥。要为移动设备创建访问密钥(“ak”),您需要输入为您的应用签名的密钥库的SHA1指纹,然后输入清单中指定的包名称。 然后我将生成的密钥添加到标签

下的清单中
<meta-data android:name="com.baidu.lbsapi.API_KEY" android:value="xxx...xxx" />

然后我从他们的示例项目的CloudSearchActivity中复制了代码,因为我有特定的坐标我想要显示。我实现了CloudListener接口,如下所示:

@Override
public void onGetSearchResult(final CloudSearchResult result, final int error)
{
    Log.w("onGetSearchResult", "status=" + result.status + ". size=" + result.size + ". total=" + result.total + ". error=" + error);
    if(null != result && null != result.poiList && 0 < result.poiList.size())
    {
      mBaiduMap.clear();
      final BitmapDescriptor bitmapDescriptor=BitmapDescriptorFactory.fromResource(R.drawable.icon_address_grey);
      LatLng latitudeLongitude;
      LatLngBounds.Builder builder=new Builder();
      for(final CloudPoiInfo info : result.poiList)
      {
        latitudeLongitude=new LatLng(info.latitude, info.longitude);
        final OverlayOptions overlayOptions=new MarkerOptions().icon(bitmapDescriptor).position(latitudeLongitude);
        mBaiduMap.addOverlay(overlayOptions);
        builder.include(latitudeLongitude);
      }
      final LatLngBounds bounds=builder.build();
      MapStatusUpdate mapStatusUpdate=MapStatusUpdateFactory.newLatLngBounds(bounds);
      mBaiduMap.animateMapStatus(mapStatusUpdate);
    }
}

我添加了代码来启动查询(也从他们的示例项目中复制):

  @Override
  public View onCreateView(final LayoutInflater layoutInflater, final ViewGroup viewGroup,
    final Bundle savedInstanceState)
  {
    // initialize needs to be called
    SDKInitializer.initialize(getApplication());
    CloudManager.getInstance().init(MyFragment.this);

    view=(ViewGroup)layoutInflater.inflate(R.layout.fragment_map, viewGroup, false);

    mMapView=(MapView)view.findViewById(R.id.baiduMapView);
    mBaiduMap=mMapView.getMap();

    NearbySearchInfo info=new NearbySearchInfo();
    info.ak="xxx...xxx";
    info.geoTableId=12345;
    info.tags="";
    info.radius=30000;
    info.location="116.403689,39.914957";
    CloudManager.getInstance().nearbySearch(info);

    return view;
  }

不幸的是,我一直从服务器获取状态值102(根据this API page表示STATUS_CODE_SECURITY_CODE_ERROR。现在我不知道该怎么做。 我不明白的事情:

  1. 构建查询时,为什么需要重复访问密钥(“ak”)?将它一次放入清单中是不够的?
  2. 查询中的“geoTableId”值应该是什么?
  3. 有什么想法吗?

1 个答案:

答案 0 :(得分:1)

经过数小时的研究,我在公开问题上取得了一些进展。

  1. 云搜索查询中“ak”字段的原因不是重复,它实际上是一个不同的访问密钥。在一个隐藏的地方百度说,“移动”访问键不适用于这些云搜索,你需要一个“服务器”。因此解决方案是返回百度控制中心并创建另一个“服务器”密钥。此密钥需要在查询中使用,而“for mobile”密钥需要保留在清单中。

  2. geoTableId是您帐户的标识符,与访问密钥不同。它是您在百度控制中心需要获得的(当前)5位数字。其他密钥是在标题为“API控制台”(API控制台)的选项卡中生成的,但是对于geoTableId,您需要切换到名为“数据管理”的选项卡(数据管理)。在那里我想我需要按左上角的“创建”(〜创建)按钮,然后输入一个名称,选择“是”(是)他们会询问这是否是发布(不确定该翻译)然后单击“保存”(保存)。在此之后,新生成的数字将显示在您刚才选择的名称后面的括号中的顶部字段中。

  3. 这些步骤允许我发送“成功”查询,其中服务器以状态0(STATUS_CODE_SUCCEED)回答。但是,到目前为止,我得到的所有答案都是空的,我还没有找到一个产生非空答案的查询。如果有人设法做到这一点,请告诉我!