远程搜索服务

远程搜索服务是构建在互联(uniconnect)服务和高德搜索服务之上的跨机器的远程服务。该服务可以在远端设备上直接使用高德搜索服务的相关功能(例如:地理编码,逆地理编码,行政区规划查询,POI关键字搜索,POI周边搜索,POIID搜索功能,POI父子关系,公交线路查询,公交站点查询,路径规划功能等)。

基本概念

SearchServiceProxy (For Android) / IWDSSearchServiceProxy (For iOS)(搜索服务代理)

作为远程搜索服务的代理,用于调用高德搜索服务的API,发送搜索结果到远端设备/响应远端设备(手表)的搜索请求。它提供地理编码、逆地理编码、行政区规划查询、POI关键字搜索、POI周边搜索、POIID搜索功能、POI父子关系、公交线路查询、公交站点查询、路径规划等功能,目前iOS只支持路径规划功能。

RemoteSearchService(远程搜索服务)

远程搜索服务运行在手表端,用于向搜索服务代理发送请求和响应其搜索结果。

RemoteSearchServiceManager(远程设备管理器)

代表远程搜索服务管理器,它是远程搜索服务对外提供的操作接口,用户只要获取到该实例对象就可以进行远程搜索操作。

Remote[XXX]Search(远程搜索对象)

在远程搜索对象中,用户可以设置远程搜索服务的回调,通过这些回调方法,就可以获取到远程搜索的结果。

RemoteRouteSearch(路径规划搜索类)

    /**
     * 设置公交路线查询参数
     * 
     * @param query
     *            公交路线查询参数
     */
    public void setBusRouteQuery(RemoteBusRouteQuery query);

    /**
     * 设置驾车路线查询参数
     * 
     * @param query
     *            驾车路线查询参数
     */
    public void setDriveRouteQuery(RemoteDriveRouteQuery query);

    /**
     * 设置步行路线查询参数
     * 
     * @param query
     *            步行路线查询参数
     */
    public void setWalkRouteQuery(RemoteWalkRouteQuery query);

    /**
     * 设置骑行路线查询参数
     * 
     * @return 骑行路线查询参数
     */
    public void setRideRouteQuery(RemoteRideRouteQuery rideRouteQuery);

    /**
     * 设置路径搜索结果监听接口
     * 
     * @param listener
     *            路径搜索结果监听接口
     */
    public void setRouteSearchListener(RemoteRouteSearchListener listener);

RemoteGeocodeSearch(地理编码搜索类)

    /**
     * 设置地理编码查询的关键字和查询城市
     * 
     * @param query
     *            地理编码查询的关键字和查询城市
     */
    public void setGeocodeQuery(RemoteGeocodeQuery query);

    /**
     * 设置逆地理编码查询的地理坐标点、查询范围、坐标类型
     * 
     * @param query
     *            逆地理编码查询的地理坐标点、查询范围、坐标类型
     */
    public void setRegeocodeQuery(RemoteRegeocodeQuery query);

    /**
     * 设置监听接口
     * 
     * @param listener
     *            监听接口
     */
    public void setGeocodeSearchListener(RemoteGeocodeSearchListener listener);

以下搜索类的接口与地理编码搜索类类似,这里不再赘述

RemoteDistrictSearch(行政区域搜索类);

RemotePoiSearch(POI <Point Of Interest,兴趣点> 搜索类);

RemoteInputtips(输入提示类);

RemoteBusLineSearch(公交线路搜索类);

RemoteBusStationSearch(公交站点搜索类).

使用方法

目前路径规划功能支持在手机端直接进行规划,然后将路线结果发送到手表,接口用法如下:

