Android 7原生获取经度纬度

在Android开发中,获取设备的经度和纬度是一个常见的需求,例如在地图应用中定位用户位置。Android 7(Nougat)引入了一种新的方式来获取设备的经纬度,通过FusedLocationProviderClient类和LocationCallback接口来实现。本文将介绍如何使用这些类和接口来获取设备的经纬度信息。

添加权限和依赖

在开始之前,我们需要在AndroidManifest.xml文件中添加获取位置信息的权限:

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

然后,在你的build.gradle文件中添加以下依赖:

dependencies {
    implementation 'com.google.android.gms:play-services-location:18.0.0'
}

初始化FusedLocationProviderClient

首先,我们需要在onCreate方法中初始化FusedLocationProviderClient:

private FusedLocationProviderClient fusedLocationClient;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    fusedLocationClient = LocationServices.getFusedLocationProviderClient(this);
}

请求权限

在Android 6及以上的版本中,我们需要动态请求位置权限。在onCreate方法中,我们可以添加以下代码来请求权限:

if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
        != PackageManager.PERMISSION_GRANTED) {
    ActivityCompat.requestPermissions(this,
            new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, REQUEST_LOCATION_PERMISSION);
}

然后,我们需要重写onRequestPermissionsResult方法来处理权限请求结果:

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
        @NonNull int[] grantResults) {
    if (requestCode == REQUEST_LOCATION_PERMISSION) {
        if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            // 权限已授予,开始获取位置信息
            startLocationUpdates();
        } else {
            // 权限被拒绝,处理相应逻辑
        }
    }
}

获取位置信息

为了获取设备的位置信息,我们需要先创建一个LocationRequest对象,然后通过FusedLocationProviderClientrequestLocationUpdates方法来请求位置更新:

private LocationRequest locationRequest;
private LocationCallback locationCallback;

private void startLocationUpdates() {
    locationRequest = LocationRequest.create();
    locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
    locationRequest.setInterval(UPDATE_INTERVAL);
    locationRequest.setFastestInterval(FASTEST_INTERVAL);

    locationCallback = new LocationCallback() {
        @Override
        public void onLocationResult(LocationResult locationResult) {
            if (locationResult == null) {
                return;
            }

            Location location = locationResult.getLastLocation();
            double latitude = location.getLatitude();
            double longitude = location.getLongitude();

            // 处理获取到的经纬度信息
        }
    };

    fusedLocationClient.requestLocationUpdates(locationRequest, locationCallback, null);
}

在上述代码中,UPDATE_INTERVAL表示位置更新的间隔时间,FASTEST_INTERVAL表示最快位置更新间隔时间。你可以根据自己的需求进行调整。

停止位置更新

当你不再需要获取位置信息时,可以调用removeLocationUpdates方法停止位置更新:

private void stopLocationUpdates() {
    fusedLocationClient.removeLocationUpdates(locationCallback);
}

完整示例代码

下面是一个完整的示例代码:

import android.Manifest;
import android.content.pm.PackageManager;
import android.location.Location;
import android.os.Bundle;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;

import com.google.android.gms.location.FusedLocationProviderClient;
import com.google.android.gms.location.LocationCallback;
import com.google.android.gms.location.LocationRequest;
import com.google.android.gms.location.LocationResult;
import com.google.android.gms.location.LocationServices;

public class MainActivity extends AppCompatActivity {
    private static final int REQUEST_LOCATION_PERMISSION = 1;
    private static final long UPDATE_INTERVAL = 5000; // 5秒
    private static final long FASTEST_INTERVAL = 1000; // 1秒

    private FusedLocationProviderClient fusedLocationClient;
    private LocationRequest locationRequest;
    private LocationCallback locationCallback;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        fusedLocationClient = LocationServices.getFusedLocationProviderClient(this);

        if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
                != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(this,
                    new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, REQUEST_LOCATION_PERMISSION);
        } else {
            startLocation