KotlinでAndroid Java向けSDK(e.g. Milkcocoa)を使ってみる

  • 4
    いいね
  • 0
    コメント

この記事は、Kotlin Advent Calendar 2016 18日目の記事です。
(マッシュアップ企画ということで、Milkcocoa Advent Calendar 2016 17日目も同時担当させて頂きます。)

KotlinはJavaとほぼ完全な互換性があるとのことなので、Javaで使っていたライブラリもそのまま使えるのではと思い、試してみました。
今回は「Milkcocoa」というサービスのAndroid Java SDKをKotlinで使ってみたいと思います。

Milkcocoaについて

https://mlkcca.com/

Milkcocoaは、IoTデバイス・スマートフォン・PC間で簡単にリアルタイムなデータのやり取りが出来るようになるクラウドプラットフォームです。

IoT領域に特化したバックエンドサービスです。サーバレスで手軽にリアルタイム通信・データストア/ロードができるので、Webやスマホアプリでも利用されるケースが増えています。

Android向けのSDKはこちらで公開されています。
https://github.com/milk-cocoa/milkcocoa_for_android

SDKを使ったサンプルプロジェクトも公開されているので、こちらを参考に書いてみます。
https://github.com/milk-cocoa/android-examples

Kotlin × Milkcocoa

Milkcocoaのライブラリファイルは、libs配下に配置します。
スクリーンショット 2016-12-18 13.45.04.png

gradleファイルのdependenciesにライブラリの参照を記載します。

build.gradle
dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.4.0'
    compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
    compile files ('libs/milkcocoa.jar')
}

 「ボタンを押すとMilkcocoaにデータをPushする」という単純なサンプルアプリを作りました。

MainActivity.kt
package com.shanonim.kotlinmilkcocoa

import android.os.Bundle
import android.support.v7.app.AppCompatActivity
import android.widget.Button
import android.widget.Toast
import com.mlkcca.client.DataElementValue
import com.mlkcca.client.MilkCocoa
import java.util.*

class MainActivity : AppCompatActivity() {

    val MILKCOCOA_KEY = "YOUR_MILKCOCOA_KEY"

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val pushButton = findViewById(R.id.button_milkcocoa_push) as Button
        pushButton.setOnClickListener {
            val params = DataElementValue()
            params.put("content", "this is message from kotlin.")
            params.put("date", Date().time)
            MilkCocoa(MILKCOCOA_KEY).dataStore("message").push(params)

            Toast.makeText(this, "Pushed", Toast.LENGTH_SHORT).show()
        }
    }
}
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.shanonim.kotlinmilkcocoa.MainActivity">

    <Button
        android:id="@+id/button_milkcocoa_push"
        android:layout_width="200dp"
        android:layout_height="100dp"
        android:layout_centerInParent="true"
        android:text="Push to Milkcocoa" />
</RelativeLayout>

動作確認

アプリの画面です。
Screenshot_2016-12-19-00-35-56.png

ボタンを押すと、Milkcocoaのプラットフォーム上にデータが保存されていることが確認できました。
スクリーンショット 2016-12-19 0.36.33.png

ハマったポイント

ライブラリとして使用するmilkcocoa.jarですが、前述のGithubにあるファイルを使用すると、データ送信時に以下のエラーが発生します。

MqttException (0)
     at org.eclipse.paho.client.mqttv3.persist.MqttDefaultFilePersistence.open(MqttDefaultFilePersistence.java:80)
     at org.eclipse.paho.client.mqttv3.MqttAsyncClient.<init>(MqttAsyncClient.java:286)
     at org.eclipse.paho.client.mqttv3.MqttAsyncClient.<init>(MqttAsyncClient.java:167)
     at org.eclipse.paho.client.mqttv3.MqttClient.<init>(MqttClient.java:224)
     at com.mlkcca.client.Transporter.connect(Transporter.java:105)
     at com.mlkcca.client.Transporter.<init>(Transporter.java:46)
     at com.mlkcca.client.MilkCocoa.init(MilkCocoa.java:50)
     at com.mlkcca.client.MilkCocoa.<init>(MilkCocoa.java:35)
     at com.shanonim.kotlinmilkcocoa.MainActivity$onCreate$1.onClick(MainActivity.kt:24)
     at android.view.View.performClick(View.java:3523)
     at android.view.View$PerformClick.run(View.java:14130)
     at android.os.Handler.handleCallback(Handler.java:605)
     at android.os.Handler.dispatchMessage(Handler.java:92)
     at android.os.Looper.loop(Looper.java:137)
     at android.app.ActivityThread.main(ActivityThread.java:4424)
     at java.lang.reflect.Method.invokeNative(Native Method)
     at java.lang.reflect.Method.invoke(Method.java:511)
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
     at dalvik.system.NativeStart.main(Native Method)
Unable to set up client: MqttException (0)

サンプルプロジェクトで使われているjarファイルを使用するとうまくいったので、こちらを使いましょう。
https://github.com/milk-cocoa/android-examples/blob/master/MilkChat2/app/libs/milkcocoa.jar

所感

今までJavaで使っていたライブラリをKotlinでもスムーズに使えることが実感できてよかったです。ライブラリを参照するコード自体も、Javaで書くのに比べて簡潔で分かりやすいものになりました。

スクリーンショット 2016-12-18 15.32.49.png

これからもどんどんKotlinやっていきたいと思います。

参考サイト