MMazzon
MMazzon

Reputation: 394

Android assets, how can I read a file from a subfolder?

The code below works: it reads a file named "file.txt" which is located in the "assets" folder of the APK and stores it in a buffer. So far, so good:

String u = "content://com.example.app/file.txt:assets"
ContentResolver r = controls.activity.getContentResolver();
InputStream in = r.openInputStream(Uri.parse(u));
ByteArrayOutputStream out = new ByteArrayOutputStream();
byte[] buffer = new byte[4096];
int n = in.read(buffer);
while (n >= 0) {
    out.write(buffer, 0, n);
    n = in.read(buffer);
}
in.close();
return out.toByteArray();

If however the file I want to read is in a subfolder of assets, e.g. subfolder "sub", and I provide this Uri to the above code:

String u = "content://com.example.app/sub/file.txt:assets"

... then in this case I don't get anything. The file is there, as assets/sub/file.txt but the above code returns an empty buffer. The only change I made is to replace "file.txt" with "sub/file.txt" which points to where the file is stored.

What am I doing wrong? Is it wrong to create the uri string manually like that? I believe it's allowed to store files in assets subfolders... If that's allowed, how do I specify the path in the uri string?

Note that I'm not trying to give access to the file to another app, I just want to read my own file from my own APK's assets and put it in a buffer for internal use.

Any help is greatly appreciated!

Upvotes: 4

Views: 1570

Answers (1)

CommonsWare
CommonsWare

Reputation: 1006614

Use AssetManager and its open() method. So, you would replace:

ContentResolver r = controls.activity.getContentResolver();
InputStream in = r.openInputStream(Uri.parse(u));

with:

AssetManager assets = controls.activity.getAssets();
InputStream in = assets.open("sub/file.txt");

Upvotes: 3

Related Questions