设置地图

请选择平台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. 在 fragment 或 activity 中使用视图,如 XML 文件中所定义。

     <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,以便在 Consumer SDK 中使用矢量可绘制对象资源。

Java

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

// ...

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

Kotlin

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

// ...

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

后续步骤

在 Android 中跟踪行程

为地图设置样式