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"/>
   
  • 1.
  • 2.
  • 3.

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);
   }
   
  • 1.
  • 2.
  • 3.
  • 4.

3.创建 LocationManager

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

   LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
   
  • 1.
  • 2.

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);
   
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.

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

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

   Location lastKnownLocation = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
   if (lastKnownLocation != null) {
       double latitude = lastKnownLocation.getLatitude();
       double longitude = lastKnownLocation.getLongitude();
   }
   
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.

6.取消监听:

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

   locationManager.removeUpdates(locationListener);
   
  • 1.
  • 2.

注意

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);
        }
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
  • 62.
  • 63.
  • 64.
  • 65.
  • 66.
  • 67.
  • 68.
  • 69.
  • 70.
  • 71.
  • 72.
  • 73.
  • 74.
  • 75.
  • 76.
  • 77.
  • 78.
  • 79.
  • 80.
  • 81.
  • 82.
  • 83.
  • 84.
  • 85.

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

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