設定地圖

選取平台: Android iOS

如要在消費者應用程式中追蹤行程,您必須先定義地圖,並視需要新增向量地圖支援功能。

如要在應用程式中設定地圖,請按照下列步驟操作:

  1. 定義用於追蹤行程的地圖片段
  2. 新增對地圖底圖和檢視控制器的支援
  3. 新增對 Android 向量圖形的支援,以便視需要顯示向量地圖。

定義地圖後,您可以新增其他視圖和相機控制項,以自訂視覺體驗。詳情請參閱「設定地圖樣式」。

步驟 1:定義用於追蹤行程的地圖片段

您可以新增地圖片段或檢視區塊來定義地圖,以便在消費者應用程式中分享隨選行程。如要定義地圖,請按照下列任一方法操作:

  • ConsumerMapFragment:用於使用 Fragment 定義地圖。

  • ConsumerMapView:用於使用 View 定義地圖。

兩種方法的功能相同,請選擇哪種方法更適合您的應用程式。

下節將詳細說明這兩種方法。

新增地圖區塊或檢視畫面

如要使用 Android 片段或檢視畫面建立地圖,以便顯示行程進度,請按照下列步驟操作並參考程式碼範例。

  1. /res/layout 的應用程式版面配置 XML 檔案中定義片段或檢視畫面。將行程地圖定義為使用 ConsumerMapFragment 的片段,或是使用 ConsumerMapView 的檢視區塊。

    然後,該片段或檢視畫面會提供行程地圖的存取權,讓應用程式可以存取及修改該地圖。地圖也會提供 ConsumerController 的句柄,讓應用程式控管及自訂消費者體驗。

  2. onCreate() 方法中呼叫 getConsumerGoogleMapAsync(callback),該方法會在回呼中以非同步方式傳回 ConsumerGoogleMap

  3. 使用 ConsumerGoogleMap 顯示行程進度,並視需要更新。

新增 ConsumerMapFragment 的範例

  1. 在應用程式版面配置 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" />
    
  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 檔案中定義的片段或活動中使用檢視區塊。

     <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()。除了回呼參數之外,請加入下列詳細資料:

    • 包含活動或片段。活動或片段基礎類別必須是 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 的支援

如要在應用程式中分享行程進度,請將下列類別新增至應用程式: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. 將下列程式碼新增至活動。這個程式碼會擴充 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 中追蹤行程

設定地圖樣式