Android基于位置的服务开发,百度地图的使用
来源:互联网 发布:parent:: php 编辑:程序博客网 时间:2024/05/16 05:32
简介
基于位置的服务LBS(Location Based Server),这是只有在移动设备上才能实现的技术,由于移动设备可以随身携带,我们通过地理定位的技术就可以随时得知自己所在的位置。主要的工作原理就是利用无线电通讯网络或GPS等定位方式来确定移动设备所在的位置。
下面主要就百度地图显示,定位等做一些简单的介绍
使用百度地图
申请APIkey
首先要注册一个百度账号,然后登陆百度账号,然后到百度地图API页面,注册成为一名百度开发者。然后创建应用,选择应用类型Android SDK,然后输入安全码即可。
操作具体过程:
http://developer.baidu.com/map/index.php?title=androidsdk/guide/key
地图
环境配置
首先下载Android地图SDK,解压。然后配置环境。以Android Studio为例:
**第一步:在工程app/libs目录下放入baidumapapi_vX_X_X.jar包,在src/main/目录下新建jniLibs目录,放入libBaiduMapSDK_vX_X_X_X.so如下图所示,注意jar和so的前3位版本号必须一致,并且保证使用一次下载的文件夹中的两个文件,不能不同功能组件的jar或so交叉使用。
第二步:导入jar包。菜单栏选择File->Project Structor->Modules->Dependencies,点击+号,选择File dependency,选择jar包导入。**
操作具体过程:
http://developer.baidu.com/map/index.php?title=androidsdk/guide/buildproject
显示地图
第一步:创建并配置工程(具体方法参见工程配置部分的介绍);
第二步:在AndroidManifest中添加开发密钥、所需权限等信息;
(1)在application中添加开发密钥
(2)添加所需权限
第三步,在布局xml文件中添加地图控件;
第四步,在应用程序创建时初始化 SDK引用的Context 全局变量:
第五步,创建地图Activity,管理地图生命周期;
操作具体过程:
http://developer.baidu.com/map/index.php?title=androidsdk/guide/hellobaidumap
定位
环境配置
同样的首先下载Android定位SDK,解压。然后配置环境。把jar包拷入libs文件中,将so包拷入jniLibs文件中,最后导入jar包。过程跟上面的一样。
实现定位
第一步:在application标签中声明service组件,每个app拥有自己单独的定位service
<service android:name="com.baidu.location.f" android:enabled="true" android:process=":remote"></service>
第二步:声明使用权限
第三步:设置AcessKey
<meta-data android:name="com.baidu.lbsapi.API_KEY" android:value="key" /> //key:开发者申请的key
第四步:使用综合定位功能
1. 初始化LocationClient类
LocationClient类必须在主线程中声明。需要Context类型的参数。Context需要时全进程有效的context,推荐用getApplicationConext获取全进程有效的context
2. 配置定位SDK参数
设置定位参数包括:定位模式(高精度定位模式,低功耗定位模式和仅用设备定位模式),返回坐标类型,是否打开GPS,是否返回地址信息、位置语义化信息、POI信息等等。
3. 实现BDLocationListener接口
BDLocation类,封装了定位SDK的定位结果,在BDLocationListener的onReceive方法中获取。通过该类用户可以获取error code,位置的坐标,精度半径等信息。
4. 开始定位。
start():启动定位SDK。 stop():关闭定位SDK。调用start之后只需要等待定位结果自动回调即可。
操作具体过程:
http://developer.baidu.com/map/index.php?title=android-locsdk/guide/v5-0
代码示例
环境的配置就不再赘述,声明的权限和服务组件也不再重复。
下面主要让我们输出一个城市和具体的地址,点击开始搜索按钮,地图显示并标记出来,然后点击定位按钮,显示并标记当前位置,最后点击开始连线,将两地连接起来。
我们的布局:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context=".MainActivity"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <EditText android:id="@+id/edit_city" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:hint="城市"/> <EditText android:id="@+id/edit_address" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:hint="地址"/> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <Button android:id="@+id/button_ss" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="开始搜索"/> <Button android:id="@+id/button_dw" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="开始定位"/> <Button android:id="@+id/button_lx" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="开始连线"/> </LinearLayout> <com.baidu.mapapi.map.MapView android:id="@+id/bmapView" android:layout_width="fill_parent" android:layout_height="fill_parent" android:clickable="true" /></LinearLayout>
然后是主活动的代码:
import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.View;import android.widget.Button;import android.widget.EditText;import android.widget.Toast;import com.baidu.mapapi.SDKInitializer;import com.baidu.mapapi.map.BaiduMap;import com.baidu.mapapi.map.BitmapDescriptorFactory;import com.baidu.mapapi.map.MapStatusUpdateFactory;import com.baidu.mapapi.map.MapView;import com.baidu.mapapi.map.MarkerOptions;import com.baidu.mapapi.map.OverlayOptions;import com.baidu.mapapi.map.PolylineOptions;import com.baidu.mapapi.model.LatLng;import com.baidu.mapapi.search.core.SearchResult;import com.baidu.mapapi.search.geocode.GeoCodeOption;import com.baidu.mapapi.search.geocode.GeoCodeResult;import com.baidu.mapapi.search.geocode.GeoCoder;import com.baidu.mapapi.search.geocode.OnGetGeoCoderResultListener;import com.baidu.mapapi.search.geocode.ReverseGeoCodeResult;import com.baidu.location.BDLocation;import com.baidu.location.BDLocationListener;import com.baidu.location.LocationClient;import com.baidu.location.LocationClientOption;import com.baidu.location.BDNotifyListener;//假如用到位置提醒功能,需要import该类import java.util.ArrayList;import java.util.List;public class MainActivity extends AppCompatActivity { private MapView mMapView; private GeoCoder mSearch; // 搜索模块,也可去掉地图模块独立使用 private BaiduMap mBaiduMap; private List<LatLng> points; private LocationClient mLocationClient; private BDLocationListener myListener; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //在使用SDK各组件之前初始化context信息,传入ApplicationContext //注意该方法要再setContentView方法之前实现 SDKInitializer.initialize(getApplicationContext()); setContentView(R.layout.activity_main); //获取地图控件引用 mMapView = (MapView) findViewById(R.id.bmapView); mBaiduMap = mMapView.getMap(); points = new ArrayList<LatLng>(); myListener = new MyLocationListener(); mLocationClient = new LocationClient(getApplicationContext()); //声明LocationClient类 mLocationClient.registerLocationListener(myListener); //注册监听函数 // 初始化搜索模块,注册事件监听 mSearch = GeoCoder.newInstance(); mSearch.setOnGetGeoCodeResultListener(new OnGetGeoCoderResultListener() { @Override public void onGetGeoCodeResult(GeoCodeResult geoCodeResult) { if (geoCodeResult == null || geoCodeResult.error != SearchResult.ERRORNO.NO_ERROR) { Toast.makeText(MainActivity.this, "抱歉,未能找到结果", Toast.LENGTH_LONG) .show(); return; } mBaiduMap.addOverlay(new MarkerOptions().position(geoCodeResult.getLocation()) .icon(BitmapDescriptorFactory .fromResource(R.mipmap.icon_marka))); mBaiduMap.setMapStatus(MapStatusUpdateFactory.newLatLng(geoCodeResult .getLocation())); String strInfo = String.format("纬度:%f 经度:%f", geoCodeResult.getLocation().latitude, geoCodeResult.getLocation().longitude); points.add(geoCodeResult.getLocation()); Toast.makeText(MainActivity.this, strInfo, Toast.LENGTH_LONG).show(); } @Override public void onGetReverseGeoCodeResult(ReverseGeoCodeResult reverseGeoCodeResult) { } }); Button button_ss = (Button) findViewById(R.id.button_ss); button_ss.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { EditText editText_city = (EditText) findViewById(R.id.edit_city); EditText editText_address = (EditText) findViewById(R.id.edit_address); mSearch.geocode(new GeoCodeOption().city( editText_city.getText().toString()).address( editText_address.getText().toString())); } }); Button button_dw = (Button) findViewById(R.id.button_dw); button_dw.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { initLocation(); mLocationClient.start(); } }); Button button_lx = (Button) findViewById(R.id.button_lx); button_lx.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 添加折线 OverlayOptions ooPolyline = new PolylineOptions().width(10) .color(0xAAFF0000).points(points); mBaiduMap.addOverlay(ooPolyline); } }); } @Override protected void onDestroy() { super.onDestroy(); //在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理 mMapView.onDestroy(); } @Override protected void onResume() { super.onResume(); //在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理 mMapView.onResume(); } @Override protected void onPause() { super.onPause(); //在activity执行onPause时执行mMapView. onPause (),实现地图生命周期管理 mMapView.onPause(); } private void initLocation() { LocationClientOption option = new LocationClientOption(); option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy );//可选,默认高精度,设置定位模式,高精度,低功耗,仅设备 option.setCoorType("bd09ll");//可选,默认gcj02,设置返回的定位结果坐标系 int span = 1000; option.setScanSpan(span);//可选,默认0,即仅定位一次,设置发起定位请求的间隔需要大于等于1000ms才是有效的 option.setIsNeedAddress(true);//可选,设置是否需要地址信息,默认不需要 option.setOpenGps(true);//可选,默认false,设置是否使用gps option.setLocationNotify(true);//可选,默认false,设置是否当gps有效时按照1S1次频率输出GPS结果 option.setIsNeedLocationDescribe(true);//可选,默认false,设置是否需要位置语义化结果,可以在BDLocation.getLocationDescribe里得到,结果类似于“在北京天安门附近” option.setIsNeedLocationPoiList(true);//可选,默认false,设置是否需要POI结果,可以在BDLocation.getPoiList里得到 option.setIgnoreKillProcess(false);//可选,默认false,定位SDK内部是一个SERVICE,并放到了独立进程,设置是否在stop的时候杀死这个进程,默认杀死 option.SetIgnoreCacheException(false);//可选,默认false,设置是否收集CRASH信息,默认收集 option.setEnableSimulateGps(false);//可选,默认false,设置是否需要过滤gps仿真结果,默认需要 mLocationClient.setLocOption(option); } class MyLocationListener implements BDLocationListener { @Override public void onReceiveLocation(BDLocation location) { if (location.getLocType() == BDLocation.TypeGpsLocation || location.getLocType() == BDLocation.TypeNetWorkLocation) { LatLng point = new LatLng(location.getLatitude(), location.getLongitude()); points.add(point); mBaiduMap.addOverlay(new MarkerOptions().position(point) .icon(BitmapDescriptorFactory .fromResource(R.mipmap.icon_marka))); mBaiduMap.setMapStatus(MapStatusUpdateFactory.newLatLng(point)); mLocationClient.stop(); } } }}
- Android基于位置的服务开发,百度地图的使用
- Android 基于位置的开发与百度地图(一)
- Android 基于位置的开发与百度地图 (二)
- Android实战--基于位置的服务(获取自己位置的经纬度+百度地图)
- Android学习-- 基于位置的服务 LBS(基于百度地图Android SDK)--定位SDK
- 基于位置的服务——百度地图SDK练习
- 基于Android的百度地图开发
- Android 特色开发,基于位置的服务
- Android 特色开发,基于位置的服务
- (android地图开发) 基于百度Lbs服务定位用户的当前位置
- Android基于位置的服务小项目使用百度LBS SDK遇见的一系列问题及解决方法
- android开发中百度地图的使用
- Android基于位置的服务
- Android 基于位置的服务
- android开发游记:百度地图SDK基础地图的使用
- Android百度地图显示附近的位置
- Android百度地图,定位自己的位置。
- 使用百度地图 显示自己的位置
- 关于js中的闭包
- [转载]Matlab fmincon函数用法
- ios textfied文本框设置代码
- 网络3层相关的几个问题
- 移动IM开发学习<4>
- Android基于位置的服务开发,百度地图的使用
- 在VNC中Xfce4中Tab键失效的解决方法
- SQlite常用语句
- swift--枚举
- Android Studio 插件--postfix
- 安卓:handler解析json新闻,显示图片,标题,内容(未判断网络连接状态)
- Mysql查看表的结构相关命令
- Vijos1313 金明的预算方案
- 生成伪随机整数rand()