Android中级篇之基于百度地图Android(安卓)SDK v3.4.0开发实现定位
16lz
2021-01-25
Android中级篇之基于百度地图Android SDK v3.4.0开发实现定位
我们先来看看我们需要哪些包:
这几个包都可以在百度地图API官网下载链接。
给一个百度地图API官网
package com.jzlg.excellentwifi.activity;import com.baidu.location.BDLocation;import com.baidu.location.BDLocationListener;import com.baidu.location.LocationClient;import com.baidu.location.LocationClientOption;import com.baidu.location.LocationClientOption.LocationMode;import com.baidu.mapapi.SDKInitializer;import com.baidu.mapapi.map.BaiduMap;import com.baidu.mapapi.map.MapStatusUpdate;import com.baidu.mapapi.map.MapStatusUpdateFactory;import com.baidu.mapapi.map.MapView;import com.baidu.mapapi.map.MyLocationData;import com.baidu.mapapi.model.LatLng;import com.jzlg.excellentwifi.R;import android.content.Context;import android.os.Bundle;import android.view.Menu;import android.view.MenuItem;import android.widget.Toast;public class MapActivity extends BaseActivity { private Context context; private MapView mMapView; private BaiduMap mbaiduMap; // 定位相关 private LocationClient mLocationClient; private MyLocationListener mLocationListener; private boolean isFirstIn = true; private double mLatitude;//纬度 private double mLongitude;//经度 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 在使用SDK各组件之前初始化context信息,传入ApplicationContext // 注意该方法要在setContentView方法之前实现 SDKInitializer.initialize(getApplicationContext()); setContentView(R.layout.layout_map); this.context = this; // 初始化组件 initView(); // 初始化定位 initLocation(); } // 定位初始化 private void initLocation() { mLocationClient = new LocationClient(this); // 定位监听器 mLocationListener = new MyLocationListener(); // 注册 mLocationClient.registerLocationListener(mLocationListener); // 设置一些必要的配置 setLocationOption(); mLocationClient.start(); } //定位设置 private void setLocationOption(){ LocationClientOption option = new LocationClientOption(); option.setCoorType("db09ll");// 返回的定位结果是百度经纬度,默认值gcj02 option.setAddrType("all");//返回的定位结果包含地址信息 option.setIsNeedAddress(true);// 位置,一定要设置,否则后面得不到地址 option.setOpenGps(true);// 打开GPS option.setScanSpan(10000);// 多长时间进行一次请求 option.setLocationMode(LocationMode.Battery_Saving);// 网络定位优先 mLocationClient.setLocOption(option);// 使用设置 } private void initView() { // 获取地图控件引用 mMapView = (MapView) findViewById(R.id.map_bmapView); mbaiduMap = mMapView.getMap(); // 设置地图放大缩小参数 MapStatusUpdate msu = MapStatusUpdateFactory.zoomTo(15.0f); mbaiduMap.setMapStatus(msu); } // 菜单 @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.menu_map, menu); return true; } // 菜单点击方法 @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { // 普通 case R.id.map_common: mbaiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL); break; // 卫星 case R.id.map_site: mbaiduMap.setMapType(BaiduMap.MAP_TYPE_SATELLITE); break; // 实时 case R.id.map_traffic: // 是否显示了实时地图 if (mbaiduMap.isTrafficEnabled()) { mbaiduMap.setTrafficEnabled(false); item.setTitle("实时交通off"); } else { mbaiduMap.setTrafficEnabled(true); item.setTitle("实时交通on"); } break; case R.id.map_location: centerToMyLocation(); break; default: break; } return super.onOptionsItemSelected(item); } // 定位到我的位置 private void centerToMyLocation() { LatLng latLng = new LatLng(mLatitude, mLongitude); // 设置经纬度 MapStatusUpdate msu = MapStatusUpdateFactory.newLatLng(latLng); mbaiduMap.animateMapStatus(msu); } @Override protected void onDestroy() { mLocationClient.stop(); mbaiduMap.setMyLocationEnabled(false); // 在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理 mMapView.onDestroy(); mMapView = null; super.onDestroy(); } @Override protected void onResume() { // 在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理 mMapView.onResume(); super.onResume(); } @Override protected void onStart() { // 开启定位允许 mbaiduMap.setMyLocationEnabled(true); if (!mLocationClient.isStarted()) { mLocationClient.start(); } super.onStart(); } @Override protected void onStop() { // 停止定位 mbaiduMap.setMyLocationEnabled(false); mLocationClient.stop(); super.onStop(); } @Override protected void onPause() { // 在activity执行onPause时执行mMapView. onPause (),实现地图生命周期管理 mMapView.onPause(); super.onPause(); } private class MyLocationListener implements BDLocationListener { // 定位成功之后的回调 @Override public void onReceiveLocation(BDLocation location) { MyLocationData data = new MyLocationData.Builder()// 经度 .accuracy(location.getRadius())// .latitude(location.getLatitude())// .longitude(location.getLongitude())// .build(); //设置我的定位 mbaiduMap.setMyLocationData(data); //取出经纬度 mLatitude = location.getLatitude(); mLongitude = location.getLongitude(); //是否是第一次定位 if (isFirstIn) { LatLng latLng = new LatLng(location.getLatitude(), location.getLongitude()); // 设置经纬度 MapStatusUpdate msu = MapStatusUpdateFactory.newLatLng(latLng); mbaiduMap.animateMapStatus(msu); isFirstIn = false; } Toast.makeText( context, "定位成功:纬度" + location.getLatitude() + "经度:" + location.getLongitude() + "地址是:" + location.getAddrStr()+"城市是:"+location.getCity(), 0).show(); } }}
以上是Activity的代码,下面就是我们的布局文件了
我取名是:layout_map.xml
当然了,大家可以自己取名
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <com.baidu.mapapi.map.MapView android:id="@+id/map_bmapView" android:layout_width="fill_parent" android:layout_height="fill_parent" android:clickable="true" /></LinearLayout>
那么说完了布局,我们来看看我们的清单文件AndroidManifest.xml是怎么写的,需要注意哪些事项,呈上我们的清单文件AndroidManifest.xml:
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.jzlg.excellentwifi" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="14" /> <!-- 以下是使用wifi访问网络所需的权限 --> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" /> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> <!-- 使用百度地图所需的权限 --> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.GET_ACCOUNTS" /> <uses-permission android:name="android.permission.USE_CREDENTIALS" /> <uses-permission android:name="android.permission.MANAGE_ACCOUNTS" /> <uses-permission android:name="android.permission.AUTHENTICATE_ACCOUNTS" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.BROADCAST_STICKY" /> <uses-permission android:name="android.permission.WRITE_SETTINGS" /> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" /> <uses-permission android:name="android.permission.READ_LOGS" /> <uses-permission android:name="android.permission.VIBRATE" /> <uses-permission android:name="android.permission.WAKE_LOCK" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <meta-data android:name="com.baidu.lbsapi.API_KEY" android:value="qkGCDjO9o5Ey62NINwYra7nS" /> <!-- 注册MapActivity --> <activity android:name="com.jzlg.excellentwifi.activity.MapActivity" > <!-- 设置主活动 --> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <!-- 注册LocationDemo --> <activity android:name="com.jzlg.excellentwifi.activity.LocationDemo"> </activity> <!-- 定位服务 --> <service android:name="com.baidu.location.f" android:enabled="true" android:process=":remote" > <intent-filter> <action android:name="com.baidu.location.service_v2.2" /> </intent-filter> </service> </application></manifest>
这里需要注意的是,wifi访问网络所需的权限和百度地图所需权限都需要,之所以我分了两个说明,但是需要全部写上,否则会定位失败!
y1笑而过的CSDN博客
y1笑而过的博客园
y1笑而过的新浪博客
y1笑而过的安卓巴士博客
y1笑而过的51CTO技术博客
更多相关文章
- Android百度地图开发
- Android--使用手机GPS获取经纬度
- android 百度地图获取左上角和右下角的坐标
- Android中本地图片资源以及视频录音资源的获取
- Android用RecyclerView实现动态添加本地图片
- 在Android中使用Google map
- android实现百度地图点击覆盖物(MyLocationOverlay)弹出自定义弹
- android ImageButton显示本地图片
- android使用百度地图获取自己所在的城市名