ANDROID CODE:

    // 获取搜索服务代理对象,initialize(context)和start()在Application.onCreate()中已调用,
    // 因此在使用时无需再次调用,重复调用无效
    SearchServiceProxy mProxy = SearchServiceProxy.getInstance();

    // 设置高德开放平台获取的ApiKey
    // ApiKey获取方法请参见:
    // http://lbs.amap.com/api/android-sdk/guide/create-project/get-key
    // 默认使用的ApiKey由深圳君正为WatchManager应用申请,
    // 如需开发自己的手机客户端,请设置自己的ApiKey
    mProxy.setApiKey(yourAppKey);


    // 路径规划的两种方法:
    // 方法一:直接使用高德高德API提供的路径规划接口,使用方法请参见:
    // http://lbs.amap.com/api/android-sdk/guide/route-plan/drive

    // 方法二:使用SearchServiceProxy中封装的Api接口,用法如下:

    /**
     * 设置路径规划监听
     * @param listener 路径规划监听,通过回调方法可获取路径规划路线的结果
     */
    public void setRouteSearchListener(OnRouteSearchListener listener);

    /**
     * 路径规划异步方法,通过OnRouteSearchListener的回调方法获取路线结果,
     * 公交和驾车路径规划建议使用方法一实现
     * @param queryType 路径规划的类型
     *        <ul>
     *            <li>{@link #QUERY_TYPE_BUS_ROUTE_SEARCH QUERY_TYPE_BUS_ROUTE_SEARCH-公交}</li>
     *            <li>{@link #QUERY_TYPE_DRIVE_ROUTE_SEARCH QUERY_TYPE_DRIVE_ROUTE_SEARCH-驾车}</li>
     *            <li>{@link #QUERY_TYPE_RIDE_ROUTE_SEARCH QUERY_TYPE_RIDE_ROUTE_SEARCH-骑行}</li>
     *            <li>{@link #QUERY_TYPE_WALK_ROUTE_SEARCH QUERY_TYPE_RIDE_ROUTE_SEARCH=步行}</li>
     *        <ul/>
     * @param fromAndTo 路线的起点和终点信息
     * @param mode 路径规划的模式 {@link com.amap.api.services.route.RouteSearch RouteSearch.mode}
     * @param passedByPoints 路线途径点
     */
    public void calculateRouteAsyn(int queryType, RouteSearch.FromAndTo fromAndTo, int mode,
                                       List<LatLonPoint> passedByPoints);

    // 发送路径规划结果到远程设备(手表)
    /**
     * 发送公交路径规划结果给远程设备
     * @param busRouteResult 高德API返回的公交路径规划结果
     * @return 是否成功发送,注意发送成功不代表远程设备也成功接收
     */
    public boolean sendBusRouteResultToRemote(BusRouteResult busRouteResult);

    /**
     * 发送驾车路径规划结果给远程设备
     * @param driveRouteResult 高德API返回的驾车路径规划结果
     * @return 是否成功发送,注意发送成功不代表远程设备也成功接收
     */
    public boolean sendDriveRouteResultToRemote(DriveRouteResult driveRouteResult);

    /**
     * 发送骑行路径规划结果给远程设备
     * @param rideRouteResult 高德API返回的骑行路径规划结果
     * @return 是否成功发送,注意发送成功不代表远程设备也成功接收
     */
    public boolean sendRideRouteResultToRemote(RideRouteResult rideRouteResult);

    /**
     * 发送步行路径规划结果给远程设备
     * @param walkRouteResult 高德API返回的步行路径规划结果
     * @return 是否成功发送,注意发送成功不代表远程设备也成功接收
     */
    public boolean sendWalkRouteResultToRemote(WalkRouteResult walkRouteResult);

    // 注意使用以上方法发送路线结果时,
    // 需要在远端设备通过RemoteSearchServiceManager注册监听用来接收路线结果
    /**
     * 用于注册响应远端路径规划的监听器
     *
     * @param listener 监听器对象
     *
     * @return true 注册成功, false 注册失败
     */
    public boolean registerRemoteRouteSearchListener(RemoteRouteSearchListener listener);

    /**
     * 注销响应远端路径规划的监听器 
     *
     * @param listener 监听器对象
     */
    public void unregisterRemoteRouteSearchListener(RemoteRouteSearchListener listener);

