teriyaki note

好きなものはラーメンと将棋

Kotlin でAndroid アプリ開発 - JSONファイルの入出力

Kotlin を使ったAndroid アプリ開発です。

今回はファイルの入出力、そしてJSONファイルの扱いに関する内容です。

環境

adb を使って出力ファイルを確認する

アプリが内部ストレージに保存したファイルは、その端末からしかアクセスができません。

開発を行う際には保存されたファイルを確認したりしたいので、adb (Android Debug Bridge)と呼ばれるツールを用います。

ターミナルからadb を使用できるようにするにはSDKのパスを通す必要があります。

まずSDKが保存されている場所を確認します。これはSDK Manager などから確認できます。

f:id:teriyaki398:20190326180414p:plain:w350

次にパスを通します。.bash_profile などに先ほど確認したパス + /platform-tools を記述します。

export PATH=$PATH:/Users/***/Library/Android/sdk/platform-tools

これだけの話です。

% adb version
Android Debug Bridge version 1.0.39

こんな感じで表示された成功です。

それでは現在接続している端末を確認してみましょう。エミュレータを起動している状態で以下のコマンドを打ってみます。

% adb devices
List of devices attached
emulator-5554   device

emulator-5554 というのが確認できました。これのシェルを起動してみます。

% adb -s emulator-5554 shell
generic_x86:/ $
generic_x86:/ $ run-as com.***.****
generic_x86:/data/data/com.***.**** $ ls -hl
total 3.2M
drwxrws--x 2 u0_a86 u0_a86_cache 4.0K 2019-03-07 15:56 cache
drwxrws--x 2 u0_a86 u0_a86_cache 4.0K 2019-03-07 15:56 code_cache
drwx------ 3 u0_a86 u0_a86       4.0K 2019-03-28 14:18 files
-rwxrwxrwx 1 u0_a86 u0_a86       3.2M 2019-03-08 09:14 libperfa_x86.so
-rw-rw-rw- 1 u0_a86 u0_a86        31K 2019-03-08 09:14 perfa.jar
-rwxrwxrwx 1 u0_a86 u0_a86       3.2M 2019-03-08 09:14 perfd

run-as パッケージ名 とすることで内部ファイルが確認できるようになります。

ローカルに保存したファイルなどはfilesディレクトリ以下に保存されるようです。

とりあえずファイルを入出力してみる

出力の確認ができるようになったので、早速適当にファイルを出力してみます。

今回はKotlin 標準ライブラリを使ったテキストの出力です。

と言っても、

  • File([ファイル名]) でFileオブジェクトを作成
  • .writeText([文字列]) で書き込み
  • .readText()で読み込み

だけです。

package com.***.***

import ...

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {

        val fileName = "$filesDir" + "/test.txt"
        val text     = "hello world.\n"

        try{
            val writeFile = File(fileName)
            writeFile.writeText(text)
        } catch (e: FileNotFoundException){
            println(e)
        }

        try{
            val readFile = File(fileName)
            println(readFile.readText())
        } catch (e: FileNotFoundException){
            println(e)
        }

    }
}

hello world と書かれたファイルが出力できていれば成功です。

Kotlin でJSON ファイルを扱う

調べて見た結果、JSON ファイルを扱う方法は色々あるようです。

JSONObjectJSONArrayクラスを使って読み込みもできるのですが、やはりライブラリを使用した方が記述が簡単でした。

https://developer.android.com/reference/org/json/JSONObject

今回は色々あるJSONパーサーの中でも代表的らしいJacksonのKotlin 向けライブラリを使用するのが良さそうです。

github.com

上のリンクに書かれている通り、Gradledependenciesに以下を追記します。

implementation "com.fasterxml.jackson.module:jackson-module-kotlin:2.9.7"

(公式にはcompile "" と書いてありますが、Android Studio に怒られたので変えてあります)

参考

[Android] アプリの内部メモリを覗くとパーミッションでブロックされる

よく使うadbのコマンド - Qiita