首页 > 其他分享 >unity3d,android平台下,高德地图搜索附近

unity3d,android平台下,高德地图搜索附近

时间:2023-01-04 13:36:09浏览次数:48  
标签:unity3d 地图搜索 get text txtInfo strReturn poiItems android txtPoi


今天把高德地图android sdk搜索附近的功能搞定了。


和定位一样,引入jar,AndroidManifest.xml和定位的一样,没有需要修改的地方。改的多的是Java插件。

原java示例代码中,


query = new PoiSearch.Query("", deepType, "北京市");
poiSearch.setBound(new SearchBound(lp, 2000, true));
poiSearch.setOnPoiSearchListener(this);

这3处在反编译后显示,这几个都是在一个类下面的,而不是自身是一个类,尝试后发现都无法直接在unity中调用,都需要转一下。

unity3d,android平台下,高德地图搜索附近_android平台

这里,不知道是高德的代码不规范,还是unity的方法不给力,还是我的水平太烂,总之,反编译以后显示在类下面的枚举,类,接口都要自己编写java转一下。

另外,这里貌似java中的队列和unity中的队列似乎不太一样,为了省事,也用java转了一下。

unity3d,android平台下,高德地图搜索附近_android平台_02


新建一个java工程

unity3d,android平台下,高德地图搜索附近_android平台_03


转方法的类

package com.nsh.amapHelper;

import com.amap.api.services.core.LatLonPoint;
import com.amap.api.services.poisearch.PoiSearch;

public class AMapSearchHelper {
public PoiSearch.Query getPoiSearch(String keyword,String searchType,String cityCode ){
PoiSearch.Query query = new PoiSearch.Query(keyword, searchType, cityCode) ;
return query;
}

public PoiSearch.SearchBound getBound(LatLonPoint lp,int radiusInMeters,boolean isDistanceSort){
PoiSearch.SearchBound bound = new PoiSearch.SearchBound(lp,radiusInMeters,isDistanceSort);
return bound;
}
}


转接口的类

package com.nsh.amapHelper;

import com.amap.api.services.poisearch.PoiSearch.OnPoiSearchListener;

public abstract interface AMapListenerHelper extends OnPoiSearchListener{

}


重新解析结果的类,出口经纬度不一定有。

package com.nsh.amapHelper;

import java.util.ArrayList;

import com.amap.api.services.core.PoiItem;
import com.amap.api.services.poisearch.PoiResult;

public class AMapPoiResultHelper {

private PoiResult poiResult;
private ArrayList<PoiItem> poiItems;

public void setPoiResult(PoiResult result){
poiResult = result;
poiItems = poiResult.getPois();
}

public int poiItemNumber(){
if (poiItems != null && poiItems.size() > 0){
return poiItems.size();
}else{
return 0;
}
}

public String poinItemInfo(int i){
String strReturn= "";
if(i>-1&&i<poiItems.size()){
// strReturn = strReturn+"||行政区划代码>"+poiItems.get(i).getAdCode();
// strReturn = strReturn+"||行政区划名称>"+poiItems.get(i).getAdName();
// strReturn = strReturn+"||所在商圈>"+poiItems.get(i).getBusinessArea();
// strReturn = strReturn+"||城市编码>"+poiItems.get(i).getCityCode();
// strReturn = strReturn+"||getDirection>"+poiItems.get(i).getDirection();
// strReturn = strReturn+"||距离中心点的距离>"+poiItems.get(i).getDistance();
// strReturn = strReturn+"||电子邮件>"+poiItems.get(i).getEmail();
// strReturn = strReturn+"||停车场类型>"+poiItems.get(i).getParkingType();
// strReturn = strReturn+"||唯一标识>"+poiItems.get(i).getPoiId();
// strReturn = strReturn+"||邮编>"+poiItems.get(i).getPostcode();
// strReturn = strReturn+"||行政区编码>"+poiItems.get(i).getProvinceCode();
// strReturn = strReturn+"||政区名称>"+poiItems.get(i).getProvinceName();
// strReturn = strReturn+"||地址>"+poiItems.get(i).getSnippet();
// strReturn = strReturn+"||电话>"+poiItems.get(i).getTel();
strReturn = strReturn+"||名称>"+poiItems.get(i).getTitle();
// strReturn = strReturn+"||类型描述>"+poiItems.get(i).getTypeDes();
// strReturn = strReturn+"||网址>"+poiItems.get(i).getWebsite();

//strReturn = strReturn+"||" +poiItems.get(i).getLatLonPoint().getLatitude();

try{
strReturn = strReturn+"||经纬度坐标>"
+poiItems.get(i).getLatLonPoint().getLatitude()
+"\\"+poiItems.get(i).getLatLonPoint().getLongitude();

strReturn = strReturn+"||入口坐标>"
+poiItems.get(i).getEnter().getLatitude()
+"\\"+poiItems.get(i).getLatLonPoint().getLongitude();

strReturn = strReturn+"||出口坐标>"
+poiItems.get(i).getExit().getLatitude()
+"\\"+poiItems.get(i).getLatLonPoint().getLongitude();
}catch(Exception ex){
strReturn = strReturn +"----"+ex.getMessage();
}

}
return strReturn;
}
}