iOS CODE:

    // 获取代理对象
    IWDSSearchServiceProxy *proxy = [IWDSSearchServiceProxy shareInstance];

    /**
     * 设置高德API key
     */
    - (void)setApiKey:(NSString *)key;

    /**
     * 公交路径规划,公交路径规划不支持添加途径点
     */
    - (void)calculateBusRouteAsynByOrigin:(AMapGeoPoint *)origin destination:(AMapGeoPoint *)destination mode:(int)mode city:(NSString *)city destinationCity:(NSString *)destinationCity nightFlag:(BOOL)nightFlag requireExtension:(BOOL)requireExtension;

    /**
     * 驾车路径规划,支持添加最多16个途径点,支持设置避让区域和避让道路
     */
    - (void)calculateDriveRouteAsynByOrigin:(AMapGeoPoint *)origin destination:(AMapGeoPoint *)destination mode:(int)mode passedByPoints:(NSArray *)passedByPoints avoidpolygons:(NSArray<AMapGeoPolygon *> *)avoidpolygons avoidroad:(NSString *)avoidroad requireExtension:(BOOL)requireExtension;

    /**
     * 骑行或步行路径规划,可添加多个途径点
     */
    - (void)calculateRouteAsynByType:(int)queryType origin:(AMapGeoPoint *)origin destination:(AMapGeoPoint *)destination mode:(int)mode passedByPoints:(NSArray *)passedByPoints;

    /**
     * 发送公交路径规划结果到远程设备
     */
    - (BOOL)sendBusRouteResultToRemote:(AMapRouteSearchResponse *)result request:(AMapTransitRouteSearchRequest *)request;

    /**
     * 发送驾车路径规划结果到远程设备
     */
    - (BOOL)sendDriveRouteResultToRemote:(AMapRouteSearchResponse *)result request:(AMapDrivingRouteSearchRequest *)request;

    /**
     * 发送骑行路径规划结果到远程设备
     */
    - (BOOL)sendRideRouteResultToRemote:(AMapRouteSearchResponse *)result request:(AMapRidingRouteSearchRequest *)request;

    /**
     * 发送步行路径规划结果到远程设备
     */
    - (BOOL)sendWalkRouteResultToRemote:(AMapRouteSearchResponse *)result request:(AMapWalkingRouteSearchRequest *)request;

远程搜索服务是IWDS系统服务的子服务,使用方法遵循IWDS服务框架的使用。

    ServiceClient mServiceClient = new ServiceClient(mContext,
                RemoteDeviceServiceManager.SERVICE_REMOTE_SEARCH, mConnectionCallbacks);
    mServiceClient.connect();
    //在 mConnectionCallbacks 的回调函数onConnected中获取RemoteSearchServiceManager实例

    @Override
    public void onConnected(ServiceClient serviceClient) {
        m_serviceManager = (RemoteSearchServiceManager) m_client
                .getServiceManagerContext();
        // 注册远程服务状态监听
        m_serviceManager.registerRemoteStatusListener(m_remoteStatusListener);

        // 注册远程路径规划监听(该监听适用于接收手机端路径规划的结果,由手机端主动触发)
        m_serviceManager.registerRemoteRouteSearchListener(m_routeSearchListener);
    }

    @Override
    public void onDisconnected(ServiceClient serviceClient, boolean unexpected) {
        // 在服务断开后注销监听器
        m_serviceManager.unregisterRemoteStatusListener(m_remoteStatusListener);
        m_serviceManager.unregisterRemoteRouteSearchListener(m_routeSearchListener);
    }

    @Override
    public void onConnectFailed(ServiceClient serviceClient,
                                ConnectFailedReason reason) {
    }

