android菜鸟学习笔记31----Android使用百度地图API(二)获取地理位置及地图控制器的简单使用
1.获取当前地理位置:
Android中提供了一个LocationManager的类,用于管理地理位置。不能通过构造函数获取该类的实例,而是通过Context的getSystemService():
LocationManager lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
该类中有几个比较常用的方法:

getLastKnownLocation(String provider)用于根据传入的provider获取一个Location对象,该对象存储了地理位置信息,包括经度、纬度、海拔、速度等。provider指明采用何种方式获取地理位置信息,在LocationManager中定义了几个字符串常量,用于指定地理位置信息的提供者:


NETWORK_PROVIDER:采用网络的方式获取
GPS_PROVIDER:采用GPS获取
PASSIVE_PROVIDER:被动定位方式,当其他应用使用定位更新了定位信息,系统会保存下来,该应用接收到消息后直接读取就可以了
注意:在使用真机测试时,一定要走到室外。因为常用的定位方式是GPS或者NETWORK,但是在室内这两个基本没起作用,我刚开始还以为是代码的问题,后来走出去测试才发现代码没有问题。
获取地理位置信息之前,最好先查看下手机支持哪些定位方式,哪些是可用的,然后再选择一个可用的来定位:


getAllProviders()返回所有的地理位置提供者的所有字符串描述
getBestProvider()根据传入的评判准则,返回一个最佳的地理位置提供者的字符串描述,第二个参数设置为true,则返回所有可用中的最佳的;若为false则返回最佳的,不管是否可用。
getProviders()返回地理位置提供者的字符串描述,参数为true,则返回所有的可用的描述,false则返回所有的。
getProviders()根据传入的评判准则,及第二个参数标识是否可用,来返回地理位置提供者的字符串描述。
List<String> providers = lm.getProviders(true);
for(int i=0; i<providers.size();i++){
System.out.println(providers.get(i));
}

当前是GPS和PASSIVE方式可用:
List<String> providers = lm.getProviders(true);
String lp = null;
if(providers.contains(LocationManager.GPS_PROVIDER)){
lp = LocationManager.GPS_PROVIDER;
}else if(providers.contains(LocationManager.NETWORK_PROVIDER)){
lp = LocationManager.NETWORK_PROVIDER;
}else{
Toast.makeText(this, "当前没有获取地理位置的方式可用,请打开GPS", Toast.LENGTH_LONG).show();
return;
}
Location loc = lm.getLastKnownLocation(lp);
获取了Location实例,就可以从中获取关心的地理信息了:



getLatitude():获取纬度信息,单位度
getLongitude():获取经度信息,单位度
getAltitude():获取海拔信息,单位米
getSpeed():获取速度信息,单位米/秒
getTime():获取时间信息,返回从1970.1.1到现在的毫秒数。
如:
Toast.makeText(MainActivity.this, "纬度:"+location.getLatitude()
+",经度:"+location.getLongitude()+",速度:"+location.getSpeed()+"m/s,"
+"海拔:"+location.getAltitude()+"米", 0).show();

以上,只能获取一次地理位置信息,如何动态实时地获取地理位置信息呢?
这就要用到LocationManager的requestLocationUpdates()方法:

