1.实验目的
(1)掌握POI搜索的方法。
(2)了解高德地图提供的输入内容自动提示功能。
2.POI搜索
POI(Point Of Interest,兴趣点)搜索是地图应用中较常见的功能,在地图中一个POI可代表一栋大厦、一家商铺、一处景点等,通过POI搜索可以完成找餐馆、找景点等功能。地图SDK的搜索功能提供多种获取POI数据的接口。实现POI搜索的步骤如下。
(1)继承OnPoiSearch Listener监听。
(2)构造PoiSearch.Query对象,通过PoiSearch.Query(String query,String ctgr,String city)设置搜索条件。
(3)构造PoiSearch对象,并设置监听。
(4)调用PoiSearch的searchPOIAsyn()方法发送请求。
(5)通过回调接口onPoiSearched解析返回的结果,将查询到的POI以绘制点的方式显示在地图上。
3.输入内容自动提示
输入内容自动提示是指根据用户输入的关键词给出相应的提示信息,将最有可能的搜索词呈现给用户,以减少用户输入信息,提升用户体验。例如,输入“学校”会提示“××学校”等。实现步骤如下所述。
(1)继承InputtipsListener监听和Text Watcher监听。
(2)在Text Watcher的on TextChanged()方法中构造InputtipsQuery对象,通过InputtipsQuery(String keyword,String city)设置搜索条件。
(3)构造Inputtips对象,并设置监听。
(4)调用PoiSearch的requestInputtips Asyn()方法发送请求。
(5)通过回调接口onGetInputtips解析返回的结果,获取输入提示返回的信息。
4.功能与代码结构
在搜索栏中搜索感兴趣的场所,高德地图返回预设的POI,可以更改城市,城市输入出错会弹出错误提示信息,点击“搜索”按钮,会在指定的城市中搜索出10个符合搜索条件的地点,并在地图中绘制Marker标识,点击“下一页”按钮将切换搜索出的下面10个结果,点击Marker将弹出该地点的信息,如图6.19所示。
图6.19 高德地图POI搜索
本实验通过3个监听器接口类实现主要功能,分别为TextWatcher、OnPoiSearch Listener和InputtipsListener,所以必须实现这3个接口类必须实现的方法。本实验的主要代码结构如图6.20所示。
图6.20 App17主要代码结构
•Text Watcher主要用于对输入文本进行监听,该监听器绑定的方式如下所示。
search Text一般为Edit Text。Text Watcher接口必须实现的方法为after TextChanged(Editable s)、beforeTextChanged(CharSequence s,int start,int count,int after)、on TextChanged(CharSequence s,int start,int before,int count)。
•OnPoiSearch Listener用于监听高德地图返回的POI数据,该接口必须实现的方法为onPoiSearched(PoiResult result,int rCode)、onPoiItemSearched(PoiItem item,int r Code),本实验在“搜索”按钮的点击事件中触发POI搜索。
•Inputtips Listener用于接收高德地图返回的相关的POI值,必须实现的方法为onGetInputtips(List Tip tip List,int rCode)。
5.实验步骤
步骤1:新建工程App17,包路径为“cn.edu.android.app17”。
步骤2:按照本章实验1中的叙述在高德官网获取“cn.edu.android.app17”地图服务的API Key,并在Android Manifest.xml配置文件和build.gradle文件中进行相同的设置。这里需要注意申请API Key时要同时填写发布版安全码和调试版安全码,否则会导致部分POI功能不可用。
步骤3:在strings.xml文件中定义实验中需要的常量字符串。
步骤4:根据图6.19所示设计布局文件。自动填充文本输入框控件AutoCompleteText View中,android:completion Threshold="1"属性设置了一个阈值,规定用户输入1个字符后出现自动提示;drop Down VerticalOffset="1dp"表示弹出提示信息控件向下偏移1 dp;android:imeOptions="actionDone"属性表示在接收用户输入时,移动设备的软键盘回车键的显示文字改为“完成”。本实验将地图放在一个Fragment中。
(www.xing528.com)
步骤5:在Main Activity.java文件中定义程序中需要的全局变量,并在onCreate()方法中获取AutoComplete Text View和Edit Text这两个控件。
步骤6:Main Activity实现接口Text Watcher、OnPoiSearch Listener和InputtipsListener,通过“Alt+Enter”键进行修复,完成3个接口类必须实现的方法。
步骤7:定义show Toast()方法,用于显示Toast。
步骤8:完成文本输入触发函数on TextChanged(),当用户输入第一个关键字时触发该方法。
步骤9:在onGetInputtips()方法中获取高德服务器返回的输入建议信息。
步骤10:定义“搜索”按钮的触发方法。
步骤11:完成POI搜索信息回调函数,并根据高德服务器返回的数据设置Marker。
步骤12:完成“下一页”按钮的触发函数,在该方法中重新请求10条POI搜索数据。
步骤13:运行并测试App17。
知识拓展:反编译
在学习Android开发的过程中,经常需要学习别人的应用是怎么开发的,一些漂亮的动画和精致的布局会让人爱不释手。有时,一个App在测试真机或用户的真机上出现错误,这个错误可能在几天前已经被修改过,但是不确定是修改前引起的问题,还是修改后引起的问题。在这种情况下,如果该应用对应的APK(Android Package,Android安装包)未经过混淆,便可以对APK进行反编译查看其中的代码。
APK可以使用WinRAR等压缩工具进行查看,如图6.21所示,APK文件中包括:包含签名等信息的目录META-INF、res目录下的所有文件、项目配置文件Android Manifest.xml和资源索引文件resources.arsc。要反编译APK获取应用程序细节,可以使用3个工具,分别为apktool、dex2jar和Java反编译工具jd-gui。
(1)反编译资源文件
使用Win RAR等工具解压得到的XML文件都是乱码,而apktool这个工具可以最大限度地还原资源文件和Android Manifest.xml文件。该工具的下载地址为https://ibotpeaches.github.io/Apktool/install/。具体步骤如下所述。
图6.21 使用WinRAR查看APK
①打开apktool下载地址,如图6.22所示,右击“wrapper script”,在弹出的菜单中选择保存为apktool.bat,然后通过“find newest here”超链接下载apktool***.jar,下载完成后将文件重命名为apktool.jar。在D盘新建文件夹Java-Decompile,将下载的两个文件放在该文件夹内。
图6.22 下载apktool
②复制要反编译的APK文件至D:\Java-Decompile\目录下,这里以安装程序App01-debug.apk为例。
③同时按下Win键和R键调出“运行”窗口,在该窗口中输入“cmd”进入命令行模式,利用cd命令进入刚刚创建的文件夹中,再输入“apktool d App01-debug.apk”,如图6.23所示。
图6.23 执行apktool进行反编译
④回到资源管理器中,可以发现D:\Java-Decompile\目录下多了一个App01-debug文件夹,如图6.24所示,这样res文件夹中的资源文件和Android Manifest.xml文件就被反编译出来了。
图6.24 反编译后的文件
①下载dex2jar,下载地址为https://sourceforge.net/projects/dex2jar/,假设下载的文件为dex2jar-2.0.zip,解压该文件至D:\Java-Decompile\dex2jar-2.0\目录下,检查该目录,确保该目录下有一个文件为d2j-dex2jar.bat,该文件是反编译的主要可执行程序。
②使用Win RAR打开App01-debug.apk,解压得到classes.dex文件,并复制该文件至D:\Java-Decompile\dex2jar-2.0\目录下。该文件即为在ART虚拟机上可执行的二进制代码文件,dex2jar可以将该文件反编译为classes-dex2jar.jar文件。
③进入命令行模式,利用cd命令进入D:\Java-Decompile\dex2jar-2.0\目录,键入“d2j-dex2jar.bat classes.dex”,即可看到在D:\Java-Decompile\dex2jar-2.0\目录下生成了一个classes-dex2jar.jar文件。
④下载jd-gui-windows-*.zip,下载地址为https://java-decompiler.github.io/,下载完成后解压缩,运行jd-gui.exe。
⑤将上述classes-dex2jar.jar文件拖入jd-gui.exe,即可得到*.java文件,如图6.25所示。
图6.25 反编译出的Java源代码
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。