2010年9月24日金曜日

Android apkに書き込み可能なファイルを含める

apkに任意のファイルを含めてインストールし、プログラムから書き込み可能に出来ないかと調べてみました。

やりたい事は、apkにテキストファイルを含めて、インストール時にfilesフォルダに配置したかったのですが、
日本Androidの会 apkにファイルを含めるによると、直接filesフォルダに展開することはムリっぽいです。
かわりにres/rawにテキストファイルを含めて、初回起動時にfilesフォルダにコピーする方法が紹介されていました。


res/raw/test.txtをfilesフォルダにコピーします。
初回起動時はfiles/test.txtが存在しない場合としました。
package my.study.android;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;

import android.app.Activity;
import android.content.res.Resources;
import android.os.Bundle;

public class MainActivity extends Activity {

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //レイアウトの読み込み
        this.setContentView(R.layout.main);
        //filesフォルダにtest.txtが存在しなければ、res/raw/test.txtをコピーする。
        File file = this.getFileStreamPath("test.txt");
        if ( file.exists() == false ) {
            Resources res = this.getResources();
            try {
                fileCopy(res.openRawResource(R.raw.test),openFileOutput(file.getName(),MODE_PRIVATE));
            } catch (IOException e) {
                e.printStackTrace();
            }   
        } 
    }
 
    private void fileCopy(InputStream is , OutputStream os )throws IOException{
        BufferedReader br = null;
        BufferedWriter bw = null;
        try {
            br = new BufferedReader(new InputStreamReader(is));    
            bw = new BufferedWriter(new OutputStreamWriter(os));   

            String str;      
            while((str = br.readLine()) != null){      
                bw.append(str +"\n");     
            } 
            bw.flush();   
        } finally {   
            if (br != null) br.close();
            if (bw != null)bw.close();       
        }  
    }

}

0 件のコメント: