Google Maps Platform 推出 15 周年 - 查看最新资讯和公告

位置数据

位置感知功能是移动应用的一项独特功能。移动用户无论走到哪里都随身携带自己的设备,因此为您的应用添加位置感知功能可给用户带来更具环境感的体验。

代码示例

GitHub 上的 ApiDemos 代码库包含相关示例,展示了如何在地图上使用位置:

使用位置数据

提供给 Android 设备的位置数据包括设备的当前位置(结合使用多种技术精准确定)、移动的方向和方式,以及设备移动范围是否超出了预定义的地理边界(或称地理围栏)。根据应用的具体需求,您可以从以下位置数据使用方式中进行选择:

  • 我的位置图层提供了一种在地图上显示设备位置的简单方式。它并不提供数据。
  • 建议通过 Google Play Services Location API 发出所有位置数据编程请求。
  • 您可以使用 LocationSource 接口提供自定义位置信息提供程序。

位置权限

如果您的应用需要访问用户的位置信息,您必须向应用添加相关的 Android 位置权限来请求权限。

Android 提供两种位置权限:ACCESS_COARSE_LOCATIONACCESS_FINE_LOCATION。您选择的权限决定了 API 所返回位置的精确度。您只需根据自己需要的精确度请求其中一种 Android 位置权限:

向应用清单添加权限

在您的 Android 清单中,添加下列权限之一作为 <manifest> 元素的子元素。粗略位置权限:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.myapp" >
  ...
  <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
  ...
</manifest>

或精确位置权限:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.myapp" >
  ...
  <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
  ...
</manifest>

请求运行时权限

Android 6.0 (Marshmallow) 引入新的权限处理模型,简化了用户安装和升级应用的过程。如果您的应用以 API 级别 23 或更高级别为目标平台,便可使用这种新权限模型。

如果您的应用支持这种新权限模型,并且设备搭载的是 Android 6.0 (Marshmallow) 或更高版本,则用户无需在安装或升级应用时授予任何权限。应用必须在运行时通过检查确认其是否具备必要的权限,如果没有,则请求相应权限。系统会向用户显示一个对话框,请求授予权限。

为提供最佳用户体验,请务必在上下文中请求权限。如果位置信息对于应用正常运行至关重要,则您应该在应用启动时请求位置权限。一种较好的做法是显示一个热情的欢迎屏幕或向导,让用户了解必须授予权限的原因。

如果应用需要的权限仅用于执行其部分功能,则您应该在应用执行需要该权限的操作时请求位置权限。

应用必须以适当方式处理用户不授予权限的情况。例如,如果特定功能需要该权限,则应用可以停用该功能。如果该权限对于应用正常运行至关重要,则应用可以停用其所有功能,并通知用户需要授予该权限。

以下代码示例利用支持库检查权限,然后启用“我的位置”图层:

if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
        == PackageManager.PERMISSION_GRANTED) {
    if (mMap != null) {
        mMap.setMyLocationEnabled(true);
    }
} else {
    // Permission to access the location is missing. Show rationale and request permission
    PermissionUtils.requestPermission(this, LOCATION_PERMISSION_REQUEST_CODE,
        Manifest.permission.ACCESS_FINE_LOCATION, true);
}

以下代码示例通过实现支持库中的 ActivityCompat.OnRequestPermissionsResultCallback 来处理权限请求的结果:

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    if (requestCode != LOCATION_PERMISSION_REQUEST_CODE) {
        return;
    }

    if (PermissionUtils.isPermissionGranted(permissions, grantResults, Manifest.permission.ACCESS_FINE_LOCATION)) {
        // Enable the my location layer if the permission has been granted.
        enableMyLocation();
    } else {
        // Permission was denied. Display an error message
        // ...
    }
}

如需查看更多代码示例以及 Android 运行时权限最佳做法,请参阅 Android 权限模型文档。

“我的位置”图层

您可以使用“我的位置”图层和“我的位置”按钮向用户显示他们在地图上的当前位置。调用 mMap.setMyLocationEnabled() 在地图上启用“我的位置”图层。

以下示例展示了“我的位置”图层的简单用法:

public class MyLocationDemoActivity extends FragmentActivity
    implements OnMyLocationButtonClickListener,
        OnMyLocationClickListener,
        OnMapReadyCallback {

  private GoogleMap mMap;

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

    SupportMapFragment mapFragment =
        (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map);
    mapFragment.getMapAsync(this);
  }

  @Override
  public void onMapReady(GoogleMap map) {
    mMap = map;
    // TODO: Before enabling the My Location layer, you must request
    // location permission from the user. This sample does not include
    // a request for location permission.
    mMap.setMyLocationEnabled(true);
    mMap.setOnMyLocationButtonClickListener(this);
    mMap.setOnMyLocationClickListener(this);
  }

  @Override
  public void onMyLocationClick(@NonNull Location location) {
    Toast.makeText(this, "Current location:\n" + location, Toast.LENGTH_LONG).show();
  }

  @Override
  public boolean onMyLocationButtonClick() {
    Toast.makeText(this, "MyLocation button clicked", Toast.LENGTH_SHORT).show();
    // Return false so that we don't consume the event and the default behavior still occurs
    // (the camera animates to the user's current position).
    return false;
  }
}

启用“我的位置”图层后,“我的位置”按钮会显示在地图的右上角。当用户点击该按钮时,相机将设备的当前位置(若已知)显示为地图的中心。设备处于静止状态时,地图以小蓝点指示该位置;处于移动状态时则以 V 形指示该位置。

下面的屏幕截图显示了右上角的“我的位置”按钮和地图中心的“我的位置”蓝点:

您可以通过调用 UiSettings.setMyLocationButtonEnabled(false) 禁止显示“我的位置”按钮。

您的应用可以响应以下事件:

我们的服务条款要求

保护用户隐私,
及时告知相关信息

始终告知用户您将如何使用他们的数据,并且不得公开个人用户的身份信息。在使用用户的位置信息之前征得用户同意,并允许用户随时取消授权。

了解详情

Google Play Services Location API

Google Play Services Location API 是向您的 Android 应用添加位置感知功能的首选方法。它提供的功能允许您:

  • 确定设备位置。
  • 监听位置变化。
  • 在设备处于移动状态时,确定交通方式。
  • 创建并监控预定义的地理区域(称为地理围栏)。

通过 Location API,您可以更方便地构建功能强大的位置感知应用。与 Maps SDK for Android 类似,Location API 也是作为 Google Play 服务 SDK 的一部分进行分发。如需详细了解 Location API,请参阅 Android 培训课程让您的应用具备位置感知能力Location API 参考。Google Play 服务 SDK 中已添加了相关代码示例。