天天看點

Android原生方式擷取經緯度

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

版權聲明:本文為部落客原創文章,轉載請附上博文連結!

繼續閱讀