java打包编译成jar后引入。



untiy部分

将java事件转为unity事件

using UnityEngine;
using System.Collections;

public class SearchEvent : AndroidJavaProxy {

public SearchEvent ()
: base ("com.nsh.amapHelper.AMapListenerHelper")
{
}

void onPoiSearched (AndroidJavaObject result,int rCode)
{
if (poiSearched != null) {
poiSearched (result,rCode);
}
}

void onPoiItemSearched(AndroidJavaObject paramPoiItem,int paramInt){
}

public delegate void DelegateOnPoiSearched(AndroidJavaObject result,int rCode);
public event DelegateOnPoiSearched poiSearched;
}


unity调用方法,这里没有实时获取当前定位,直接手写了一个。

using UnityEngine;
using System.Collections;
using UnityEngine.UI;
using System;

public class SearchManage : MonoBehaviour
{

public Text txtInfo;
public Text txtPoi;
public InputField inputQuery;
private SearchEvent searchEvent;

private AndroidJavaClass jcu;
private AndroidJavaObject jou;
private AndroidJavaObject query;
private AndroidJavaObject poiSearch;
private AndroidJavaObject lastPoint;

public void StartSearch ()
{
try {
txtInfo.text = "start search...";

txtInfo.text = txtInfo.text + "\r\n";
jcu = new AndroidJavaClass ("com.unity3d.player.UnityPlayer");
jou = jcu.GetStatic<AndroidJavaObject> ("currentActivity");
txtInfo.text = txtInfo.text + "currentActivity get...";

txtInfo.text = txtInfo.text + "\r\n";
AndroidJavaObject amapHelper = new AndroidJavaObject("com.nsh.amapHelper.AMapSearchHelper");
txtInfo.text = txtInfo.text + "helper get...";

txtInfo.text = txtInfo.text + "\r\n";
AndroidJavaObject query = amapHelper.Call<AndroidJavaObject>("getPoiSearch",inputQuery.text,"生活服务","0871");
txtInfo.text = txtInfo.text + "query get...";

txtInfo.text = txtInfo.text + "\r\n";
query.Call ("setPageSize", 20);
query.Call ("setPageNum", 1);
txtInfo.text = txtInfo.text + "page set...";

txtInfo.text = txtInfo.text + "\r\n";
poiSearch = new AndroidJavaObject ("com.amap.api.services.poisearch.PoiSearch", jou, query);
txtInfo.text = txtInfo.text + "poiSearch set...";

txtInfo.text = txtInfo.text + "\r\n";
lastPoint = new AndroidJavaObject ("com.amap.api.services.core.LatLonPoint", 25.054777d, 102.671163d);
txtInfo.text = txtInfo.text + "lastPoint set...";

txtInfo.text = txtInfo.text + "\r\n";
AndroidJavaObject bound = amapHelper.Call<AndroidJavaObject>("getBound",lastPoint,1000,true);
txtInfo.text = txtInfo.text + "bound set...";

txtInfo.text = txtInfo.text + "\r\n";
poiSearch.Call ("setBound", bound);
txtInfo.text = txtInfo.text + "setBound set...";

txtInfo.text = txtInfo.text + "\r\n";
searchEvent = new SearchEvent ();
searchEvent.poiSearched += OnPoiSearched;
txtInfo.text = txtInfo.text +"searchEvent set...";
poiSearch.Call ("setOnPoiSearchListener", searchEvent);
txtInfo.text = txtInfo.text + "setOnPoiSearchListener set...";

txtInfo.text = txtInfo.text + "\r\n";
poiSearch.Call ("searchPOIAsyn");
txtInfo.text = txtInfo.text + "searchPOIAsyn set...";

} catch (Exception ex) {
txtInfo.text = txtInfo.text + "\r\n--------------------\r\n";
txtInfo.text = txtInfo.text + ex.Message;
}
}

private void OnPoiSearched (AndroidJavaObject result, int rCode)
{

try {

if (rCode == 0) {
if (result != null && result.Call<AndroidJavaObject> ("getQuery") != null) {// 搜索poi的结果
txtPoi.text = "reslut get.";

txtPoi.text = txtPoi.text +">>";
txtPoi.text = txtPoi.text+"页面数:"+result.Call<int>("getPageCount").ToString();

txtPoi.text = txtPoi.text +">>";
AndroidJavaObject resultHelper = new AndroidJavaObject("com.nsh.amapHelper.AMapPoiResultHelper");
txtPoi.text = txtPoi.text +"resulthelper get..";
resultHelper.Call("setPoiResult",result);
txtPoi.text = txtPoi.text+"resultHelper set...";

int num =resultHelper.Call<int>("poiItemNumber");
txtPoi.text = txtPoi.text +">>记录数:"+num.ToString()+">>";

for(int i=0;i<num;i++){
txtPoi.text = txtPoi.text +"\r\n";
txtPoi.text = txtPoi.text + resultHelper.Call<String>("poinItemInfo",i);
}
} else {
txtPoi.text = "没有找到相关数据。";
}
} else if (rCode == 27) {
txtPoi.text = "搜索失败,请检查网络连接。";
} else if (rCode == 32) {
txtPoi.text = "key验证无效。";
} else {
txtPoi.text = "未知错误,请稍后重试。错误代码:" + rCode.ToString ();
}

} catch (Exception ex) {
txtPoi.text = txtPoi.text + "\r\n----------------\r\n";
txtPoi.text = txtPoi.text + ex.Message;
}
}
}