该方法有多重重载形式,这里只简单试用下这种重载形式,参数说明:
provider:指定获取地理位置的方式;
minTime:指定监听位置变化的时间间隔,单位毫秒;
minDistance:指定监听位置变化的最小距离间隔,单位米;
listener:指定监听器,设置不同事件的回调处理。
注意:注册了监听器之后,但应用退出时,应当将注册的监听器移除,可以选择在Activity的onDestroy()方法中,调用LocationManager的removeUpdates(listener)方法,来将requestLocationUpdates()注册的事件监听移除。
如:
listener = new LocationListener() {
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
// TODO Auto-generated method stub
Toast.makeText(MainActivity.this, "onStatusChanged", 0).show();
}
@Override
public void onProviderEnabled(String provider) {
// TODO Auto-generated method stub
Toast.makeText(MainActivity.this, "onProviderEnabled", 0).show();
}
@Override
public void onProviderDisabled(String provider) {
// TODO Auto-generated method stub
Toast.makeText(MainActivity.this, "onProviderDisabled", 0).show();
}
@Override
public void onLocationChanged(Location location) {
// TODO Auto-generated method stub
tv_lat.setText(location.getLatitude()+"");
tv_lng.setText(location.getLongitude()+"");
Toast.makeText(MainActivity.this, "纬度:"+location.getLatitude()
+",经度:"+location.getLongitude()+",速度:"+location.getSpeed()+"m/s,"
+"海拔:"+location.getAltitude()+"米", 0).show();
}
};
lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 5000, 1, listener);
每隔5秒监测下位置的变化情况,一旦距离变化超过1米,就会回调onLocationChanged()方法,并将新的Location实例作为参数传入该方法。
以上,就是简单的获取地理位置的方法,帮助文档中关于LocationManager还有其他一些可能也会用到的方法,如临近警告,测距等,在用到的时候可以再查阅。
2.百度地图控制器的简单使用,设置地图的旋转,缩放,及视角变化:
跟2.x版本不同,之前在控制器中直接就可以调用各个方法进行旋转、缩放等操作,新版的控制器类名为BaiduMap,这里要用到的是它的animateMapStatus()方法:

所有要执行的旋转、缩放等动作没有直接对应的方法,而是把这些地图状态变化的动作封装到MapStatusUpdate对象中,然后传递给BaiduMap的animateMapStatus()以动画的方式执行动作。
所以,这里的关键是获取MapStatusUpdate对象,封装要执行的动作。
但是,查看帮助文档中,MapStatusUpdate类没有任何实际的帮助信息……
但是,有几个相关的类:MapStatus、MapStatus.Builder、MapStatusUpdateFactory。
首先看MapStatus:

有这么几个字段,用于存放地图状态信息,注意文档中说明zoom的取值范围为3-20,overlook的取值是-45-0。但是没有对应的设置方法,所以猜测应该在其内部类Builder中存在相关设置方法
MapStatus.Builder:

构造方法,第二个带参的构造应该会比较有用,要进行地图状态变化,肯定要有一个参照,是在当前状态基础之上进行旋转缩放等。

build()方法返回一个MapStatus对象,如同之前常用到的android中的Builder内部类一样,在进行完一连串的设置之后,最后调用该方法得到一个需要的MapStatus对象。
overlook()方法,设置地图视角,传入一个-45~0的float值
rotate()方法,设置逆时针旋转角度
target()方法,设置地图中心店
targetScreen()方法设置地图中心点在屏幕的坐标
zoom()方法,设置地图的缩放级别。
通过MapStatus.Builder就能获取一个MapStatus对象了,但是需要的却是MapStausUpdate对象。
继续看下一个类:
MapStatusUpdateFactory类:

