如需在您的消费类应用中跟踪行程,您首先需要定义地图,并根据需要添加对矢量地图的支持。
如需在应用中设置地图,请按以下步骤操作:
- 定义用于跟踪行程的地图 fragment。
- 添加对地图基础层和视图控制器的支持。
- 根据需要添加对 Android 矢量图形的支持,以显示矢量地图。
定义地图后,您可以添加其他视图和相机控件,以自定义视觉体验。如需了解详情,请参阅设置地图样式。
第 1 步:定义用于跟踪行程的地图 fragment
您可以通过添加地图 fragment 或视图来定义地图,以便在您的消费者应用中分享按需行程。如需定义地图,请按照以下方法之一操作:
这两种方法提供的功能相同,因此请选择更适合您应用的方法。
以下部分更详细地介绍了这两种方法。
添加地图 fragment 或视图
如需创建地图以显示行程进度,请使用 Android fragment 或视图,并按照以下步骤操作,同时参阅代码示例。
- 在位于 - /res/layout中的应用布局 XML 文件中定义 fragment 或视图。使用- ConsumerMapFragment将行程地图定义为 fragment,或使用- ConsumerMapView将其定义为视图。- 然后,fragment 或 view 会提供对行程地图的访问权限,以便您的应用访问和修改行程地图。该地图还提供 - ConsumerController的句柄,让您的应用能够控制和自定义消费者体验。
- 从 - onCreate()方法中,调用- getConsumerGoogleMapAsync(callback),该方法会在回调中异步返回- ConsumerGoogleMap。
- 使用 - ConsumerGoogleMap显示行程进度,并根据需要进行更新。
如何添加 ConsumerMapFragment 的示例
- 在应用布局 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" />
- 从 - 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 的示例
- 在 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" />
- 从 - 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 步:添加对地图基础层和视图控制器的支持
如需在应用中分享行程进度,请将以下类添加到应用中:ConsumerGoogleMap 和 ConsumerController。
- 从 - ConsumerMapFragment或- ConsumerMapView获取- ConsumerGoogleMap,两者都会在- ConsumerMapReadyCallback中异步返回- ConsumerGoogleMap。- ConsumerGoogleMap是- GoogleMap类的封装容器类。它使用与- GoogleMap等效的 API,以便您的应用可以与地图互动。 这样一来,您的应用就可以与同一底层 Google 地图无缝互动。例如,- GoogleMap仅允许注册单个回调,但- ConsumerGoogleMap支持注册两个回调。借助这些回调,您的应用可以注册按顺序调用的回调。
- 在 - getConsumerController()中从- ConsumerGoogleMap获取- ConsumerController。- ConsumerController提供对行程分享功能的访问权限,例如监控行程、控制行程状态和设置位置信息。
如需了解如何在 Java 和 Kotlin 中向应用添加 ConsumerGoogleMap 和 ConsumerController,请参阅以下示例。
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 设备和矢量可绘制对象资源的支持:
- 将以下代码添加到您的 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() {
  // ...
}