アンドロイド - Assetsでファイルを読み取る方法

By JS | Last updated: July 28, 2019

Androidのアプリは、内部に文字列、画像などの多くのリソースを持っています。このようなリソースファイルは、プロジェクトの /res/パスに位置します。 純粋に .txtなどの構造的なパスのファイルを読み取るときには、この方法で読み取ることができません。(/ res / raw /にファイルを保存することができますが、リソースIDでアクセス可能で、ファイルpathで直接アクセスすることはできません)

アプリのApkファイルにいくつかのファイルを保存して、アプリでそのファイルを読みたい場合は、Assetsを利用します。 アプリは、Assetsにファイルを保存することができ、AssetManagerを通してこのファイルを読み取ることができます。

今後のプロジェクト内でAssetフォルダとファイルをどのように生成するか調べ、AssetManagerを介してファイルにアクセスする方法について説明します。

この記事で紹介されているコードは、すべての鼻間違って作成しました。

Assetsフォルダとファイルの作成

アンドロイドスタジオプロジェクトでAssetファイルは /main/assets/パスの下にあります。 基本的にassetsフォルダは、プロジェクトに生成されていないため、直接作っ必要です。

下の図のように、[File] -> [New] -> [Folder] -> [Assets Folder]でAssetsフォルダを作成することができます。 create assets folder in android studio

フォルダを作成する前にAssets pathを変更ハゲトニャと尋ねます。特別な理由がない限りFinishボタンを押して、デフォルトの場所にフォルダを作成します。 その後、フォルダは /main/assets/に生成されます。 create assets folder in android studio

これで、このフォルダにファイルを作成します。私は posts.jsonというファイルを作成しました。

└── main
    ├── AndroidManifest.xml
    └── assets
        └── posts.json

posts.jsonに次のように内容を入力しました。

{
  "posts": [
    {
      "title": "how to get stroage size",
      "url": "https://codechacha.com/ja/get-free-and-total-size-of-volumes-in-android/",
      "draft": false
    },
    {
      "title": "Android Q, Scoped Storage",
      "url": "https://codechacha.com/ja/android-q-scoped-storage/",
      "draft": false
    },
    {
      "title": "How to parse JSON in android",
      "url": "https://codechacha.com/ja/how-to-parse-json-in-android/",
      "draft": true
    }
  ]
}

ApkにAssetsファイルの場所

AssetManagerでAssetをロードする前にApkファイルにAssetファイルがどこに位置しているかどうか、一度確認してみ越えております。

Apkを分析すると、Apk最も上位のパスで /assets/フォルダがあり、その下に /assets/posts.jsonファイルが存在します。 Assets in apk

AssetManagerはこのパスからファイルをインポートします。

AssetManagerにAssetsファイルの読み取り

次はAssetManagerでjsonファイルを読み取るコードです。

val assetManager = resources.assets
val inputStream= assetManager.open("posts.json")
val jsonString = inputStream.bufferedReader().use { it.readText() }

AssetManagerはAppのresources.assetsにインポートすることができます。 そして AssetManager.open(file name)は引数として渡された名前に対応するファイルをインポートInputStreamとして戻します。

AssetManagerのrootパスは "/assets/"であるので、引数として渡される "posts.json"のパスは "/assets/posts.json"となります。

以下は、上記のコードで取得したjsonファイルの文字列を読み込み、JSONObjectに解析するコードです。

val assetManager = resources.assets
val inputStream= assetManager.open("posts.json")
val jsonString = inputStream.bufferedReader().use { it.readText() }

val jObject = JSONObject(jsonString)
val jArray = jObject.getJSONArray("posts")

for (i in 0 until jArray.length()) {
    val obj = jArray.getJSONObject(i)
    val title = obj.getString("title")
    val url = obj.getString("url")
    val draft = obj.getBoolean("draft")
    Log.d(TAG, "title($i): $title")
    Log.d(TAG, "url($i): $url")
    Log.d(TAG, "draft($i): $draft")
}

実行結果は次のとおりです。

MainActivity: title(0): how to get stroage size
MainActivity: url(0): https://codechacha.com/ja/get-free-and-total-size-of-volumes-in-android/
MainActivity: draft(0): false
MainActivity: title(1): Android Q, Scoped Storage
MainActivity: url(1): https://codechacha.com/ja/android-q-scoped-storage/
MainActivity: draft(1): false
MainActivity: title(2): How to parse JSON in android
MainActivity: url(2): https://codechacha.com/ja/how-to-parse-json-in-android/
MainActivity: draft(2): true

Assetファイルのパス

前述のようにAssetManagerの基本root pathは /assets/です。

たとえば、プロジェクトで以下のようにファイルを作成しました。

└── main
    ├── AndroidManifest.xml
    └── assets
        ├── posts.json
        └── xml
             └── settings.xml

上記の2つのファイルは、次のようにインポートすることができます。 settings.xmlはxmlフォルダにあるため、 "xml/settings.xml"を引数として渡す必要があります。

val assetManager = resources.assets
val inputStream= assetManager.open("posts.json")
val inputStream= assetManager.open("xml/settings.xml")

まとめ

Assetsは、画像、String以外のファイルなどをapkに保存して、アプリで読み取るときに使用することができます。 Assetsを使用するには、Assetsフォルダを作成し、ファイルを保存する必要があります。そしてAssetManagerを介してファイルを読んで必要があります。

参考

Related Posts

codechachaCopyright ©2019 codechacha