Androidのアプリは、内部に文字列、画像などの多くのリソースを持っています。このようなリソースファイルは、プロジェクトの /res/
パスに位置します。
純粋に .txt
などの構造的なパスのファイルを読み取るときには、この方法で読み取ることができません。(/ res / raw /にファイルを保存することができますが、リソースIDでアクセス可能で、ファイルpathで直接アクセスすることはできません)
アプリのApkファイルにいくつかのファイルを保存して、アプリでそのファイルを読みたい場合は、Assetsを利用します。 アプリは、Assetsにファイルを保存することができ、AssetManagerを通してこのファイルを読み取ることができます。
今後のプロジェクト内でAssetフォルダとファイルをどのように生成するか調べ、AssetManagerを介してファイルにアクセスする方法について説明します。
この記事で紹介されているコードは、すべての鼻間違って作成しました。
Assetsフォルダとファイルの作成
アンドロイドスタジオプロジェクトでAssetファイルは /main/assets/
パスの下にあります。
基本的にassetsフォルダは、プロジェクトに生成されていないため、直接作っ必要です。
下の図のように、[File] -> [New] -> [Folder] -> [Assets Folder]
でAssetsフォルダを作成することができます。
フォルダを作成する前にAssets pathを変更ハゲトニャと尋ねます。特別な理由がない限りFinishボタンを押して、デフォルトの場所にフォルダを作成します。
その後、フォルダは /main/assets/
に生成されます。
これで、このフォルダにファイルを作成します。私は 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
ファイルが存在します。
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
- Android - FusedLocationProviderClientに位置情報を取得する
- Android - GPS、Network位置情報を取得する(LocationManager)
- Android - adbコマンドでActivity実行
- アンドロイド - MediaStoreにメディアファイルを保存する方法
- Android - Runtime permissionリクエスト方法と例(kotlin)
- Android11 - Storage(ストレージ)の変更まとめ
- Jetpack Compose - RowとColumn
- Android 13 - 細かいメディアファイルの権限
- Android 13でNotification権限をリクエスト、通知を表示する
- エラー解決:android gradle plugin requires java 11 to run. you are currently using java 1.8.
- Query method parameters should either be a type that can be converted into a database column or a List
- Android - TabLayoutの実装方法(+ ViewPager2)
- Android - adbコマンドで特定のパッケージのプロセスの終了
- Android - adb push、pullでファイルのコピー、ダウンロード
- Android - adbコマンドでsettings value確認、変更、
- Android 12 - IntentFilterのexported明示的な宣言
- Android - adb logcatコマンドでログ出力
- Android - ACTION_BOOT_COMPLETEDイベント受信
- Android - Foreground Service実行
- Android - ファイル入出力の例(Read、Write、内部、外部ストレージ)
- Android - アプリの権限を確認(Permission check)
- Android - adbで実行中のプロセス、スレッドリスト及びメモリ情報の確認
- Android - Broadcast Receiver登録およびイベントの受信方法
- Android - Cleartext HTTP ... not permitted例外解決方法
- Androidのビルドエラー - Calls to Java default methods are prohibited in JVM target 1.6
- アンドロイド - Assetsでファイルを読み取る方法
- アンドロイドのさまざまなNotification種類と実装方法
- アンドロイド - INSTALL_FAILED_TEST_ONLYエラー解決方法
- Android EspressoのCustom Matcher実装方法
- Android Espressoを使用してUIをテストする方法(3)
- アンドロイド - CTS hostsideをgradleで構築する方法
- Androidのアプリのデータフォルダーのパスと内部/外部ストレージ説明
- アンドロイド - 最初のApp作成
- Androidをインストールする方法(Windows)