assetsフォルダには1MB以上の非圧縮ファイルを設置できない

Androidでファイルを設置する場合にassetsフォルダを使用することがありますが、このフォルダにはファイルの容量制限があります。

[参考記事] assetsフォルダのファイルを扱う方法 AssetManager

この容量を超えたものをインストールしようとすると、次のようなエラーが出ることがあります。

W/ResourceType(11947): Unable to get buffer of resource asset file

またインストールできたとしても、実行時に次のようなエラーが出て突如アプリが閉じます。

D/asset   (  300): Data exceeds UNCOMPRESS_DATA_MAX (1353552 vs 1048576)

この容量はOSの次のファイルの『UNCOMPRESS_DATA_MAX』の値で制限されています。

frameworks/base/include/utils/asset.h

#ifdef HAVE_ANDROID_OS
        UNCOMPRESS_DATA_MAX = 1 * 1024 * 1024
#else
        UNCOMPRESS_DATA_MAX = 2 * 1024 * 1024
#endif

実機では端末によって設定が異なるため、値が違うことがあります。

assetsフォルダ内の全容量ではなく、ファイルごとの容量です。
res/xml以下のxmlファイルも該当します。
res/xmlフォルダの1MB以上のxmlファイルは読み込めない

制限されている値は、
UNCOMPRESS_DATA_MAX = 『非圧縮データの最大容量』
ということなので、圧縮されている場合にはこの制限はありません。

assetsフォルダに大きなファイルを設置するには、圧縮して設置する方法や、分割して設置する方法があります。
またそもそもassetsフォルダに設置せず、サーバからダウンロードするという方法もあります。

assetsフォルダに圧縮ファイルを設置して、解凍するサンプルコード

bigfile.dataを圧縮してbigfile.zipとしたものを次の場所に設置した場合、
/assets/datadir/bigfile.zip
次の場所に解凍されます。
/data/data/com.example.sample.text/files/bigfile.data

String path = null;
try {
	AssetManager	am	= getResources().getAssets();
	InputStream	is	= am.open("datadir/bigfile.zip", AssetManager.ACCESS_STREAMING);
	ZipInputStream	zis	= new ZipInputStream(is);
	ZipEntry		ze	= zis.getNextEntry();

	if (ze != null) {
		path = getFilesDir().toString() + "/" + ze.getName();
		FileOutputStream fos = new FileOutputStream(path, false);
		byte[] buf = new byte[1024];
		int size = 0;

		while ((size = zis.read(buf, 0, buf.length)) > -1) {
			fos.write(buf, 0, size);
		}
		fos.close();
		zis.closeEntry();
	}
	zis.close();
} catch (Exception e) {
	e.printStackTrace();
}

関連記事

スポンサーリンク

hasChildNodes

ホームページ製作・web系アプリ系の製作案件募集中です。

上に戻る