服务接口

    /**
     * 根据给定的地理名称和查询城市请求获取地理编码的结果列表
     *
     * @param search
     *            地理编码搜索对象
     *
     * @return true 请求成功, false 请求失败
     */
    public boolean requestGeocodeSearch(RemoteGeocodeSearch search);

    /**
     * 根据给定的经纬度和最大结果数请求获取逆地理编码的结果列表
     *
     * @param search
     *            地理(逆)编码搜索对象
     *
     * @return true 请求成功, false 请求失败
     */
    public boolean requestRegeocodeSearch(RemoteGeocodeSearch search);

    /**
     * 请求查询行政区
     *
     * @param search
     *            行政区搜索对象
     *
     * @return true 请求成功, false 请求失败
     */
    public boolean requestDistrictSearch(RemoteDistrictSearch search);

    /**
     * 请求查询POI<br/>
     * 如果此时矩形查询(RemotePoiSearchBound)已定义,则搜索范围为该矩形内的符合条件的POI,<br/>
     * 如果此时查询条件(Query)中的行政区划代码已定义,则搜索该城市(地区)内的所有符合条件的POI,<br/>
     * 如上述两个条件均未定义,则搜索范围为全国。<br/>
     * 建议定义一个范围:矩形或行政区划代码均可。<br/>
     * 整个查询的语义为查找符合查询关键字,符合查询类型编码组合及在指定范围内的指定POI。<br/>
     * 查询POI的结果,结果是分页的,每页最多30个。
     *
     * @param search
     *            POI搜索对象
     * @return true 请求成功, false 请求失败
     */
    public boolean requestPoiSearch(RemotePoiSearch search);

    /**
     * 按照POI的ID查找POI详细信息,ID需要存放在RemotePoiQuery中。
     *
     * @param search
     *            POI查询对象
     * @return true 请求成功, false 请求失败
     */
    public boolean requestPoiItemSearch(RemotePoiSearch search);

    /**
     * 请求获取发送输入提示请求
     *
     * @param tips
     *            输入请求对象
     *
     * @return true 请求成功, false 请求失败
     */
    public boolean requestInputtips(RemoteInputtips tips);

    /**
     * 请求搜索公交线路<br/>
     * 如果此时查询条件(RemoteBusLineQuery)中的行政区划代码已定义,则查询为该城市(地区)内的所有符合条件的POI,<br/>
     * 否则范围为全国。根据指定查询类型和关键字搜索公交线路结果。
     *
     * @param search
     *            公交线路搜索对象
     * @return true 请求成功, false 请求失败
     */
    public boolean requestBusLineSearch(RemoteBusLineSearch search);

    /**
     * 请求搜索公交站点<br/>
     * 如果此时查询条件(RemoteBusStationQuery)中的行政区划代码已定义,则查询为该城市(地区)内的所有符合条件的POI,<br/>
     * 否则范围为全国 。根据指定查询类型和关键字搜索公交站点结果
     *
     * @param search
     *            公交站点搜索对象
     * @return true 请求成功, false 请求失败
     */
    public boolean requestBusStationSearch(RemoteBusStationSearch search);

    /**
     * 根据指定的参数来请求获取公交路径。只支持市内公交换乘
     *
     * @param search
     *            公交路径搜索对象
     * @return true 请求成功, false 请求失败
     */
    public boolean requestBusRouteSearch(RemoteRouteSearch search);

    /**
     * 根据指定的参数来请求获取驾车路径
     *
     * @param search
     *            驾车路径搜索对象
     * @return true 请求成功, false 请求失败
     */
    public boolean requestDriveRouteSearch(RemoteRouteSearch search);

    /**
     * 根据指定的参数来请求获取步行路径
     *
     * @param search
     *            步行路径搜索对象
     * @return true 请求成功, false 请求失败
     */
    public boolean requestWalkRouteSearch(RemoteRouteSearch search);

    /**
     * 根据指定的参数来请求获取骑行路径
     *
     * @param search
     *            骑行路径搜索对象
     * @return true 请求成功, false 请求失败
     */
    public boolean requestRideRouteSearch(RemoteRouteSearch search);

相关资源

远程搜索服务Demo:elf/samples/RemoteSearchTest

注意事项

1.使用iwds-service-ui-jar.jar时,如果同时需要用到高德地图SDK(AMap_Search_V3.6.1_20161122.jar),不要再在工程libs中添加AMap_Search_V3.6.1_20161122.jar,否则将导致编译出错;

2.使用Iwds.framework时,如果同时要用到高德地图SDK(AMapFoundationKit.framework、AMapSearchKit.framework),请将Iwds.framework中的Frameworks文件夹删除,否则将会出现类冲突的问题。