zoukankan      html  css  js  c++  java
  • 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);
    }

  • 相关阅读:
    AutoCAD利用VBA设置线型和添加用户自定义线性
    AutoVBA利用for循环创建同心圆弧
    AutoVBA利用Hacth对象填充图元对象
    AutoVBA利用AddArc方法创建Arc对象
    2011年6月5日星期天
    AutoVBA控件的tabindex和tabstop属性及with语句
    AutoVBA在绘图空间创建直线对象
    AutoVBA利用toolbar创建自己的工具栏
    AutoVBA调用AddCricle方法绘制圆
    AutoCAD利用VBA宏绘制多重平行线
  • 原文地址:https://www.cnblogs.com/ly570/p/10971081.html
Copyright © 2011-2022 走看看