Androidでバイナリをダウンロード

3G回線につないだAndroidデバイスでネットの向こうの音楽を再生したい、しかしなるべくアクセスを少なくしたいって事があると思う。

当たり前だが最初の一回はどうしようもない。だが二回目からの再生はローカルにキャッシュしたもので済ませられないか?というのが今回の趣旨である。なお、あくまで実験のため用意したMP3ファイルは自作、操作機能などもないのであしからず。

プログラムリスト

テキスト版を元にした改造なので、かなり汚い。すまない。まぁ実験だし。またその性格上、ストリーム再生機能もつけておらず、ダウンロード完了までは待つだけ。すまん。

なお、あくまでキャッシュの保管先は外部SDメモリ上の「パッケージ名」のフォルダの中となる。保存済みならダウンロードはせず、直接再生を試みる。

import android.app.Activity;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.os.Environment;
import android.widget.TextView;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Random;
import java.util.logging.Level;
import java.util.logging.Logger;

public class MainActivity extends Activity
{
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        randomPlayer();
    }

    private void randomPlayer(){
//        String rx = addZero(getRandom(20, 2)) + ".mp3";
        String rx = addZero(1) + ".mp3";
        String mpfile = downloadMP3("http://ellidanus-b.ddo.jp/" + rx,rx);
        localsoundplay(mpfile);
        dispMes("再生 " + mpfile);
    }

    private String addZero(int n){
        String r = "" + n;
        if(n < 0){
            r = "0002";
        }else if(n < 10){
            r = "000" + r;
        }else if(n < 100){
            r = "00" + r;
        }else if(n < 1000){
            r = "0" + r;
        }
        return(r);
    }

    private int getRandom(int max,int base){
        int r = 0;
        //Randomクラスのインスタンス化
        Random rnd = new Random();
        r = rnd.nextInt(max) + base;
        return(r);
    }

    // 指定URLからファイルをダウンロードし、その場所を返す。
    // すでに存在する場合は、単に場所を返却する。
    private String downloadMP3(String wx,String fn){
        HttpURLConnection http = null;
        InputStream in = null;
        String filePath = "";
        TextView web = (TextView) findViewById(R.id.textView1);
        String dir = Environment.getExternalStorageDirectory() + "/" + this.getPackageName();
        mkdir(dir); // 保管場所がないなら作成する。
        filePath = dir + "/" + fn;
        File f = new File(filePath);
        // ダウンロードしていないようなので取得する。
        if (f.exists() == false) {
            try {
// URLにHTTP接続
                URL url = new URL(wx);
                http = (HttpURLConnection) url.openConnection();
                http.setRequestMethod("GET");
                http.connect();
// データを取得
                in = http.getInputStream();
                int msize = http.getContentLength();
                //int msize = http.getContentLength() * 2;
                if (in != null) {
                    web.setText(filePath);
                    FileOutputStream fos = null;
                    fos = new FileOutputStream(filePath);
                    byte[] line = new byte[1024];
                    int size;
                    while (true) {
                        size = in.read(line);
                        if (size <= 0) {
                            break;
                        }

                        fos.write(line, 0, size);
                    }
                    fos.close();
                }
            } catch (Exception e) {
                web.setText(e.toString());
                e.printStackTrace();
            } finally {
                try {
                    if (http != null) {
                        http.disconnect();
                    }
                    if (in != null) {
                        in.close();
                    }
                } catch (Exception e) {
                }
            }
        }else{ // ダウンロードずみのようだ。
            web.setText("*** ダウンロードずみなので、そのまま再生する ***");
        }
        return(filePath);
    }

    private void localsoundplay(String fn) {
        try {
            //ローカルファイルを再生
            MediaPlayer mp = new MediaPlayer();
            mp.setDataSource(fn);
            mp.prepare();
            mp.start();
        } catch (IOException ex) {
            Logger.getLogger(MainActivity.class.getName()).log(Level.SEVERE, null, ex);
            dispMes("IOエラー");
        } catch (IllegalArgumentException ex) {
            Logger.getLogger(MainActivity.class.getName()).log(Level.SEVERE, null, ex);
            dispMes("Argumentエラー");
        } catch (IllegalStateException ex) {
            Logger.getLogger(MainActivity.class.getName()).log(Level.SEVERE, null, ex);
            dispMes("Srateエラー");
        }
    }

    private void dispMes(String x){
        TextView t = (TextView) findViewById(R.id.textView1);
        t.setText(x);
    }

    public boolean mkdir(String path){
        File file = new File(path);
        return file.mkdir();
    }

}