编译以后运行效果

unity3d,android平台下,高德地图搜索附近_高德地图_04



标签:unity3d,地图搜索,get,text,txtInfo,strReturn,poiItems,android,txtPoi
From: https://blog.51cto.com/u_15929643/5988312

相关文章

  • unity3d,android平台下,高德地图定位
    这里,用了一个比较偷懒的办法,直接用高德提供的android定位sdk,没有重新编译。好处是省事,坏处是,没法修改默认的定位模式。部分信息获取不到。如果需要完整的功能,还是需要重新编......
  • unity3d 尝试 基于地理定位的 增强现实
    首先说,这个尝试失败,属于死在去医院的路上那种。基于地理定位的增强现实,AR全息实景,是一种高大上的说法,说直白点就是山寨类似随便走这样的应用。打开应用,搜索周边信息,然后再把......
  • unity3d,异步加载场景
    很简单,代码如下:usingUnityEngine;usingSystem.Collections;usingUnityEngine.UI;publicclassLoading:MonoBehaviour{publicSliderloading_bar;privateAsyncO......
  • 《Unity3D平台AR开发快速上手--基于EasyAR4.0》随书资源和相关说明
    新手《Unity3D平台AR开发快速上手–基于EasyAR4.0》上市了,现在京东和淘宝都有卖。书分为2个部分,第一部分是EasyAR4.0基础内容和使用,第二部分是利用EasyAR的稀疏空间地图做室......
  • Android笔记--如何在Android studio里面打开数据库
    具体操作1、找到界面内的DeviceFileExplorer这里找可以;这里直接打开也行2、在里面找到与java下面的第一个package名称相同的文件夹3、找到下面的databases会看......
  • Android笔记--修改Device File Explorer的文件打开方式
    在首次打开该文件时,不小心选错了打开方式,导致以后每次打开也是同样的打开方式,也不会弹出第一次那样的打开方式的选择弹窗在这里提供修改文件的默认打开方式的方法:首先通......
  • Android笔记--基础的连接数据库的操作
    start.javapackagecom.example.myapplication;importandroidx.activity.result.ActivityResult;importandroidx.activity.result.ActivityResultCallback;importa......
  • Android学习day03【跑马灯】
    这个学习内容很简单,说一下自己笨蛋的点吧要实现这种情况,我始终没有办法实现  后来发现(你先别说话,我知道很傻,但是大话先别说太早)android:layout_width="wrap_cont......
  • 【安卓】Qt for Android开发环境搭建
    安装Qt略(参考网上的安装Qt即可,暂时不考虑其他组件)安装jdk17下载1.8版本网上推荐使用JDK1.8,而不是其他版本,不建议使用最新版。下载1.8JavaDownloads|Oracle设置环......
  • 史上最全的Android面试题集锦
    Android基本知识点1、常规知识点1、Android类加载器在Android开发中,不管是插件化还是组件化,都是基于Android系统的类加载器ClassLoader来设计的。只不过Android平台上虚拟......