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(); } }