Getting Started With HERE Using Kotlin and the Android SDK
大约一个月前,我编写了关于Java和Android SDK入门的入门指南。 即使已存在有关该工作的文档,但我还是想在过程中尝试一下,以使其变得容易一些。
尽管Java很棒,但它已成为时间的遗物,并逐渐被Kotlin取代,后者被认为是新的热点。 Kotlin可以为JVM编译为字节码,在这种情况下,我们可以使用Kotlin(一种完全不同但越来越流行的语言)来复制所有Java应用程序。
在本教程中,我们将学习如何使用显示HERE地图的Kotlin构建Android应用程序。
为了获得一些观点,我们将尝试完成以下任务:
如果您认为上面的图片看起来很熟悉,那是因为它与我之前的教程中使用的示例相同。 实际上,我们将要显示一个交互式地图。 虽然这听起来很容易,但必须进行一些配置才能使其成为可能。
在Kotlin支持下创建一个新的Android Studio项目
您不需要Android Studio即可与Kotlin一起使用或构建Android应用程序,但这使生活变得更加轻松。 因此,Android Studio将成为我们示例的重点。
我使用的是Android Studio 3.3,因此,如果您使用的是其他版本,则可能需要填补空白。
要开始,请选择创建一个新项目。
因为这是一个非常基本的示例,所以请确保创建一个活动为空的项目。 如果您喜欢冒险,请选择自己认为最合适的东西,或者尝试使用现有项目。
选择使用空活动后,我们需要定义我们的API版本,程序包命名和语言。
在此步骤中需要注意两个非常重要的事情。 您需要仔细选择您的软件包名称并记下它,因为此软件包名称将需要在您的HERE开发人员门户中使用。 软件包不匹配将导致您的API密钥不起作用。 您还需要选择Kotlin作为语言而不是Java。
此时,应该创建您的项目。 Android Studio可能会花费一些时间来同步您的依赖项。
安装和配置HERE Android SDK
这是我们开始集成HERE Android SDK的地方,以便可以在开发中使用它。 如果您还没有HERE开发者帐户,请确保在此处创建一个。 不用担心,开发人员帐户是免费的,您甚至不需要提供信用卡。
您将要在开发人员帐户中创建一个新项目,并生成一个新的 Android SDK Starter 。
请记住在生成API令牌时提供您的Android软件包。 在门户中生成新的Android应用程序后,您需要下载SDK。
下载SDK后,找到 HERE-sdk.aar 文件,并将其放置在项目的 app / libs 目录中。
在Android Studio中,打开项目的 build.gradle 文件,并包含以下内容:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | apply plugin: 'com.android.application' apply plugin: 'kotlin-android' apply plugin: 'kotlin-android-extensions' android { compileSdkVersion 28 defaultConfig { applicationId"com.example.raboy" minSdkVersion 21 targetSdkVersion 28 versionCode 1 versionName"1.0" testInstrumentationRunner"android.support.test.runner.AndroidJUnitRunner" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } repositories { flatDir { dirs 'libs' } } } dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation"org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" implementation 'com.android.support:appcompat-v7:28.0.0' implementation 'com.android.support.constraint:constraint-layout:1.1.3' testimplementation 'junit:junit:4.12' androidTestimplementation 'com.android.support.test:runner:1.0.2' androidTestimplementation 'com.android.support.test.espresso:espresso-core:3.0.2' implementation(name:'HERE-sdk', ext:'aar') implementation 'org.locationtech.jts:jts-core:1.15.0' implementation 'com.google.code.gson:gson:2.8.0' } |
上述大多数配置已存在于我们的 build.gradle 文件中。 我们添加了以下内容,以便可以使用本地库:
1 2 3 4 5 6 | buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } |
包含本地库之后,我们需要将它们用作依赖项,因此以下
1 2 3 | implementation(name:'HERE-sdk', ext:'aar') implementation 'org.locationtech.jts:jts-core:1.15.0' implementation 'com.google.code.gson:gson:2.8.0' |
截至目前,HERE Android SDK已包含在我们的项目中,但尚未配置。 其余配置将在项目的 AndroidManifest.xml 文件中进行。 打开项目的 AndroidManifest.xml 文件,并包含以下内容:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.raboy"> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme" android:hardwareAccelerated="true"> <meta-data android:name="com.here.android.maps.appid" android:value="APP-ID-HERE"/> <meta-data android:name="com.here.android.maps.apptoken" android:value="APP-TOKEN-HERE"/> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN"/> <category android:name="android.intent.category.LAUNCHER"/> </intent-filter> </activity> </application> </manifest> |
我们添加了一些东西,可以使用HERE Android SDK。 首先,我们需要定义权限,以便应用程序可以使用设备上的各种位置功能。 这些权限如下所示:
1 2 3 4 | <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/> |
添加适当的权限后,我们需要将应用程序链接到在HERE开发人员门户中找到的凭据。 这是应用程序ID和应用程序代码变得重要的地方。
1 2 | <meta-data android:name="com.here.android.maps.appid" android:value="APP-ID-HERE"/> <meta-data android:name="com.here.android.maps.apptoken" android:value="APP-TOKEN-HERE"/> |
确保使用您在帐户中找到的令牌;否则,地图将不会显示,并且您将不会拥有HERE必须提供的所有出色功能。
最后,您会注意到我们已经通过
从现在开始,我们可以开始使用HERE Android SDK进行开发。 老实说,以上大多数配置和设置与我以前的教程中找到的Java版本相同。
使用Kotlin在屏幕上显示交互式地图
Kotlin很棒,但是我更精通Java和其他编程语言。 尽管您接下来看到的所有内容都可以使用,但请放心,因为我不是Kotlin专业人士和超级用户。 我正在像其他所有人一样学习,因此,如果您发现可以优化的内容,请在评论中告诉我。
我们将从创建简单的UI开始。 打开项目的 activity_main.xml 并包括以下内容:
1 2 3 4 5 6 7 8 9 10 11 12 | <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical"> <fragment class="com.here.android.mpa.mapping.SupportmapFragment" android:id="@+id/mapFragment" android:layout_width="match_parent" android:layout_height="match_parent"/> </LinearLayout> |
注意
打开项目的 MainActivity.kt 文件,并包含以下内容:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | package com.example.raboy import android.support.v7.app.AppCompatActivity import android.os.Bundle import com.here.android.mpa.common.GeoCoordinate import com.here.android.mpa.common.OnEngineInitListener import com.here.android.mpa.mapping.map import com.here.android.mpa.mapping.SupportmapFragment class MainActivity : AppCompatActivity() { private var map : map = map() private var mapFragment : SupportmapFragment = SupportmapFragment() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) mapFragment = getSupportFragmentManager().findFragmentById(R.id.mapFragment) as SupportmapFragment mapFragment.init { error -> if (error == OnEngineInitListener.Error.NONE) { map = mapFragment.map map.setCenter(GeoCoordinate(37.7397, -121.4252, 0.0), map.Animation.NONE) map.zoomLevel = (map.maxZoomLevel + map.minZoomLevel) / 2 } } } } |
在上面的代码中,我们定义了两个私有变量。
创建活动后,我们将获取片段并对其进行初始化。 如果没有错误,我们可以将地图居中并设置缩放级别。 当然,我们可以做其他事情,例如查找地点,但这是一个简单的示例。
运行该应用程序,并查看其所有简单的荣耀!
结论
您刚刚了解了如何使用Kotlin和HERE Android SDK创建具有地图和位置服务支持的Android应用程序。 对于这个特定示例,大部分教程都是准备工作,实际上与我之前编写的Java版本并没有太大区别。 但是,核心应用程序逻辑使用Kotlin而不是Java。