Android 中获取 GPS 定位信息通常涉及到使用 LocationManager 服务,它可以提供来自不同来源的位置信息,如 GPS 卫星、网络(基于 Wi-Fi 和移动网络基站)以及传感器。以下是一个基本的示例,展示如何在 Android 应用中获取 GPS 定位:

1.请求权限:

首先,你需要在你的 AndroidManifest.xml 文件中声明位置相关的权限:

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

2.检查权限:

在运行时,你需要检查应用是否拥有必要的权限,并请求用户授权:

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

3.创建 LocationManager

创建一个 LocationManager 实例,并获取位置更新:

   LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
   

4.注册监听器:

使用 requestLocationUpdates 方法注册一个 LocationListener 来接收位置更新:

   LocationListener locationListener = new LocationListener() {
       @Override
       public void onLocationChanged(Location location) {
           // 当位置改变时调用
           double latitude = location.getLatitude();
           double longitude = location.getLongitude();
           float accuracy = location.getAccuracy();
           long time = location.getTime();
           // 更新 UI 或保存位置信息
       }

       @Override
       public void onStatusChanged(String provider, int status, Bundle extras) {
           // 当位置提供者的状态改变时调用
       }

       @Override
       public void onProviderEnabled(String provider) {
           // 当位置提供者启用时调用
       }

       @Override
       public void onProviderDisabled(String provider) {
           // 当位置提供者禁用时调用
       }
   };

   // 注册监听器
   locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener);
   

5.获取最后一次已知位置:

如果你只需要获取最后一次已知的位置,可以使用 getLastKnownLocation 方法:

   Location lastKnownLocation = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
   if (lastKnownLocation != null) {
       double latitude = lastKnownLocation.getLatitude();
       double longitude = lastKnownLocation.getLongitude();
   }
   

6.取消监听:

当不再需要位置更新时,记得取消监听以节省资源:

   locationManager.removeUpdates(locationListener);
   

注意

GPS 定位可能需要一段时间才能提供精确的位置信息,而且它可能会消耗较多的电池。因此,在实际应用中,你可能需要结合使用网络定位和 GPS 定位,以及合理设置更新频率和最小距离变化阈值,以平衡精度和性能。

此外,从 Android 6.0(API 级别 23)开始,应用在运行时需要动态请求危险权限,所以在代码中检查权限是非常重要的。

实例

为了提供一个更完整的实例,让我们看一个具体的 Android 应用中如何使用 LocationManager 来获取 GPS 定位信息。以下是一个简单的 Activity 示例,它展示了如何请求位置权限,初始化 LocationManager,并注册一个 LocationListener 来接收位置更新。

import android.Manifest;
import android.content.Context;
import android.content.pm.PackageManager;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;

public class GPSActivity extends AppCompatActivity {

    private LocationManager locationManager;
    private LocationListener locationListener;
    private TextView locationText;

    private static final int REQUEST_LOCATION_PERMISSION = 1;

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

        locationText = findViewById(R.id.location_text);

        // 请求位置权限
        if (ActivityCompat.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},
                    REQUEST_LOCATION_PERMISSION);
            return;
        }

        // 初始化 LocationManager
        locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

        // 创建 LocationListener
        locationListener = new LocationListener() {
            @Override
            public void onLocationChanged(Location location) {
                // 更新位置信息
                updateLocationInfo(location);
            }

            @Override
            public void onStatusChanged(String provider, int status, Bundle extras) {
                // 状态改变时调用
            }

            @Override
            public void onProviderEnabled(String provider) {
                // 提供者启用时调用
            }

            @Override
            public void onProviderDisabled(String provider) {
                // 提供者禁用时调用
            }
        };

        // 请求位置更新
        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 5000, 0, locationListener);
    }

    private void updateLocationInfo(Location location) {
        if (location != null) {
            double latitude = location.getLatitude();
            double longitude = location.getLongitude();
            locationText.setText("Latitude: " + latitude + ", Longitude: " + longitude);
        } else {
            locationText.setText("Location not available");
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        // 移除位置监听器
        if (locationManager != null && locationListener != null) {
            locationManager.removeUpdates(locationListener);
        }
    }
}

在这个示例中,我们首先检查了位置权限,如果没有权限,我们会请求用户授权。然后,我们初始化了 LocationManager 并创建了一个 LocationListener。当位置改变时,onLocationChanged 方法会被调用,我们会在 TextView 中更新位置信息。最后,在 onDestroy 方法中,我们移除了位置监听器以避免内存泄漏。

请确保在你的 AndroidManifest.xml 文件中添加了位置权限,并在布局文件 activity_gps.xml 中定义了 TextView 控件。