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 {
 
@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();
}

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);
    }
}

你可能感兴趣的:(移动开发)