第8天GPS定位与高德地图的使用
一.GPS定位:android 的三种定位方式
- 1.GPS定位:需要GPS硬件支持,直接和卫星交互来获取当前经纬度。
优点:速度快、精度高、可在无网络情况下使用。
缺点:首次连接时间长、只能在户外已经开阔地使用,设备上方有遮挡物就不行了、比较耗电。 - 2.Network定位:又细分为WIFI定位和基站定位
(1)基站定位:一般手机附近的三个基站进行三角定位,由于每个基站的位置是固定的,利用电磁波在这三个基站间中转所需要时间来算出手机所在的坐标
a.优点:受环境的影响情况较小,不管在室内还是人烟稀少的地方都能用,只要有基站。
b.缺点:首先需要消耗流量、其实精度没有GPS那么准确,大概在十几米到几十米之间
(2)WIFI定位:
a.优点:和基站定位一样,它的优势在于收环境影响较小,只要有Wifi的地方可以使用。
b.缺点:需要有wifi、精度不准 - 3.AGPS定位:AssistedGPS(辅助全球卫星定位系统),是结合GSM或GPRS与传统卫星定位
二.GPS常用的类:
-
LocationManager:位置信息管理类。
Android为定位系统提供了LocationManager管理类。通过LocationManager和其他几个辅助类,开发人员可以方便开发出GPS应用:
LocationManager lm = getSystemService(Context.LOCATION_SERVICE); -
LocationProvider: 提供定位信息的类。
LocationManager 提供了方法getAllProviders()获取所有的LocationProvider;
也可以通过名称获取指定的LocationProvider。
(1) GPS定位:通过卫星实现的
LocationProvider lProvider = locationManager.getProvider(LocationManager.GPS_PROVIDER);
(2) 网络定位:通过WI-FI 或者信号塔进行定位
LocationProvider lProvider = locationManager.getProvider(LocationManager.NETWORK_PROVIDER); -
Location:位置类
double getLatitude()获取维度值
double getLongtitude()获取经度值
double getAltitude(); 获得海拔 -
在设备位置发生改变的时候获取到最新的位置信息。
void requestLocationUpdates(LocationManager.GPS_PROVIDER, 3000, new LocationListener{
void onLocationChanged();
}) 获取GPS定位信息。
第一个参数:位置提供器的类型。
第二个参数:监听位置变化的时间间隔,以毫秒为单位。
第三个参数:监听位置变化的距离间隔,以米为单位。
第四个参数:LocationListener 监听器。
如上,LocationManager 每隔 3 秒钟会检测一下位置的变化情况,当移动距离超过 3000米的时候,就会调用 LocationListener 的 onLocationChanged() 方法,并把新的位置信息作为参数传入。
二.GPS定位代码:
(1)清单文件添加权限:
<!--用于进行网络定位-->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission>
<!--用于访问GPS定位-->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission>
(2)java代码:
public class MainActivity extends AppCompatActivity {
private String[] permissions = new String[]{Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION,Manifest.permission.ACCESS_NETWORK_STATE};
@RequiresApi(api = Build.VERSION_CODES.M)
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//安卓6.0以后需要动态获取权限
checkPermisson();
//获得LocationManager
LocationManager manager = (LocationManager) getSystemService(LOCATION_SERVICE);
//判断是否得到定位的权限
if (ActivityCompat.checkSelfPermission(this,
Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED &&
ActivityCompat.checkSelfPermission(this,
Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
return;
}
//LocationListener->位置监听器->位置改变进入
manager.requestLocationUpdates(LocationManager.GPS_PROVIDER,
0, 0, new LocationListener() {
@Override
public void onLocationChanged(Location location) {
//Location->封装经度纬度海拔等信息->javabean
Log.e("ZXY","海拔:"+location.getAltitude());
Log.e("ZXY","纬度:"+location.getLatitude());
Log.e("ZXY","经度:"+location.getLongitude());
}
@Override
public void onStatusChanged(String s, int i, Bundle bundle) {
}
@Override
public void onProviderEnabled(String s) {
}
@Override
public void onProviderDisabled(String s) {
}
});
}
@RequiresApi(api = Build.VERSION_CODES.M)
public void checkPermisson(){
boolean flag=true;//默认全部被申请过
for(int i=0;i<permissions.length;i++){//只要有一个没有申请成功
if(!(ActivityCompat.checkSelfPermission(this,permissions[i])== PackageManager.PERMISSION_GRANTED)){
flag=false;
}
}
if(!flag){
//动态申请权限
requestPermissions(permissions,100);
}
}
//动态申请权限的疾厄宫
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if(requestCode==100){
boolean flag=true;
for(int i=0;i<grantResults.length;i++){
if(grantResults[i]!=PackageManager.PERMISSION_GRANTED){
flag=false;
}
}
if(flag){
Toast.makeText(this, "ok ", Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(this, "error", Toast.LENGTH_SHORT).show();
}
}
}
}
三.使用高德地图获取定位数据:官网:https://lbs.amap.com
- 添加依赖:implementation ‘com.amap.api:location:4.2.0’
- 代码
public class GaodeActivity extends AppCompatActivity implements AMapLocationListener {
private TextView mLocation;
private AMapLocationClient client;//定位客户端
private AMapLocationClientOption op;//参数设置
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_gaode);
mLocation = findViewById(R.id.location_Tv);
initLocation();
}
private void initLocation(){
client = new AMapLocationClient(getApplicationContext());
op = new AMapLocationClientOption();
//设置定位回调监听
client.setLocationListener(this);
//配置定位参数
op.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);
// op.setOnceLocation(true);//定位一次
op.setInterval(1000);//每隔1s定位1次
op.setNeedAddress(true);//是否需要返回地点
op.setMockEnable(true);//允许虚拟定位
client.setLocationOption(op);
client.startLocation();
}
//定位结果回调进入当前方法
@Override
public void onLocationChanged(AMapLocation aMapLocation) {
Log.e("ZXY","errorCode"+aMapLocation.getErrorCode());
Log.e("ZXY","errorInfo"+aMapLocation.getErrorInfo());
Log.e("ZXY","地址:"+aMapLocation.getAddress());
Log.e("ZXY","纬度:"+aMapLocation.getLatitude());
Log.e("ZXY","经度:"+aMapLocation.getLongitude());
mLocation.setText("定位地址:"+aMapLocation.getAddress());
}
}
四.使用高德地图:官网:https://lbs.amap.com
0.添加依赖:implementation ‘com.amap.api:map2d:5.2.0’
- xml布局
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.amap.api.maps2d.MapView
android:id="@+id/map"
android:layout_width="fill_parent"
android:layout_height="fill_parent" />
</LinearLayout>
- Java代码
public class MapsActivity extends AppCompatActivity implements LocationSource,AMapLocationListener {
private MapView mapView;//高德用来显示地图的控件
private AMap aMap;//MapView控制器->控制显示内容->绘制小蓝点
private OnLocationChangedListener mListener;
private AMapLocationClient mlocationClient;
private AMapLocationClientOption mLocationOption;
@RequiresApi(api = Build.VERSION_CODES.M)
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity__map);
checkPermisson();
mapView = findViewById(R.id.map);
mapView.onCreate(savedInstanceState);
if (aMap==null)
aMap = mapView.getMap();
init();
}
//初始化定位小蓝点
private void init(){
// 自定义系统定位小蓝点
MyLocationStyle myLocationStyle = new MyLocationStyle();
myLocationStyle.myLocationIcon(BitmapDescriptorFactory
.fromResource(R.mipmap.ic_launcher));// 设置小蓝点的图标
myLocationStyle.strokeColor(Color.BLACK);// 设置圆形的边框颜色
myLocationStyle.radiusFillColor(Color.argb(100, 0, 0, 180));// 设置圆形的填充颜色
// myLocationStyle.anchor(int,int)//设置小蓝点的锚点
myLocationStyle.strokeWidth(1.0f);// 设置圆形的边框粗细
aMap.setMyLocationStyle(myLocationStyle);
aMap.setLocationSource(this);
aMap.setMyLocationEnabled(true);
}
@Override
protected void onDestroy() {
super.onDestroy();
mapView.onDestroy();
}
@Override
protected void onPause() {
super.onPause();
mapView.onPause();
}
@Override
protected void onResume() {
super.onResume();
mapView.onResume();
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
//在activity执行onSaveInstanceState时执行mMapView.onSaveInstanceState (outState),保存地图当前的状态
mapView.onSaveInstanceState(outState);
}
@Override
public void activate(OnLocationChangedListener onLocationChangedListener) {
mListener = onLocationChangedListener;
//初始化定位
if (mlocationClient==null){
mlocationClient = new AMapLocationClient(getApplicationContext());
mLocationOption = new AMapLocationClientOption();
mlocationClient.setLocationListener(this);//添加定位监听
mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);
mlocationClient.setLocationOption(mLocationOption);
mlocationClient.startLocation();
}
}
@Override
public void deactivate() {
mListener = null;
if (mlocationClient != null) {
mlocationClient.stopLocation();
mlocationClient.onDestroy();
}
mlocationClient = null;
}
//定位坐标经纬度改变
@Override
public void onLocationChanged(AMapLocation aMapLocation) {
if (aMapLocation.getErrorCode()==0)
mListener.onLocationChanged(aMapLocation);// 显示系统小蓝点
}
private String[] permissions = new String[]{Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION};
@RequiresApi(api = Build.VERSION_CODES.M)
public void checkPermisson(){
boolean flag=true;//默认全部被申请过
for(int i=0;i<permissions.length;i++){//只要有一个没有申请成功
if(!(ActivityCompat.checkSelfPermission(this,permissions[i])== PackageManager.PERMISSION_GRANTED)){
flag=false;
}
}
if(!flag){
//动态申请权限
requestPermissions(permissions,100);
}
}
//动态申请权限的疾厄宫
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if(requestCode==100){
boolean flag=true;
for(int i=0;i<grantResults.length;i++){
if(grantResults[i]!=PackageManager.PERMISSION_GRANTED){
flag=false;
}
}
if(flag){
Toast.makeText(this, "ok ", Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(this, "error", Toast.LENGTH_SHORT).show();
}
}
}
}