この記事は、Kotlin Advent Calendar 2016 18日目の記事です。
(マッシュアップ企画ということで、Milkcocoa Advent Calendar 2016 17日目も同時担当させて頂きます。)
KotlinはJavaとほぼ完全な互換性があるとのことなので、Javaで使っていたライブラリもそのまま使えるのではと思い、試してみました。
今回は「Milkcocoa」というサービスのAndroid Java SDKをKotlinで使ってみたいと思います。
Milkcocoaについて
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
配下に配置します。
gradleファイルのdependencies
にライブラリの参照を記載します。
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する」という単純なサンプルアプリを作りました。
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()
}
}
}
<?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>
動作確認
ボタンを押すと、Milkcocoaのプラットフォーム上にデータが保存されていることが確認できました。
ハマったポイント
ライブラリとして使用する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で書くのに比べて簡潔で分かりやすいものになりました。
これからもどんどんKotlinやっていきたいと思います。
参考サイト
- Milkcocoa Android SDKのαバージョンを公開しました。
http://qiita.com/technicalrockstarsinc/items/deaf227b4c5568b08b05 - AndroidからMilkcocoaを使って見るメモ #mlkcca
http://qiita.com/n0bisuke/items/2680938a3ce9fd70ce88