3

Вопрос по android – Карты Baidu на Android: ключ доступа не работает для поиска местоположения

Я создаю приложение для Android для китайского клиента, и им нужна интеграция с картами, поэтому карты Google не подходят, так как все службы Google заблокированы в Китае. Я пытаюсь использовать карты Baidu, которые называются Baidu LBS (сервисы на основе определения местоположения).

Получить базовую карту без наложений было относительно легко.Процесс описан здесь (на китайском, но код говорит сам за себя, если вы не понимаете язык). Скачать последнюю версию Baidu Android SDK (v3.2.0 на момент написания статьи) и интегрировать ее в мой проект Eclipse в качестве библиотеки не составило труда, но не стоит слишком доверять документации по этой ссылке, хотя она и является официальной. Их примеры часто содержат код, который даже не компилируется. Например, имя файла .jar полностью отличалось от того, что вы видите на скриншоте.

Ох, а также их библиотека .jar запутана, что очень раздражает работать с :-(

Мне нужно было зарегистрировать учетную запись Baidu и пойти в их центр управления, чтобы сгенерировать ключ. Чтобы создать ключ доступа («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 с сервера (согласноэта страница API это означаетSTATUS_CODE_SECURITY_CODE_ERROR, Теперь я не знаю, что делать. Вещи, которые я не понимаю:

Зачем мне повторять мой ключ доступа ("ak") при построении запроса? Разве недостаточно иметь его в манифесте один раз?Что это за значение «geoTableId» в запросе?

Есть идеи?

1 ответ
1

После многих часов исследований я достиг определенного прогресса в отк

рытых вопросах.

Причиной появления поля «ak» в поисковом облачном запросе является не дублирование, а фактически другой ключ доступа. Где-то в скрытом месте Baidu говорит, что ключи доступа «для мобильных» не будут работать для этих облачных поисков, вам нужен ак «для сервера». Поэтому решение - вернуться в центр управления Baidu и создать еще один ключ «для сервера». Этот ключ необходимо использовать в запросе, в то время как ключ «для мобильных устройств» должен оставаться в манифесте.

geoTableId - это идентификатор вашей учетной записи, который не отличается от ключей доступа. Это (в настоящее время) 5-значный номер, который необходимо получить в центре управления Baidu. Другие ключи были сгенерированы на вкладке под названием «API (» (панель управления API), но для geoTableId вам нужно переключиться на вкладку «数据 管理» (управление данными). Там я думаю, что мне нужно было нажать кнопку «创建» (~ создать) в левом верхнем углу, затем ввести имя, выбрать «是» (да), где они спрашивают, если это для выпуска (не уверен насчет этого перевода), а затем нажмите «保存» (сохранить). После этого ваш недавно сгенерированный номер отображается в верхнем поле в скобках за именем, которое вы выбрали только что.

Эти шаги позволили мне отправить «успешные» запросы, когда сервер отвечает со статусом 0 (STATUS_CODE_SUCCEED). Однако пока все ответы, которые я получаю, пусты, мне еще предстоит найти запрос, который дает непустой ответ. Если кому-то это удастся, дайте мне знать!

Очень жаль, но я не касался этого материала более 2 лет, почти не помню, что я делал тогда :-(

от peedee

Привет PeeDeep. Нужна помощь с картами Baidu. Я вижу, что вы работаете над Baidu. Можете ли вы проверить этот вопросstackoverflow.com/questions/42273462/...

от D-D

Похожие вопросы