设置地图

请选择平台: Android iOS

如需在消费者应用中跟踪行程,您首先需要定义地图并添加对矢量地图的支持(如果需要)。

如需在应用中设置地图,请按以下步骤操作:

  1. 定义用于跟踪行程的地图 fragment
  2. 添加了对地图底图和视图控制器的支持
  3. 添加了对 Android 矢量图形的支持,以显示矢量地图(如果需要)。

定义地图后,您可以添加其他视图和相机控件,以自定义视觉体验。如需了解详情,请参阅设置地图样式

第 1 步:定义地图 fragment 以跟踪行程

您可以通过添加地图 fragment 或视图来定义地图,从而在消费者应用中创建用于分享按需行程的地图。如需定义地图,请按以下方法之一操作:

  • ConsumerMapFragment:用于使用 Fragment 定义地图。

  • ConsumerMapView:用于定义带有 View 的地图。

这两种方法的特性相同,因此请选择哪种方法更适合您的应用。

以下部分将更详细地介绍这两种方法。

添加地图 fragment 或视图

如需使用 Android fragment 或视图创建地图以显示行程进度,请按照以下步骤操作并参考代码示例。

  1. 在位于 /res/layout 的应用布局 XML 文件中定义 fragment 或视图。使用 ConsumerMapFragment 将行程地图定义为 fragment,或使用 ConsumerMapView 定义为视图。

    然后,Fragment 或视图会提供对行程地图的访问权限,您的应用可以访问和修改这些地图。该地图还提供了 ConsumerController 的句柄,可让您的应用控制和自定义消费者体验。

  2. onCreate() 方法中调用 getConsumerGoogleMapAsync(callback),这将在回调中异步返回 ConsumerGoogleMap

  3. 使用 ConsumerGoogleMap 显示行程进度并根据需要进行更新。

添加 ConsumerMapFragment 的示例

  1. 在应用布局 XML 文件中定义 fragment,如以下代码示例所示。

    <fragment
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:name="com.google.android.libraries.mapsplatform.transportation.consumer.view.ConsumerMapFragment"
        android:id="@+id/consumer_map_fragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
    
  2. onCreate() 方法调用 getConsumerGoogleMapAsync()

Java

 public class SampleAppActivity extends AppCompatActivity {

   @Override
   protected void onCreate(Bundle savedInstanceState) {

     // Find the ConsumerMapFragment.
     ConsumerMapFragment consumerMapFragment =
         (ConsumerMapFragment) fragmentManager.findFragmentById(R.id.consumer_map_fragment);

     // Initiate the callback that returns the map.
     if (consumerMapFragment != null) {
       consumerMapFragment.getConsumerGoogleMapAsync(
           new ConsumerMapReadyCallback() {
             // The map returned in the callback is used to access the ConsumerController.
             @Override
             public void onConsumerMapReady(@NonNull ConsumerGoogleMap consumerGoogleMap) {
               ConsumerController consumerController = consumerGoogleMap.getConsumerController();
             }
           });
     }
   }

 }

Kotlin

 class SampleAppActivity : AppCompatActivity() {
   override fun onCreate(savedInstanceState: Bundle?) {
     // Find the ConsumerMapFragment.
     val consumerMapFragment =
       fragmentManager.findFragmentById(R.id.consumer_map_fragment) as ConsumerMapFragment

     consumerMapFragment.getConsumerGoogleMapAsync(
       object : ConsumerMapReadyCallback() {
         override fun onConsumerMapReady(consumerGoogleMap: ConsumerGoogleMap) {
           val consumerController = consumerGoogleMap.getConsumerController()!!
         }
       }
     )
   }
 }

添加 ConsumerMapView 的示例

  1. 按照 XML 文件中的定义,在 fragment 或 activity 中使用该视图。

     <com.google.android.libraries.mapsplatform.transportation.consumer.view.ConsumerMapView
         xmlns:android="http://schemas.android.com/apk/res/android"
         android:id="@+id/consumer_map_view"
         android:layout_width="match_parent"
         android:layout_height="match_parent" />
    
  2. onCreate() 调用 getConsumerGoogleMapAsync()。除了回调参数之外,还应添加以下详细信息:

    • 所属的 activity 或 fragment。activity 或 fragment 基类必须是 FragmentActivity 或支持 Fragment(分别),因为它们提供对其生命周期的访问权限。

    • GoogleMapOptions(可以为 null),其中包含 MapView 的配置属性。

Java

public class SampleAppActivity extends AppCompatActivity {

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    ConsumerMapView mapView = findViewById(R.id.consumer_map_view);

