タブレット用プログラムの書き止め

android OS & iPadOS の記録。

基礎。assetsフォルダから固有フォルダDataへファイルコピー。

2021-09-05 03:13:34 | Android studio 日記

 画像ファイルサムネイル表示のためにアプリ固有フォルダに画像ファイルを用意する。assetsファルダにはコピペで画像ファイルを入れられるが、dataフォルダにはストリームで書き込み複製しか方法がないので作る。

 assets/image ファルダにある画像ファイル名のリストを作る。dataフォルダにimage1フォルダがあるかチェック、無ければフォルダを作る。ストリームで転送。出力ファイルが無ければ作ってくれる。

 

public class MainActivity extends AppCompatActivity {

    private final ArrayList<MyNumbersInString> mFileNameList = new ArrayList<>();
    

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mAssetManager = getResources().getAssets();
        setFileNameList();
        initFiles()

    }

    private void initFiles() {

        String src = null;
        File dst = null;

        File dir = new File( getFilesDir() , "image1" );
        if ( !dir.exists() && !dir.mkdirs() ) {
            // 失敗処理
            return;
        }

        for (int i = 0; i < mFileNameList.size(); i++ ) {
            src = mFileNameList.get( i ).getName();
            dst = new File( dir.getPath(), src );
            fileCopy( ( "image/" + src ), dst );
        }

    }

    public void fileCopy ( String src, File dst ){
        if ( dst.exists() ) return;  // 出力ファイルが既にある場合は戻る。

        try {
            InputStream is = getAssets().open( src );  // input
            FileOutputStream fos = new FileOutputStream( dst, false); // output
            byte[] buffer = new byte[1024];
            int len = 0;
            while ( ( len = is.read( buffer ) ) >= 0 ) {
                fos.write( buffer, 0, len );
            }
            is.close();
            fos.close();
        } catch ( IOException e ) {
            return;
        }
    }

    private void setFileNameList() {

        String fName;
        String[] mList = new String[0];
        try {
            mList = mAssetManager.list("image");
        } catch (IOException e) {
            e.printStackTrace();
        }
        for (String s : mList) {
            fName = s;
            fName.toLowerCase(); //小文字に変換
            if (fName.endsWith(".jpg") || fName.endsWith(".png")) { //画像ファイル選択
                mFileNameList.add(new MyNumbersInString(s));
            }
        }

        Collections.sort(
                mFileNameList, new Comparator() {
                    @Override
                    public int compare(MyNumbersInString mn1, MyNumbersInString mn2) {
                        return mn1.getName2().compareTo(mn2.getName2());
                    }
                }
        );

    }
}

 

 複製後に利用する手順は、アプリ固有フォルダ取得をgetFilesDir()として、その中にimage1フォルダを作って複製したので、作ったフォルダを子としてセットする。

        File dir = new File( getFilesDir(),"image1" );
        String s = dir.getAbsolutePath() + "/" + "1.jpg";

 フォルダのパスとファイル名を足して、対象ファイルの絶対パスを作る。

        File f = new File( s );
        if ( !f.exists() || !f.isFile() ) return;
        InputStream istream = new FileInputStream( f );
        // 処理
        istream.clear();

 ストリームでビットマップデータをコーディングする。複製した画像ファイルの読み込みチェックは正常で問題なし。