Android原生方式获取经纬度

  1. 云栖社区>
  2. 博客>
  3. 正文

Android原生方式获取经纬度

优惠码优惠 2019-07-10 15:12:06 浏览403
展开阅读全文

Android原生方式获取经纬度
两种定位方式:GPS定位、WiFi定位
优劣:

  如果项目定位要求较高还是建议使用三方地图库

GPS定位相比Wifi定位更精准且可在无网络情况下使用,但在室内基本暴毙无法使用
WiFi定位没有室内外限制也不需要开启GPS但需要联网,另外测试发现WiFi定位时onLocationChanged函数(用于监听经纬度变化)触发间隔无法小于30s
   下面是Wifi定位的代码

public class GPSActivity extends AppCompatActivity {

public static final int LOCATION_CODE = 301;
private LocationManager locationManager;
private String locationProvider = null;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    getLocation();
}

private void getLocation () {
    locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
    //获取所有可用的位置提供器
    List<String> providers = locationManager.getProviders(true);
    if (providers.contains(LocationManager.NETWORK_PROVIDER)) {
        //如果是Network
        locationProvider = LocationManager.NETWORK_PROVIDER;
    }
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        //获取权限(如果没有开启权限,会弹出对话框,询问是否开启权限)
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED
                || ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            //请求权限
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION,
                    Manifest.permission.ACCESS_COARSE_LOCATION}, LOCATION_CODE);
        } else {
            //监视地理位置变化
            locationManager.requestLocationUpdates(locationProvider, 3000, 1, locationListener);
            Location location = locationManager.getLastKnownLocation(locationProvider);
            if (location != null) {
                //输入经纬度
                Toast.makeText(this, location.getLongitude() + " " + location.getLatitude() + "", Toast.LENGTH_SHORT).show();
            }
        }
    } else {
        //监视地理位置变化
        locationManager.requestLocationUpdates(locationProvider, 3000, 1, locationListener);
        Location location = locationManager.getLastKnownLocation(locationProvider);
        if (location != null) {
            //不为空,显示地理位置经纬度
            Toast.makeText(this, location.getLongitude() + " " + location.getLatitude() + "", Toast.LENGTH_SHORT).show();
        }
    }
}

public LocationListener locationListener = new LocationListener() {
    // Provider的状态在可用、暂时不可用和无服务三个状态直接切换时触发此函数
    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {
    }
    // Provider被enable时触发此函数,比如GPS被打开
    @Override
    public void onProviderEnabled(String provider) {
    }
    // Provider被disable时触发此函数,比如GPS被关闭
    @Override
    public void onProviderDisabled(String provider) {
    }
    //当坐标改变时触发此函数,如果Provider传进相同的坐标,它就不会被触发
    @Override
    public void onLocationChanged(Location location) {
        if (location != null) {
            //不为空,显示地理位置经纬度
            Toast.makeText(GPSActivity.this, location.getLongitude() + " " + location.getLatitude() + "", Toast.LENGTH_SHORT).show();
        }
    }
};

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    switch (requestCode) {
        case LOCATION_CODE:
            if(grantResults.length > 0 && grantResults[0] == getPackageManager().PERMISSION_GRANTED
                    && grantResults[1] == PackageManager.PERMISSION_GRANTED) {
                Toast.makeText(this, "申请权限", Toast.LENGTH_LONG).show();
                try {
                    List<String> providers = locationManager.getProviders(true);
                    if (providers.contains(LocationManager.NETWORK_PROVIDER)) {
                        //如果是Network
                        locationProvider = LocationManager.NETWORK_PROVIDER;
                    }else if (providers.contains(LocationManager.GPS_PROVIDER)) {
                        //如果是GPS
                        locationProvider = LocationManager.GPS_PROVIDER;
                    }
                    //监视地理位置变化
                    locationManager.requestLocationUpdates(locationProvider, 3000, 1, locationListener);
                    Location location = locationManager.getLastKnownLocation(locationProvider);
                    if (location != null) {
                        //不为空,显示地理位置经纬度
                        Toast.makeText(GPSActivity.this, location.getLongitude() + " " + location.getLatitude() + "", Toast.LENGTH_SHORT).show();
                    }
                }catch (SecurityException e){
                    e.printStackTrace();
                }
            } else {
                Toast.makeText(this, "缺少权限", Toast.LENGTH_LONG).show();
                finish();
            }
            break;
    }
}

@Override
protected void onDestroy() {
    super.onDestroy();
    locationManager.removeUpdates(locationListener);
}

}
别忘记在AndroidManifest.xml加权限

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.INTERNET" />

GPS定位只需更换下面代码

   if (providers.contains(LocationManager.GPS_PROVIDER)) {
        //如果是GPS
        locationProvider = LocationManager.GPS_PROVIDER;
    } else if (providers.contains(LocationManager.NETWORK_PROVIDER)) {
        //如果是Network
        locationProvider = LocationManager.NETWORK_PROVIDER;
    } else {
        Intent i = new Intent();
        i.setAction(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
        startActivity(i);
    }

作者:dk123sw
来源:CSDN
原文:https://blog.csdn.net/dk123sw/article/details/90410829
版权声明:本文为博主原创文章,转载请附上博文链接!

网友评论

作者关闭了评论
优惠码优惠
+ 关注