MapStatusUpdate的工厂类,通过它可以获取到需要的MapStatusUpdate对象:
newMapStatus()方法,可以根据传入的MapStatus获取一个MapStatusUpdate对象;
zoomIn()方法:返回一个放大地图缩放级别的MapStatusUpdate对象
zoomOut()方法:返回一个缩小地图缩放级别的MapStatusUpdate对象
zoomTo()方法:返回一个到指定缩放级别的MapStatusUpdate对象
下面根据这几个类,试着进行地图的旋转、缩放、设置中心点及视角变化:
1)设置缩放级别:
修改布局文件,在MapView下方添加几个控件,用于控制地图缩放:
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
>
<EditText
android:id="@+id/et_level"
android:layout_height="wrap_content"
android:layout_width="0dp"
android:layout_weight="1"
android:inputType="number"
android:hint="@string/et_hint"
/>
<Button
android:id="@+id/btn_set"
android:layout_height="wrap_content"
android:layout_width="0dp"
android:layout_weight="1"
android:onClick="zoomTo"
android:text="@string/btn_set_text"
/>
<Button
android:id="@+id/btn_in"
android:layout_height="wrap_content"
android:layout_width="0dp"
android:layout_weight="1"
android:onClick="zoomIn"
android:text="@string/btn_text_in"/>
<Button
android:id="@+id/btn_out"
android:layout_height="wrap_content"
android:layout_width="0dp"
android:layout_weight="1"
android:onClick="zoomOut"
android:text="@string/btn_out_text"
/>
</LinearLayout>
修改MainActivity.java添加按钮回调方法:
public class MainActivity extends Activity {
private static final String TAG = "MainActivity";
private EditText et_level;
private Button btn_set, btn_in, btn_out;
private MapView mv;
private BaiduMap map;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
SDKInitializer.initialize(getApplicationContext());
setContentView(R.layout.activity_main);
mv = (MapView) findViewById(R.id.mv);
et_level = (EditText) findViewById(R.id.et_level);
map.setOnMapLoadedCallback(new OnMapLoadedCallback() {
@Override
public void onMapLoaded() {
mv.setScaleControlPosition(new Point(20,20));
mv.setZoomControlsPosition(new Point(150,50));
}
});
}
public void zoomTo(View view){
try {
String s_level = et_level.getText().toString();
float level = Float.parseFloat(s_level);
MapStatusUpdate zt = MapStatusUpdateFactory.zoomTo(level);
map.animateMapStatus(zt);
} catch (NumberFormatException e) {
Toast.makeText(this, "请输入正确的缩放级别", Toast.LENGTH_SHORT).show();
}
}
public void zoomIn(View view){
MapStatusUpdate zi = MapStatusUpdateFactory.zoomIn();
map.animateMapStatus(zi);
}
public void zoomOut(View view){
MapStatusUpdate zo = MapStatusUpdateFactory.zoomOut();
map.animateMapStatus(zo);
}
@Override
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
mv.onResume();
}
@Override
protected void onPause() {
// TODO Auto-generated method stub
super.onPause();
mv.onPause();
}
@Override
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
mv.onDestroy();
}
}
运行效果:

2)设置地图中心点:
map.animateMapStatus(MapStatusUpdateFactory.newLatLng(new LatLng(30.757, 103.9339)));
运行结果:

3)旋转地图:
修改布局文件,添加一个旋转按钮:
<Button
android:id="@+id/btn_rot"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:onClick="rotate"
android:text="@string/btn_rot_text"
/>
修改MainActivity.java,添加旋转按钮的回调:
public void rotate(View view){
float r = map.getMapStatus().rotate;
MapStatus ms = new MapStatus.Builder(map.getMapStatus()).rotate(r+30).build();
map.animateMapStatus(MapStatusUpdateFactory.newMapStatus(ms));
}
运行结果:

4)设置视角:
修改布局文件:
<Button
android:id="@+id/btn_up"
android:layout_height="wrap_content"
android:layout_width="0dp"
android:layout_weight="1"
android:onClick="overlook"
android:text="@string/btn_up_text"/>
<Button
android:id="@+id/btn_down"
android:layout_height="wrap_content"
android:layout_width="0dp"
android:layout_weight="1"
android:onClick="overlook"
android:text="@string/btn_down_text"
/>
修改MainActivity.java:添加修改视角的按钮的回调:
public void overlook(View view){
float f = map.getMapStatus().overlook;
MapStatus ms = null;
if(view.getId() == R.id.btn_up){
ms = new MapStatus.Builder(map.getMapStatus()).overlook(f+10).build();
}else{
ms = new MapStatus.Builder(map.getMapStatus()).overlook(f-10).build();
}
map.animateMapStatus(MapStatusUpdateFactory.newMapStatus(ms));
}
运行结果:

