旅好きエンジニアのメモ

旅のこと映画、統計、会計、プログラミングなど、気の向くままに語ります

kotlinでbit flyerのapiから仮想通貨の価格を取得する(android)

kotlinのデータを取得する

下記のブログを参考にさせていただきました。 ver-1-0.net

khttpを入れる

androidをほとんど触ったことがないのでライブラリをどういう風に入れるかもわかりませんでした。。。
まずはbuild.gradleにkhttpのライブラリを入れましょう。

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation"org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version"
    implementation 'com.android.support:appcompat-v7:26.1.0'
    implementation 'com.android.support.constraint:constraint-layout:1.0.2'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.1'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1'
    compile "khttp:khttp:0.1.0" // 追加する
}

ソースを書いていく

自分はMainActivity.ktにkhttpをinportしました。

import khttp.get

ちなみに下記はETHを取得しています。
また、MyAsyncTaskを使っている理由は、androidはメインスレッドでネットワーク通信が出来ないからです。(おそらくですが。。。)

取得処理自体はgetEthRateで行っています

全文ソース(MainActivity.kt)

import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.widget.TextView
import android.os.AsyncTask
import khttp.get

open class MyAsyncTask : AsyncTask<Void, Void, String>() {

    override fun doInBackground(vararg params: Void): String? {
        return null
    }

    override fun onPostExecute(text: String) {}
}

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {

        super.onCreate(savedInstanceState)

        setContentView(R.layout.activity_main)

        object : MyAsyncTask() {
            override fun doInBackground(vararg params: Void): String? {
                return getEthRate()
            }
            override fun onPostExecute(text: String) {
                val ethRate = findViewById<TextView>(R.id.ethRate)
                ethRate.setText(text)
            }
        }.execute()
    }
}

fun getEthRate(): String {
    var url : String = "https://lightning.bitflyer.jp/v1/getboard"
    return get(url).jsonObject.getString("mid_price")
}

マニフェストを修正する

どうやらandroidは設定ファイルを修正しないとエミュレーターで通信出来ないようです。 ですので <uses-permission android:name="android.permission.INTERNET" />をAndroidManifest.xmlに追加しましょう。

全文ソース(AndroidManifest.xml)

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="e.yuma.cccheck">

    <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">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
    <uses-permission android:name="android.permission.INTERNET" />
</manifest>修正する

普段Androidを触っていないと慣れないことが多いですが、やってみたら意外と楽しいかもです。(画面の修正は難しいですね)