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
对象,然后通过FusedLocationProviderClient
的requestLocationUpdates
方法来请求位置更新:
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