    if (mapView != null) {
      mapView.getConsumerGoogleMapAsync(
          new ConsumerMapReadyCallback() {
            // The map returned in the callback is used to access the ConsumerController.
            @Override
            public void onConsumerMapReady(@NonNull ConsumerGoogleMap consumerGoogleMap) {
              ConsumerController consumerController = consumerGoogleMap.getConsumerController();
            }
          }, this, null);
    }
  }

}

Kotlin

class SampleAppActivity : AppCompatActivity() {
  override fun onCreate(savedInstanceState: Bundle?) {
    val mapView = findViewById(R.id.consumer_map_view) as ConsumerMapView

    mapView.getConsumerGoogleMapAsync(
      object : ConsumerMapReadyCallback() {
        // The map returned in the callback is used to access the ConsumerController.
        override fun onConsumerMapReady(consumerGoogleMap: ConsumerGoogleMap) {
          val consumerController = consumerGoogleMap.getConsumerController()!!
        }
      },
      /* fragmentActivity= */ this,
      /* googleMapOptions= */ null,
    )
  }
}

fragment 中的 MapView 与上述针对 activity 中的 MapView 的示例相同,只不过 fragment 会膨胀包含 fragment onCreateView() 方法中的 MapView 的布局。

Java

public class MapViewInFragment extends Fragment {

  @Override
  public View onCreateView(
      @NonNull LayoutInflater layoutInflater,
      @Nullable ViewGroup viewGroup,
      @Nullable Bundle bundle) {
    return layoutInflater.inflate(R.layout.consumer_map_view, viewGroup, false);
  }

}

Kotlin

class MapViewInFragment : Fragment() {
  override fun onCreateView(
    layoutInflater: LayoutInflater,
    container: ViewGroup?,
    savedInstanceState: Bundle?,
  ): View {
    return layoutInflater.inflate(R.layout.consumer_map_view, viewGroup, false)
  }
}

第 2 步:添加对地图基础图层和视图控制器的支持

如需在应用中分享行程进度,请将以下类添加到您的应用中:ConsumerGoogleMapConsumerController

  • ConsumerMapFragmentConsumerMapView 获取 ConsumerGoogleMap,这两者都会在 ConsumerMapReadyCallback 中异步返回 ConsumerGoogleMap

    ConsumerGoogleMapGoogleMap 类的封装容器类。它使用等同于 GoogleMap 的 API,以便您的应用可以与地图互动。这样一来,您的应用就可以与同一个底层 Google 地图无缝互动。例如,GoogleMap 仅允许单个回调注册,但 ConsumerGoogleMap 支持双注册的回调。这些回调可让您的应用注册依序调用的回调。

  • getConsumerController()内从ConsumerGoogleMap获取ConsumerController

    ConsumerController,提供行程共享功能的访问权限,例如监控行程、控制行程状态和设置位置。

如需了解如何使用 Java 和 Kotlin 向应用添加 ConsumerGoogleMapConsumerController,请参阅以下示例。

Java

private ConsumerGoogleMap consumerGoogleMap;
private ConsumerController consumerController;
private ConsumerMapView consumerMapView;

consumerMapView.getConsumerGoogleMapAsync(
    new ConsumerMapReadyCallback() {
      @Override
      public void onConsumerMapReady(@NonNull ConsumerGoogleMap consumerMap) {
        consumerGoogleMap = consumerMap;
        consumerController = consumerMap.getConsumerController();
      }
    },
    this, null);

Kotlin

var consumerGoogleMap: ConsumerGoogleMap
var consumerController: ConsumerController
val consumerMapView = findViewById(R.id.consumer_map_view) as ConsumerMapView

consumerMapView.getConsumerGoogleMapAsync(
  object : ConsumerMapReadyCallback() {
    override fun onConsumerMapReady(consumerMap: ConsumerGoogleMap) {
      consumerGoogleMap = consumerMap
      consumerController = consumerMap.getConsumerController()
    },
    /* fragmentActivity= */ this,
    /* googleMapOptions= */ null,
  }
)

第 3 步:添加对 Android 矢量图形的支持

如果您的应用设计需要支持矢量图形,请按照以下步骤添加对 Android 设备和矢量可绘制对象的支持:

  1. 将以下代码添加到您的 Activity 中。此代码会扩展 AppCompatActivity,以使用使用方 SDK 中的矢量可绘制对象。

Java

// ...
import android.support.v7.app.AppCompatActivity;

// ...

public class ConsumerTestActivity extends AppCompatActivity {
  // ...
}

Kotlin

// ...
import android.support.v7.app.AppCompatActivity

// ...

class ConsumerTestActivity : AppCompatActivity() {
  // ...
}

后续步骤

在 Android 中跟踪行程 设置地图样式