android菜鸟学习笔记31----Android使用百度地图API(二)获取地理位置及地图控制器的简单使用的更多相关文章
- android菜鸟学习笔记30----Android使用百度地图API(一)准备工作及在应用中显示地图
1.准备工作: 百度地图API是免费开放的,但是需要申请API Key: 1)先注册一个百度开发者帐号 2)进入百度开放服务平台http://developer.baidu.com/ 3)进入LBS云 ...
- android菜鸟学习笔记29----Android应用向用户发送提示信息的方式总结
常见的向用户发送提示信息的方式有3种,分别为: 1)发送Toast信息 2)弹出对话框 3)发送通知 总结如下: 方式1:发送Toast信息: 这种方式最简单,在之前的学习中多次使用过.Toast是在 ...
- android菜鸟学习笔记24----与服务器端交互(一)使用HttpURLConnection和HttpClient请求服务端数据
主要是基于HTTP协议与服务端进行交互. 涉及到的类和接口有:URL.HttpURLConnection.HttpClient等 URL: 使用一个String类型的url构造一个URL对象,如: U ...
- android菜鸟学习笔记21----ContentProvider(一)ContentProvider的简单使用
ContentProvider是Android四大组件之一,它用来封装数据,并通过ContentResolver接口将数据提供给其他应用.只有当需要在多个应用之间共享数据时才会用到ContentPro ...
- android菜鸟学习笔记7----android布局(二)
3.FrameLayout:帧布局 如同Flash或者photoshop中图层的概念,在上面的图层遮盖下面的图层,没被遮到的地方仍然显示出来. 右击res/layout,然后在弹出的菜单中选择new, ...
- android菜鸟学习笔记2----关于adb
adb : android debug bridge android调试桥 路径:adt-bundle目录/sdk/platform-tools/adb.exe 常见的adb命令: adb devic ...
- android菜鸟学习笔记28----Android中的Service生命周期及本地和远程服务绑定的实现
Service是Android中长期在后台运行的没有界面的组件,使用服务的优势在于:能够提高进程的优先级,系统不容易回收掉进程,即便回收了,内存充足的时候,会把进程重新创建. 1.服务的简单使用示例: ...
- android菜鸟学习笔记17----Android数据存储(一)文件读写
假如有如下需求,要求能够记录用户输入的用户名和密码,下次登录时,能直接获取之前保存的用户名密码,并在相应的EditText中显示. 要保存用户输入的数据,最先想到的应该就是文件读写了. 通过对andr ...
- android菜鸟学习笔记15----Android Junit测试
Android中的Junit测试与Java Junit测试有所不同,不能简单的使用标注…… 假设写了一个MathUtils类,有两个静态方法: public class MathUtils { pub ...
随机推荐
- sencha touch结合webservice读取jsonp数据详解
sencha touch读取jsonp数据主要依靠Ext.data.JsonP组件,在mvc的store文件中定义代码如下: Ext.define('eparkapp.store.ParksNearb ...
- 关于Azure Storage Blob Content-Disposition 使用学习
概述 在常规的HTTP应答中,Content-Disposition 消息头指示回复的内容该以何种形式展示,是以内联的形式(即网页或者页面的一部分),还是以附件的形式下载并保存到本地.通俗的解释就是对 ...
- 有关IM即时通讯原理
在网上搜索了一些资料,谈谈自己对IM即时通讯的理解 IM全称为Instant Messaging,即时通讯,如qq那种的. 现在有两个用户UserA, UserB, 俩人是一个IM通讯软件的好友,Us ...
- systemd 管理python 程序
[Unit] Description = test-minapp After = network.target [Service] PermissionsStartOnly = true PIDFil ...
- 转: android emulator 命令详解
在命令行输入: emulator -help,即可显示emulator支持的所有命令. Android Emulator usage: emulator [options] [-qemu args] ...
- silverlight RadGridView总结三(转载)
在RadGridView中进行分组以及导出 分组 主要是在前台进行分组的定义: 前台代码: <telerik:RadGridView x:Name="RadGridView1" ...
- 一个关于原生 js 开发一款插件的前端教程
教程链接: http://www.codeasily.net/course/plugin_course/ 写的不是很好,前面比较松后面比较急,请大家见谅,本人也没多少年前端经验,拿以前写过的教程网站, ...
- 从零开始学习SSH框架笔记之四 几个关键配置文件备忘(模板)
不多说,直接上代码.关于注释我尽量写详细点. 1.web.xml <?xml version="1.0" encoding="UTF-8"?> &l ...
- Java中的动态代理以及Proxy类的偷瞄
动态代理机制 所谓动态代理,即通过代理类Proxy的代理,接口和实现类之间可以不直接发生联系,而可以在运行期(Runtime)实现动态关联. Java动态代理类位于Java.lang.reflect包 ...
- Android-X86 VirtualBox 安装安卓后的一些设置
可以用虚拟机设置双显卡,一个用于调试,一个用于连接外网 一个桥接一个host only 安卓Home键 -> Win键 安装返回键 -> ESC键 ALT + F1 调出管理员控制台 AL ...