LoginSignup
6
3

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-12-18

この記事は、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配下に配置します。
スクリーンショット 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やっていきたいと思います。

参考サイト

6
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
3