设置地图

请选择平台: Android iOS

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

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

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

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

第 1 步:定义用于跟踪行程的地图 fragment

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

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

  • ConsumerMapView:用于使用 View 定义映射。

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

以下部分对这两种方法进行了更详细的说明。

添加地图 fragment 或视图

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

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

    然后,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 设备上跟踪行程

设置地图样式