基于位置的服务——百度地图SDK练习
来源:互联网 发布:linux查看版本命令 编辑:程序博客网 时间:2024/05/18 01:57
基于位置的服务所围绕的核心就是要先确定出用户所在的位置。通常有两种技术方式可以实现:一种是通过GPS定位,一种是通过网络定位。Android对这两种定位方式都提供了相应的API支持。但由于众所周知的原因,Google的网络服务不能使用,而GPS定位必须要在室外才可以使用。所以使用了国内第三方公司——百度的SDK。
首先是申请百度地图API Key,之后下载SDK,将解压的文件放到下图所示的位置。
接下来直接放代码:
AndroidManifest.xml——用户权限
<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.lbstest"> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <uses-permission android:name="android.permission.ACCESS_CHANGE_WIFI_STATE"/> <uses-permission android:name="android.permission.READ_PHONE_STATE"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/> <uses-permission android:name="android.permission.WAKE_LOCK"/> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> <meta-data android:name="com.baidu.lbsapi.API_KEY" android:value="A07VXXmueNToMFnf6q7xXBjHfyDc1sGA"/> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <service android:name="com.baidu.location.f" android:enabled="true" android:process=":remote"> </service> </application></manifest>
其中android:value=”A07VXXmueNToMFnf6q7xXBjHfyDc1sGA”是申请后由百度提供的API Key。
activity_main.xml——布局文件
<?xml version="1.0" encoding="utf-8"?><android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.example.lbstest.MainActivity"> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="368dp" android:layout_height="495dp" tools:layout_editor_absoluteY="8dp" tools:layout_editor_absoluteX="8dp"> <TextView android:id="@+id/position_text_view" android:layout_width="wrap_content" android:layout_height="wrap_content" android:visibility="gone"/> <com.baidu.mapapi.map.MapView android:id="@+id/bmapView" android:layout_width="match_parent" android:layout_height="match_parent" android:clickable="true"/> </LinearLayout></android.support.constraint.ConstraintLayout>
MainActivity.java
package com.example.lbstest;import android.Manifest;import android.content.pm.PackageManager;import android.support.v4.app.ActivityCompat;import android.support.v4.content.ContextCompat;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.widget.TextView;import android.widget.Toast;import com.baidu.location.BDLocation;import com.baidu.location.BDLocationListener;import com.baidu.location.LocationClient;import com.baidu.location.LocationClientOption;import com.baidu.mapapi.SDKInitializer;import com.baidu.mapapi.map.BaiduMap;import com.baidu.mapapi.map.MapStatus;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 java.util.ArrayList;import java.util.List;public class MainActivity extends AppCompatActivity { public LocationClient mLocationClient; private TextView positionText; private MapView mapView; private BaiduMap baiduMap; private boolean isFirstLocate=true; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mLocationClient = new LocationClient(getApplicationContext()); mLocationClient.registerLocationListener(new MyLocationListener()); SDKInitializer.initialize(getApplicationContext()); setContentView(R.layout.activity_main); mapView=(MapView) findViewById(R.id.bmapView); baiduMap=mapView.getMap(); baiduMap.setMyLocationEnabled(true); positionText = (TextView) findViewById(R.id.position_text_view); List<String> permissionList = new ArrayList<>(); if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest. permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) { permissionList.add(Manifest.permission.ACCESS_FINE_LOCATION); } if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest. permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) { permissionList.add(Manifest.permission.READ_PHONE_STATE); } if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest. permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { permissionList.add(Manifest.permission.WRITE_EXTERNAL_STORAGE); } if (!permissionList.isEmpty()) { String[] permission = permissionList.toArray(new String[permissionList.size()]); ActivityCompat.requestPermissions(MainActivity.this, permission, 1); } else { requestLocation(); } } private void requestLocation() { initLocation(); mLocationClient.start(); mLocationClient.requestLocation(); } private void initLocation(){ LocationClientOption option=new LocationClientOption(); option.setScanSpan(5000); option.setIsNeedAddress(true); mLocationClient.setLocOption(option); } @Override protected void onResume(){ super.onResume(); mapView.onResume(); } @Override protected void onPause(){ super.onPause(); mapView.onPause(); } @Override protected void onDestroy(){ super.onDestroy(); mLocationClient.stop(); mapView.onDestroy(); baiduMap.setMyLocationEnabled(false); } @Override public void onRequestPermissionsResult(int requestCode,String[] permission,int[] grantResults) { switch (requestCode) { case 1: if (grantResults.length > 0) { for (int result : grantResults) { if (result != PackageManager.PERMISSION_GRANTED) { Toast.makeText(this, "必须同意所有权限才能使用本程序", Toast.LENGTH_SHORT).show(); finish(); return; } } requestLocation(); } else { Toast.makeText(this, "发生未知错误", Toast.LENGTH_SHORT).show(); finish(); } break; default: } } private void navigateTo(BDLocation location){ if (isFirstLocate){ LatLng ll=new LatLng(location.getLatitude(),location.getLongitude()); MapStatusUpdate update= MapStatusUpdateFactory.newLatLng(ll); baiduMap.animateMapStatus(update); update=MapStatusUpdateFactory.zoomTo(16f); baiduMap.animateMapStatus(update); isFirstLocate=false; } MyLocationData.Builder locationBuilder=new MyLocationData.Builder(); locationBuilder.latitude(location.getLatitude()); locationBuilder.longitude(location.getLongitude()); MyLocationData locationData=locationBuilder.build(); baiduMap.setMyLocationData(locationData); } public class MyLocationListener implements BDLocationListener{ @Override public void onReceiveLocation(BDLocation location){ if (location.getLocType()==BDLocation.TypeGpsLocation ||location.getLocType()==BDLocation.TypeNetWorkLocation){ navigateTo(location); } } }}
上述程序是最终的程序,在最初的程序运行中出现了以下问题:
1、界面空白,只显示网格
原因一是没能成功调用百度api,原因在于申请百度地图key时的包名与创建项目的包名不一致。在创建项目时,填入的包名是com.example.lbstest,然而在打开project时我的包名变成了lbstest.example.com.lbstest,导致api无法导入。原因二是创建的项目名与包名必须与你在百度地图key上申请的一致,后来又重新申请了一个key,之后便显示出了地图。另外我以为创建项目时填入的Company Domain就是包名,从而造成错误的产生,其实Company Domain表示公司域名,并不是所谓包名称,包名在公司域名的下面。
2、无法定位到自己的位置,只显示默认地点
在mLocationClient.start();后加mLocationClient.requestLocation();发起定位。
3、定位不准确,误差大
从上图中看出误差较大,实际位置为一教,确偏移了几公里。解决方法:要用百度地图的定位坐标,否则是有偏差的。在BDLocation location 获取坐标系的时候, 在代码LocationClientOption option = new LocationClientOption();后加上option.setCoorType(“bd09ll”);进行坐标转换,不加的话option类型默认gcj02,会产生偏移,需要注意的是bd09ll的l是L的小写,不是数字1。
最终结果:
地图不是全屏显示,猜测是由于程序起初布局了一个文本用来显示经纬、街道等信息,在后期将其隐藏所致。
- 基于位置的服务——百度地图SDK练习
- Android学习-- 基于位置的服务 LBS(基于百度地图Android SDK)--定位SDK
- Android基于位置的服务开发,百度地图的使用
- 基于地图的短信追踪小练习(2)百度地图定位到自己的位置
- Android实战--基于位置的服务(获取自己位置的经纬度+百度地图)
- Android基于位置的服务小项目使用百度LBS SDK遇见的一系列问题及解决方法
- 百度地图最新版本sdk使用系列(二)-修改百度地图的默认中心位置
- Android 基于位置的开发与百度地图(一)
- Android 基于位置的开发与百度地图 (二)
- 基于百度地图SDK集成的一些功能
- 百度地图开发( 基于新版本V2_1_1)— 覆盖物(1)_我的位置图层(MyLocationOverlay)
- iOS百度地图SDK总结—百度地图只显示灰色的格子
- 百度地图SDK for Android【检索服务】
- 百度地图SDK集成搜索服务
- 百度地图SDK for Android【检索服务】
- 基于百度定位SDK的定位服务的实现
- 基于百度定位SDK的定位服务的实现
- Android--定位 基于百度地图SDK
- Linux下启用RNDIS host端与device端
- sleep和wait的区别
- 协调者布局 实现上下滑动
- Eclipse中的SVN操作
- 转发与重定向的区别
- 基于位置的服务——百度地图SDK练习
- First programs
- CSS 选择器常见类型
- DigitalOcean Vpn
- SpringMVC 常用注解 及 其用法 (下)
- jsp中taglib属性
- 获取DataTable表的总行数
- 设置的mysql密码无效的问题
- Centos7+nginx+tomcat7反向代理,负载,集群