apkにファイルを含める

2,762 views
Skip to first unread message

Takanori Sudo

unread,
Aug 13, 2009, 3:45:30 AM8/13/09
to 日本Androidの会
こんにちは。

現在、Android向けアプリを作成しており、ファイルの読み書きをしたいと考えています。
方法としては、下記の方法ができたらよいと考えています。
i) Context.openFileInput()などでファイルを読み書きする。
ii) その対象となるファイルはapkに含め、インストール時に適切なディレクトリに展開する。
(/data/data/<パッケージ>/files ディレクトリあたり?)

i) は本家開発ガイドにも詳細があるので特に問題はないのですが、ii)を実現する方法が見つからない状態です。どなたか、ii)を実現する方法をご
存知の方はいらっしゃいますでしょうか。

ほかの方法として、リソースにRAWで含めてしまうという手も考えましたが、書き込みが必要なため、適用できそうにありません。
蛇足かもしれませんが、開発環境はUbuntu9, Eclipse3.3でAndroid SDKプラグインを使用しています。SDKは1.5 r3
で、NDK1.5 r1も使用しています。

本家や他のML等の過去ログも調べてみたのですが、どうもしっくりくる答えが見つけられませんでした。ご存知の方がいらっしゃいましたら、お知恵をお借
りしたいです。
よろしくお願いいたします。

Keiji Ariyama

unread,
Aug 13, 2009, 4:35:38 AM8/13/09
to android-g...@googlegroups.com
有山@大阪です。

> i) は本家開発ガイドにも詳細があるので特に問題はないのですが、ii)を実現
する方法が見つからない状態です。どなたか、ii)を実現する方法をご
> 存知の方はいらっしゃいますでしょうか。

 試してないので推測ですが、AssetManagerを使ってみてはどうでしょう。プロ
ジェクトのassetsディレクトリ下にファイルを配置して、

getResources().getAssets().open(fileName)

 これで取ったファイルを、Context.openFileOutput()で読み書きできる場所に
配置するとか。


/*********************************************
有限会社シーリス
代表 有山 圭二
@Address
〒530-0044
大阪市北区東天満二丁目2番5号
第2新興ビル 601
@Web http://www.c-lis.co.jp
*********************************************/

Katsuhiko Sato

unread,
Aug 13, 2009, 11:00:22 AM8/13/09
to android-g...@googlegroups.com
ユビラボ佐藤です

有山さんのご提案のとおりで、
ずばりAssetManagerで実現可能です。
ソース公開はできない状態なのですが、

AssetManager as = getResources().getAssets();
String path = "file:///android_asset/path/to/directory"
String[] filenames = as.list(path).length;

for(String filename; in filenames){
InputStream is = as.open(filename); //アセットファイルのストリーム作成
コピー処理(openFileOutput等でファイル作成)
}

ストリーム取得後は、adamrockerさんのサンプルがそのまま使えると思います。

http://www.adamrocker.com/blog/196/android_file_io.html

adamrocker

unread,
Aug 13, 2009, 11:56:40 AM8/13/09
to android-g...@googlegroups.com
adamrockerです。

確かにできましたー。

public class AssetTestActivity extends Activity implements OnClickListener {
private Button mBtn;
private ImageView mImg;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mBtn = (Button) findViewById(R.id.copy_and_view_btn);
mBtn.setOnClickListener(this);
mImg = (ImageView) findViewById(R.id.result_img);
}

public void onClick(View v) {
if (v == mBtn) {
try {
copyAndView();
} catch (IOException e) {
e.printStackTrace();
}
}
}

private final void copyAndView() throws IOException {
AssetManager as = getResources().getAssets();
InputStream is = as.open("android_img.png"); // アセットファイルのストリーム作成
String toFile = "android_image.png";
copy2Apk(is, toFile); // appローカルにコピー

Bitmap bit = BitmapFactory.decodeFile("/data/data/"
+ this.getPackageName() + "/files/" + toFile);
mImg.setImageBitmap(bit);
is.close();
as.close();
}

private void copy2Apk(InputStream input, String file)
throws IOException {
FileOutputStream output = openFileOutput(file,
Context.MODE_WORLD_READABLE);
int DEFAULT_BUFFER_SIZE = 1024 * 4;
byte[] buffer = new byte[DEFAULT_BUFFER_SIZE];
int n = 0;
while (-1 != (n = input.read(buffer))) {
output.write(buffer, 0, n);
}
output.close();
}
}

2009/08/14 0:00 に Katsuhiko Sato<stk...@ubilabo.net> さんは書きました:

Takanori Sudo

unread,
Aug 13, 2009, 10:03:53 PM8/13/09
to 日本Androidの会
なんと! 別の作業をしている間にご提案から検証まで!
ご返答いただきました皆様、ありがとうございました。
参考に(というよりほとんどそのまま使用・・・)させていただきます。
そしてapkのパッケージングのしくみとか、もっと勉強いたします。

ありがとうございました。
> >> @Webhttp://www.c-lis.co.jp
Reply all
Reply to author
Forward
0 new messages