Android的Mapbox Maps SDK是一个开源工具集,用于在Android应用程序中显示地图。
Mapbox官网:https://docs.mapbox.com/android/maps/overview/
参考:Mapbox Android入门(一)
1.添加依赖
在App的build.gradle 文件中,保证 minSdkVersion 大于等于14,添加 dependence :
dependencies {
implementation 'com.mapbox.mapboxsdk:mapbox-android-sdk:8.2.1'
}
注:在为Android添加Mapbox Maps SDK之后,可能会出现与Gradle依赖项不匹配的情况。不要忘记你可以使用下面的“exclude group”来删除某些依赖关系:
implementation ('com.mapbox.mapboxsdk:mapbox-android-sdk:8.2.1'){
exclude group: 'group_name', module: 'module_name'
}
此外,在命令行中运行 “gradle app_module_name_here:dependencies
” 将打印依赖项列表。”./gradlew app:dependencies
“ 如果你有一个Gradle包装器就可以工作。当多个库包含在一个项目中时,它们有助于对灵活的Gradle配置进行故障诊断。可以看到特定库带来的依赖关系以及冲突可能发生的位置。
2.获取Acess Token
在Mapbox的账户界面,获取 default public token 。在 R.strings.xml 中添加一条专门用于保存该token:
MAPBOX_ACCESS_TOKEN
然后,要将其传递到Maps SDK,您需要将 acess token 放在应用程序的 onCreate() 方法中。
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
// Mapbox Access token
Mapbox.getInstance(getApplicationContext(), pk.eyJ1IjoiMTU5OTUwODY2MTYiLCJhIjoiY2pzanBmejBiMTh4dDQ0cDY0NDk0Y3JobCJ9.sEmUKARVlNUTVbbVbrwGAw);
}
}
如果想在运行时切换 Mapbox 访问令牌,Maps SDK 还提供了一个 setToken() 方法。某些 Mapbox api 需要特殊的 Mapbox 令牌,比如中国的map。设置一个新的令牌可以同时使用多个 Mapbox 工具。此方法允许您在使用特定的 Mapbox 工具之前设置令牌,而不是在初始时设置令牌,并要求对所有与 Mapbox 相关的请求使用相同的令牌。如下:
Mapbox.setAccessToken(pk.eyJ1IjoiMTU5OTUwODY2MTYiLCJhIjoiY2pzanBmejBiMTh4dDQ0cDY0NDk0Y3JobCJ9.sEmUKARVlNUTVbbVbrwGAw);
3.设置权限
在 Manifest 文件中添加相应的权限:
< uses-permission android:name="android.permission.INTERNET" />
< uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
< uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
< uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
4.添加地图到应用中
首先在activity_main.xml引入mapview组件:
然后,下面示例中给出了将地图加入到activity的方法,包含了创建activity、设置token、导入样式,以及设计map组件。
MainActivity.java:
private MapView mapView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Mapbox.getInstance(this, pk.eyJ1IjoiMTU5OTUwODY2MTYiLCJhIjoiY2pzanBmejBiMTh4dDQ0cDY0NDk0Y3JobCJ9.sEmUKARVlNUTVbbVbrwGAw);
setContentView(R.layout.activity_main);
mapView = (MapView) findViewById(R.id.mapView);
mapView.onCreate(savedInstanceState);
mapView.getMapAsync(new OnMapReadyCallback() {
@Override
public void onMapReady(@NonNull MapboxMap mapboxMap) {
mapboxMap.setStyle(Style.MAPBOX_STREETS, new Style.OnStyleLoaded() {
@Override
public void onStyleLoaded(@NonNull Style style) {
// 现在已经设置了Map并加载了样式。可以在此处添加数据或进行其他地图调整。
}
});
}
});
5.Lifecycle 方法
MapView 包含自己的生命周期方法,用于管理Android的 OpenGL 生命周期,该生命周期必须直接从包含的活动中调用。为了让您的应用程序正确地调用 MapView 的生命周期方法,您必须在包含 MapView 的活动中覆盖以下生命周期方法,并调用相应的 MapView 方法。一共需要override以下生命周期方法,并包含匹配的MapView方法。
onCreate();
onStart();
onResume();
onPause();
onStop();
onSaveInstanceState();
onLowMemory();
onDestroy();
例如,onStart()方法应该是这样的:
@Override
protected void onStart() {
super.onStart();
mapView.onStart();
}
注意,如果使用的是fragment,那么在fragment的 onDestroyView() 方法中调用mapview.onDestroy(),而不是在 onDestroy() 方法中调用。如下:
@Override
public void onDestroyView() {
super.onDestroyView();
mapView.onDestroy();
}
您必须在任何使用用于Android的 Mapbox Maps SDK 的地图上包含 Mapbox wordmark 和属性通知。SDK 提供了一个属性布局,其中包含所有必需的信息,可以用 xml 定制,也可以使用 uisetings 对象定制。您可以调整 Mapbox wordmark 和属性通知的位置,但它们必须在地图上保持可见。您还可以更改属性通知的背景和文本颜色,以匹配您的设计美学,但所有信息必须清晰易读。否则,您不能更改 Mapbox wordmark 或文本属性通知。如果您希望移动或删除 Mapbox wordmark,请与我们的销售团队联系,讨论在我们的企业计划下可用的选项。
Mapbox Telemetry是这个 SDK 中包含的一个功能强大的位置分析平台。默认情况下,每当主机应用程序要求收集匿名的位置和使用数据时,SDK 都会向 Mapbox 发送匿名的位置和使用数据。Mapbox 服务条款要求你的应用程序向用户提供一种方法,让他们单独选择不使用 Mapbox 遥测技术,这是自动提供的属性控制的一部分。如果隐藏了属性控件,则必须为用户提供一个可供选择的out选项。
可以在 XML MapView 中添加ML属性,以进一步定制地图行为,例如设置起始摄像机位置、启用倾斜或调整屏幕上的罗盘位置。所有 MapView XML 属性都以 “mapbox_” 开头,用于标识和消除与其他库的任何潜在冲突。由于目前Android Studio的实现,您不能通过键入自动生成 MapView 属性。其中一些属性的使用示例如下:
package com.example.myapplication;
import android.os.Bundle;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import com.mapbox.mapboxsdk.Mapbox;
import com.mapbox.mapboxsdk.maps.MapView;
import com.mapbox.mapboxsdk.maps.MapboxMap;
import com.mapbox.mapboxsdk.maps.OnMapReadyCallback;
import com.mapbox.mapboxsdk.maps.Style;
public class MainActivity extends AppCompatActivity {
private MapView mapView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Mapbox.getInstance(this, getString(R.string.mapbox_access_token));
setContentView(R.layout.activity_main);
mapView = findViewById(R.id.mapView);
mapView.onCreate(savedInstanceState);
mapView.getMapAsync(new OnMapReadyCallback() {
@Override
public void onMapReady(@NonNull MapboxMap mapboxMap) {
mapboxMap.setStyle(Style.MAPBOX_STREETS, new Style.OnStyleLoaded() {
@Override
public void onStyleLoaded(@NonNull Style style) {
// Map is set up and the style has loaded. Now you can add data or make other map adjustments.
}
});
}
});
}
// Add the mapView lifecycle to the activity's lifecycle methods
@Override
public void onResume() {
super.onResume();
mapView.onResume();
}
@Override
protected void onStart() {
super.onStart();
mapView.onStart();
}
@Override
protected void onStop() {
super.onStop();
mapView.onStop();
}
@Override
public void onPause() {
super.onPause();
mapView.onPause();
}
@Override
public void onLowMemory() {
super.onLowMemory();
mapView.onLowMemory();
}
@Override
protected void onDestroy() {
super.onDestroy();
mapView.onDestroy();
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
mapView.onSaveInstanceState(outState);
}
}