如要在消費者應用程式中追蹤行程,您必須先定義地圖,並視需要新增向量地圖支援功能。
如要在應用程式中設定地圖,請按照下列步驟操作:
- 定義用於追蹤行程的地圖片段。
- 新增對地圖底圖和檢視控制器的支援。
- 新增對 Android 向量圖形的支援,以便視需要顯示向量地圖。
定義地圖後,您可以新增其他視圖和相機控制項,以自訂視覺體驗。詳情請參閱「設定地圖樣式」。
步驟 1:定義用於追蹤行程的地圖片段
您可以新增地圖片段或檢視區塊來定義地圖,以便在消費者應用程式中分享隨選行程。如要定義地圖,請按照下列任一方法操作:
兩種方法的功能相同,請選擇哪種方法更適合您的應用程式。
下節將詳細說明這兩種方法。
新增地圖區塊或檢視畫面
如要使用 Android 片段或檢視畫面建立地圖,以便顯示行程進度,請按照下列步驟操作並參考程式碼範例。
在
/res/layout
的應用程式版面配置 XML 檔案中定義片段或檢視畫面。將行程地圖定義為使用ConsumerMapFragment
的片段,或是使用ConsumerMapView
的檢視區塊。然後,該片段或檢視畫面會提供行程地圖的存取權,以供應用程式存取及修改。地圖也會提供
ConsumerController
的句柄,讓應用程式控管及自訂消費者體驗。在
onCreate()
方法中呼叫getConsumerGoogleMapAsync(callback)
,該方法會在回呼中以非同步方式傳回ConsumerGoogleMap
。使用
ConsumerGoogleMap
顯示行程進度,並視需要更新。
新增 ConsumerMapFragment
的範例
在應用程式版面配置 XML 檔案中定義片段,如以下程式碼範例所示。
<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 檔案中定義的片段或活動中使用檢視區塊。
<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()
。除了回呼參數之外,請加入下列詳細資料:包含活動或片段。活動或片段基礎類別必須是
FragmentActivity
或支援Fragment
(分別為),因為它們提供生命週期存取權。GoogleMapOptions
(可為空值),包含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,
)
}
}
片段中的 MapView
與活動中的 MapView
範例相同,唯一的差別是片段會在片段 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:新增對地圖底圖和 View Controller 的支援
如要在應用程式中分享行程進度,請將下列類別新增至應用程式: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 裝置和向量 drawable 的支援功能:
- 將下列程式碼新增至活動。這個程式碼會擴充
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() {
// ...
}