第8天GPS定位与高德地图的使用

本文介绍了Android的三种GPS定位方式,包括GPS定位、Network定位、AGPS定位,分析了各自优缺点,还介绍了GPS常用类如LocationManager等,给出了GPS定位代码。此外,说明了使用高德地图获取定位数据和使用地图的方法,包含添加依赖及相关代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.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

  1. 添加依赖:implementation ‘com.amap.api:location:4.2.0’
  2. 代码
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’

  1. 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>
  1. 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();
            }
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值