Mapbox Android学习笔记(1)简介
简介
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 { @Overridepublic void onCreate() {super.onCreate(); // Mapbox Access tokenMapbox.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;@Overrideprotected 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() {@Overridepublic void onMapReady(@NonNull MapboxMap mapboxMap) {mapboxMap.setStyle(Style.MAPBOX_STREETS, new Style.OnStyleLoaded() {@Overridepublic 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()方法应该是这样的:
@Overrideprotected void onStart() {super.onStart();mapView.onStart();}
注意,如果使用的是fragment,那么在fragment的 onDestroyView() 方法中调用mapview.onDestroy(),而不是在 onDestroy() 方法中调用。如下:
@Overridepublic void onDestroyView() {super.onDestroyView();mapView.onDestroy();}
Attribution归属
您必须在任何使用用于Android的 Mapbox Maps SDK 的地图上包含 Mapbox wordmark 和属性通知。SDK 提供了一个属性布局,其中包含所有必需的信息,可以用 xml 定制,也可以使用 uisetings 对象定制。您可以调整 Mapbox wordmark 和属性通知的位置,但它们必须在地图上保持可见。您还可以更改属性通知的背景和文本颜色,以匹配您的设计美学,但所有信息必须清晰易读。否则,您不能更改 Mapbox wordmark 或文本属性通知。如果您希望移动或删除 Mapbox wordmark,请与我们的销售团队联系,讨论在我们的企业计划下可用的选项。
Telemetry
Mapbox Telemetry是这个 SDK 中包含的一个功能强大的位置分析平台。默认情况下,每当主机应用程序要求收集匿名的位置和使用数据时,SDK 都会向 Mapbox 发送匿名的位置和使用数据。Mapbox 服务条款要求你的应用程序向用户提供一种方法,让他们单独选择不使用 Mapbox 遥测技术,这是自动提供的属性控制的一部分。如果隐藏了属性控件,则必须为用户提供一个可供选择的out选项。
XML属性
可以在 XML MapView 中添加ML属性,以进一步定制地图行为,例如设置起始摄像机位置、启用倾斜或调整屏幕上的罗盘位置。所有 MapView XML 属性都以 “mapbox_” 开头,用于标识和消除与其他库的任何潜在冲突。由于目前Android Studio的实现,您不能通过键入自动生成 MapView 属性。其中一些属性的使用示例如下:
MainActivity.java 完整代码
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); }}
更多相关文章
- eclipse 开发 android 快捷键!
- Android属性系统
- Android监听来电和去电的实现方法
- Android(安卓)JsBridge 源码解析
- listview使用小技巧
- EditText android:windowSoftInputMode 属性之旅
- Android(安卓)中文 API (22) ―― MultiAutoCompleteTextView
- 浅谈Java中Collections.sort对List排序的两种方法
- Python list sort方法的具体使用