在这里使用Kotlin和Android SDK入门

Getting Started With HERE Using Kotlin and the Android SDK

大约一个月前,我编写了关于Java和Android SDK入门的入门指南。 即使已存在有关该工作的文档,但我还是想在过程中尝试一下,以使其变得容易一些。

尽管Java很棒,但它已成为时间的遗物,并逐渐被Kotlin取代,后者被认为是新的热点。 Kotlin可以为JVM编译为字节码,在这种情况下,我们可以使用Kotlin(一种完全不同但越来越流行的语言)来复制所有Java应用程序。

在本教程中,我们将学习如何使用显示HERE地图的Kotlin构建Android应用程序。

为了获得一些观点,我们将尝试完成以下任务:

android-kotlin-example

如果您认为上面的图片看起来很熟悉,那是因为它与我之前的教程中使用的示例相同。 实际上,我们将要显示一个交互式地图。 虽然这听起来很容易,但必须进行一些配置才能使其成为可能。

在Kotlin支持下创建一个新的Android Studio项目

您不需要Android Studio即可与Kotlin一起使用或构建Android应用程序,但这使生活变得更加轻松。 因此,Android Studio将成为我们示例的重点。

我使用的是Android Studio 3.3,因此,如果您使用的是其他版本,则可能需要填补空白。

要开始,请选择创建一个新项目。

android-studio-kotlin-1

因为这是一个非常基本的示例,所以请确保创建一个活动为空的项目。 如果您喜欢冒险,请选择自己认为最合适的东西,或者尝试使用现有项目。

选择使用空活动后,我们需要定义我们的API版本,程序包命名和语言。

android-studio-kotlin-2

在此步骤中需要注意两个非常重要的事情。 您需要仔细选择您的软件包名称并记下它,因为此软件包名称将需要在您的HERE开发人员门户中使用。 软件包不匹配将导致您的API密钥不起作用。 您还需要选择Kotlin作为语言而不是Java。

此时,应该创建您的项目。 Android Studio可能会花费一些时间来同步您的依赖项。

安装和配置HERE Android SDK

这是我们开始集成HERE Android SDK的地方,以便可以在开发中使用它。 如果您还没有HERE开发者帐户,请确保在此处创建一个。 不用担心,开发人员帐户是免费的,您甚至不需要提供信用卡。

您将要在开发人员帐户中创建一个新项目,并生成一个新的 Android SDK Starter

here-developer-portal-android

请记住在生成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'
    }
}

包含本地库之后,我们需要将它们用作依赖项,因此以下implementation行:

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必须提供的所有出色功能。

最后,您会注意到我们已经通过android:hardwareAccelerated="true"行启用了硬件加速。

从现在开始,我们可以开始使用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>

注意mapFragment片段ID,因为它将在我们的Kotlin代码中使用。 借助我们超级简单的UI,让我们进入大部分代码。

打开项目的 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
            }
        }
    }
}

在上面的代码中,我们定义了两个私有变量。 mapFragment变量将绑定到我们的UI组件,而map变量将允许我们与UI组件中的地图组件进行交互。

创建活动后,我们将获取片段并对其进行初始化。 如果没有错误,我们可以将地图居中并设置缩放级别。 当然,我们可以做其他事情,例如查找地点,但这是一个简单的示例。

运行该应用程序,并查看其所有简单的荣耀!

结论

您刚刚了解了如何使用Kotlin和HERE Android SDK创建具有地图和位置服务支持的Android应用程序。 对于这个特定示例,大部分教程都是准备工作,实际上与我之前编写的Java版本并没有太大区别。 但是,核心应用程序逻辑使用Kotlin而不是Java。