AndroidStudio 中使用 百度地图 <四> 百度地图实现打开就显示当前位置,个人摘要
0:注册keyhttp://lbsyun.baidu.com/apiconsole/key/create关于如何创建SHA1 请参考:里面的AndroidStudio 中使用 百度地图百度地图的导入和集成,个人摘要得到key 0vuea4B0323lkNglN6Rbekbk1:然后将百度SDK集成进去,
0:注册key
http://lbsyun.baidu.com/apiconsole/key/create
关于如何创建SHA1 请参考:里面的AndroidStudio 中使用 百度地图 <一> 百度地图的导入和集成,个人摘要
得到key 0vuea4B0323lkNglN6Rbekbk
1:然后将百度SDK集成进去,以及将百度定位的SDK也集成进去,
下载百度SDK,然后导入Android Studio 中,进行集成,
---------------------------------------
将jar包放到libs 里面,然后右键,在菜单里面选择“add as libary”
然后再main 的文件夹下新建jniLibs。
将除了jar文件的文件夹放到jniLibs里面了。
点击rebuild,或者右边栏的gradle的刷新按钮。
--------------------------------------
下载后,进行集成,和上面一样,
2:导入key,以及权限,还有service
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" /> <uses-permission android:name="android.permission.WAKE_LOCK"/> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.GET_TASKS" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.WRITE_SETTINGS" /> <!-- 这个权限用于进行网络定位--> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission> <!-- 这个权限用于访问GPS定位--> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission> <!-- 用于访问wifi网络信息,wifi信息会用于进行网络定位--> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission> <!-- 获取运营商信息,用于支持提供运营商信息相关的接口--> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission> <!-- 这个权限用于获取wifi的获取权限,wifi信息会用来进行网络定位--> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission> <!-- 用于读取手机当前的状态--> <uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission> <!-- 写入扩展存储,向扩展卡写入数据,用于写入离线定位数据--> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission> <!-- 访问网络,网络定位需要上网--> <uses-permission android:name="android.permission.INTERNET" /> <!-- SD卡读取权限,用户写入离线定位数据--> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"></uses-permission>
<application 。。。。 <meta-data android:name="com.baidu.lbsapi.API_KEY" android:value="0vuea4B0323lkNglN6Rbekbk" /> <service android:name="com.baidu.location.f" android:enabled="true" android:process=":remote"> </service>
。。。 </application> </manifest>
3:然后在onCreate 方法里面执行
SDKInitializer.initialize(getApplicationContext());
记住一定要在setContentView 之前
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); SDKInitializer.initialize(getApplicationContext()); setContentView(R.layout.activity_main); } }
4: 布局里面添加一个MapView
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout 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:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <com.baidu.mapapi.map.MapView android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/mapView" /> </RelativeLayout>
5:然后在onCreate方法里面获取,记得在onPause,onResume 和onDestroy的方法里面要对MapView 的声明周期做相应的操作。
并且通过这个MapView 获取一个map的对象。
public class MainActivity extends AppCompatActivity implements BDLocationListener { private MapView mMapView; private BaiduMap mMap; private LocationClient mLocationClient; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); SDKInitializer.initialize(getApplicationContext()); setContentView(R.layout.activity_main); mMapView = (MapView)findViewById(R.id.mapView); mMap = mMapView.getMap(); 。。。。 } @Override protected void onDestroy() { super.onDestroy(); mMapView.onDestroy(); } @Override protected void onPause() { super.onPause(); mMapView.onPause(); } @Override protected void onResume() { super.onResume(); mMapView.onResume(); } }
6:开始定位
首先定位客户端的创建和注册定位监听器,然后设置定位的选项,然后就是启动定位。
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); SDKInitializer.initialize(getApplicationContext()); setContentView(R.layout.activity_main); mMapView = (MapView)findViewById(R.id.mapView); mMap = mMapView.getMap(); //注册定位客户端,并且注册定位监听器 mLocationClient = new LocationClient(this); mLocationClient.registerLocationListener(this); //创建定位客户端的 选项 ,在这里面设置 定位的类型,CoorType,以及是否打开Gps,间隔事件ScanSpan LocationClientOption options = new LocationClientOption(); options.setLocationMode(LocationClientOption.LocationMode.Battery_Saving); options.setCoorType("bd09ll");//latitue longtitute options.setOpenGps(true); options.setIsNeedAddress(true); options.setProdName("xueziqiang"); options.setScanSpan(5000); //将定位的选项 赋值给 定位的客户端,并且 启动 mLocationClient.setLocOption(options); mLocationClient.start();//注意这里 要用到 start而不是mLocationClient.requestLocation() }
6:然后就是监听器的回调里面设置一个标记,这个标记就是当前位置,并且更新MapView当前的中心为当前的位置
//回调方法,mLocationClient.start的 回调方法, @Override public void onReceiveLocation(BDLocation bdLocation) { //注意 这个 LatLng,它用与设置 标记的位置和 Map的中心点的位置 。 LatLng latLng = new LatLng(bdLocation.getLatitude(),bdLocation.getLongitude()); MarkerOptions options = new MarkerOptions(); options.position(latLng); options.draggable(true); //必须要设置option的icon,而且 这个 icon 必须是BitmapDescriptor的。 BitmapDescriptor bitmapFactory = BitmapDescriptorFactory.fromResource(R.mipmap.ic_launcher); options.icon(bitmapFactory); mMap.addOverlay(options); //设置获取的位置为中心点 。这里面的 参数是 LatLng MapStatusUpdate mapStatus = MapStatusUpdateFactory.newLatLng(latLng); mMap.setMapStatus(mapStatus); Log.d("kodulf","Latitude is"+bdLocation.getLatitude()+" lotitude is"+ bdLocation.getLongitude()+" "+latLng.toString()); }
7:因为之前注册了监听器,那么现在就要取消掉,并且停止,更新onDestory的方法
@Override protected void onDestroy() { super.onDestroy(); mMapView.onDestroy(); mLocationClient.unRegisterLocationListener(this); //千万别忘了这个stop,如果不stop那么会继续执行 mLocationClient.stop(); }
8:因为不能够每次服务查询当前位置的时候都创建一个标记,所以将标记变成一个成员变量。
//为了不每次获取当前位置的时候都创建标记,将标记设置为成员变量 private Marker mMarker; //回调方法,mLocationClient.start的 回调方法, @Override public void onReceiveLocation(BDLocation bdLocation) { //注意 这个 LatLng,它用与设置 标记的位置和 Map的中心点的位置 。 LatLng latLng = new LatLng(bdLocation.getLatitude(),bdLocation.getLongitude()); if(mMarker==null) { MarkerOptions options = new MarkerOptions(); options.position(latLng); options.draggable(true); //必须要设置option的icon,而且 这个 icon 必须是BitmapDescriptor的。 BitmapDescriptor bitmapFactory = BitmapDescriptorFactory.fromResource(R.mipmap.ic_launcher); options.icon(bitmapFactory); //第一次的时候,通过强制类型转换将mMap.addOverlay(options) 变成Marker,因为它返回的其实是Overlay的 //Overlay和Marker的父类,所以要强制类型转换 mMarker=(Marker)mMap.addOverlay(options); }else{ mMarker.setPosition(latLng); } //设置获取的位置为中心点 。这里面的 参数是 LatLng MapStatusUpdate mapStatus = MapStatusUpdateFactory.newLatLng(latLng); mMap.setMapStatus(mapStatus); Log.d("kodulf","Latitude is"+bdLocation.getLatitude()+" lotitude is"+ bdLocation.getLongitude()+" "+latLng.toString()); }
9:为了设置缩放级别:
mMap.setMapStatus(MapStatusUpdateFactory.newMapStatus(newMapStatus.Builder().zoom(15).build()));
+++++++++++++++++++++++++++++++++++++
总体的代码在这里:
更多推荐
所有评论(0)