12-17 12:04:26.415: INFO/StagefrightPlayer(34): setDataSource('/mnt/sdcard/WonderGirls_TellMe.mp3')
12-17 12:04:26.415: ERROR/MediaPlayer(365): start called in state 2
12-17 12:04:26.415: ERROR/MediaPlayer(365): error (-38, 0)
12-17 12:04:26.415: ERROR/MediaPlayer(365): Error (-38,0)
12-17 12:04:26.425: WARN/InputManagerService(60): Starting input on non-focused client ???com.android.internal.view.IInputMethodClient$Stub$Proxy@43e388e8 (uid=10032 pid=365)
12-17 12:04:26.445: INFO/StagefrightPlayer(34): setDataSource('/mnt/sdcard/Trouble is a friend.mp3')
12-17 12:04:26.445: ERROR/MediaPlayer(365): start called in state 2
12-17 12:04:26.445: ERROR/MediaPlayer(365): error (-38, 0)
12-17 12:04:26.445: ERROR/MediaPlayer(365): Error (-38,0)
12-17 12:04:26.455: WARN/InputManagerService(60): Starting input on non-focused client ??com.android.internal.view.IInputMethodClient$Stub$Proxy@43e388e8 (uid=10032 pid=365)
12-17 12:04:26.545: INFO/StagefrightPlayer(34): setDataSource('/mnt/sdcard/sweet dream.mp3')
12-17 12:04:26.675: ERROR/MediaPlayer(365): start called in state 2
12-17 12:04:26.675: ERROR/MediaPlayer(365): error (-38, 0)
12-17 12:04:26.675: ERROR/MediaPlayer(365): Error (-38,0)
12-17 12:04:26.685: WARN/InputManagerService(60): Starting input on non-focused client ??com.android.internal.view.IInputMethodClient$Stub$Proxy@43e388e8 (uid=10032 pid=365)
12-17 12:04:26.705: INFO/StagefrightPlayer(34): setDataSource('/mnt/sdcard/WonderGirls_TellMe.mp3')
12-17 12:04:26.705: ERROR/MediaPlayer(365): start called in state 2
12-17 12:04:26.715: ERROR/MediaPlayer(365): error (-38, 0)
12-17 12:04:26.715: ERROR/MediaPlayer(365): Error (-38,0)
12-17 12:04:26.745: WARN/InputManagerService(60): Starting input on non-focused client ??com.android.internal.view.IInputMethodClient$Stub$Proxy@43e388e8 (uid=10032 pid=365)
12-17 12:04:26.755: INFO/StagefrightPlayer(34): setDataSource('/mnt/sdcard/Trouble is a friend.mp3')
12-17 12:04:26.765: ERROR/MediaPlayer(365): start called in state 2
?
package fly.mediaplayer; import java.io.File; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Random; import android.app.Activity; import android.media.MediaPlayer; import android.os.Bundle; import android.os.Environment; import android.os.Handler; import android.os.Message; import android.view.View; import android.view.View.OnClickListener; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.Button; import android.widget.EditText; import android.widget.ListView; import android.widget.SeekBar; import android.widget.SimpleAdapter; import android.widget.Toast; /** * 音乐播放器 * */ public class MainActivity extends Activity { private ListView listView; private EditText title; SeekBar bar;// 进度条 private Map<String, String> listpath = new HashMap<String, String>();// 存储音乐名称和绝对路径 MediaPlayer mediaPlayer = new MediaPlayer(); private Handler handler = new UIHandler(); private boolean pause; AdapterView<?> parent; int position = -1; int model = 0;// 播放模式 :0 随机 :1 顺序:2 单曲循环 List<Map<String, Object>> paths = null; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); // 获得视图 listView = (ListView) this.findViewById(R.id.list); title = (EditText) this.findViewById(R.id.title); bar = (SeekBar) this.findViewById(R.id.lenghtBar); Button pause = (Button) this.findViewById(R.id.pause); Button reset = (Button) this.findViewById(R.id.reset); Button stop = (Button) this.findViewById(R.id.stop); Button down = (Button) this.findViewById(R.id.down); Button up = (Button) this.findViewById(R.id.up); Button model = (Button) this.findViewById(R.id.model); // 按钮添加事件 pause.setOnClickListener(new ButtonClickListener()); reset.setOnClickListener(new ButtonClickListener()); stop.setOnClickListener(new ButtonClickListener()); down.setOnClickListener(new ButtonClickListener()); up.setOnClickListener(new ButtonClickListener()); model.setOnClickListener(new ButtonClickListener()); bar.setOnSeekBarChangeListener(new SeekBarChangeListener()); paths = getList();// 获得音乐文件列表 SimpleAdapter adapter = new SimpleAdapter(this, paths, R.layout.list, new String[] { "path", "lenght" }, new int[] { R.id.path, R.id.lenght }); listView.setAdapter(adapter); listView.setOnItemClickListener(new ListOnClickListener());// 添加点击事件 new Thread(new BarThread()).start(); } /** * SeekBar重绘 * */ private class UIHandler extends Handler { public void handleMessage(Message msg) {// 运行在主线程中 int size = msg.getData().getInt("seek"); bar.setProgress(size); } } /** * 进度条拖拉监听 * */ private class SeekBarChangeListener implements SeekBar.OnSeekBarChangeListener { @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { } @Override public void onStartTrackingTouch(SeekBar seekBar) { } @Override public void onStopTrackingTouch(SeekBar seekBar) { if (mediaPlayer.isPlaying()) { mediaPlayer.stop(); mediaPlayer.seekTo(seekBar.getProgress()); play(); } } } /** * 进度条线程 * */ private class BarThread implements Runnable { public void run() { bar.setMax(mediaPlayer.getDuration()); while (mediaPlayer.getCurrentPosition() <= mediaPlayer .getDuration()) { Message ms = new Message(); ms.getData().putInt("seek", mediaPlayer.getCurrentPosition()); handler.sendMessage(ms); try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } } } } /** * 按钮事件监听器 * */ private final class ButtonClickListener implements OnClickListener { @Override public void onClick(View v) { if (position >= 0) { switch (v.getId()) { case R.id.pause: pause(); break; case R.id.reset: reset(); break; case R.id.stop: stop(); break; case R.id.down: down(); break; case R.id.up: up(); break; case R.id.model: if (model == 0) { model = 1; ((Button) v).setText(R.string.order); } else if (model == 1) { model = 2; ((Button) v).setText(R.string.loop); } else { model = 0; ((Button) v).setText(R.string.random); } break; } } else { Toast.makeText(getApplicationContext(), R.string.choice, Toast.LENGTH_LONG).show(); } } /** * 下一首 * */ private void down() { if (position + 1 < paths.size()) { position++; initMediaplayer(parent, position); play(); } else { stop(); Toast.makeText(getApplicationContext(), R.string.last, Toast.LENGTH_LONG).show(); } } /** * 上一首 * */ private void up() { if (position == 0) { stop(); Toast.makeText(getApplicationContext(), R.string.first, Toast.LENGTH_LONG).show(); } else { position = position - 1; initMediaplayer(parent, position); play(); } } } /** * ListView点击事件监听器 * */ private final class ListOnClickListener implements OnItemClickListener { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { initMediaplayer(parent, position); mediaPlayer.setOnCompletionListener(new CompletionListener(parent, position)); setViewAndPosition(parent, position); play();// 播放 } } /** * 存储当前的视图和位置 * */ private void setViewAndPosition(AdapterView<?> parent, int position) { this.parent = parent; this.position = position; } /** * 获得随即播放点 * */ private int getRandom(AdapterView<?> parent, int position) { position = new Random().nextInt(parent.getChildCount()); return position; } /** * 获得顺序播放点 * */ private int getDown(AdapterView<?> parent, int position) { position += 1; if (position > parent.getChildCount() - 1) { position = 0; } return position; } /** * 播放完后 0.随即播放 1.顺序播放 2.单曲循环 * */ private class CompletionListener implements MediaPlayer.OnCompletionListener { private int position; private AdapterView<?> parent; public CompletionListener(AdapterView<?> parent, int position) { super(); this.position = position; this.parent = parent; } @Override public void onCompletion(MediaPlayer mp) { switch (model) { case 0: position = getRandom(parent, position); break; case 1: position = getDown(parent, position); break; case 2: break; } setViewAndPosition(parent, position); initMediaplayer(parent, position); play(); } } /** * 初始化 MediaPlayer * */ private void initMediaplayer(AdapterView<?> parent, int position) { @SuppressWarnings("unchecked") Map<String, String> map = (Map<String, String>) parent .getItemAtPosition(position); String path = map.get("path");// 获得触发事件的Item title.setText(path);// 设置标题 String realPath = listpath.get(path);// 获得绝对路径 mediaPlayer.reset(); try { mediaPlayer.setDataSource(realPath); } catch (Exception e) { e.printStackTrace(); } } /** * 重置 * */ private void reset() { if (mediaPlayer.isPlaying()) { mediaPlayer.seekTo(0); } else { if (title != null) play(); } } /** * 暂停 * */ private void pause() { if (mediaPlayer.isPlaying()) { mediaPlayer.pause(); pause = true; } else { play(); } } /** * 停止 * */ private void stop() { if (mediaPlayer.isPlaying()) { mediaPlayer.stop(); pause = false; } } /** * 播放 * */ private void play() { try { if (!pause) { mediaPlayer.prepare(); } mediaPlayer.start(); } catch (Exception e) { e.printStackTrace(); } } /** * 获取音乐列表 * */ private List<Map<String, Object>> getList() { File file = new File(Environment.getExternalStorageDirectory() .toString());// 获得SDCard File[] files = file.listFiles(); int lenght = 0; int m = 0; int s = 0; List<Map<String, Object>> list = new ArrayList<Map<String, Object>>(); // 获得所有的音乐文件 for (File filepath : files) { if (filepath.getName().endsWith(".mp3")) { Map<String, Object> lists = new HashMap<String, Object>(); try { mediaPlayer.reset(); mediaPlayer.setDataSource(filepath.toString()); mediaPlayer.prepare(); lenght = mediaPlayer.getDuration(); lenght = lenght / 1000; m = lenght / 60; s = lenght - m * 60; } catch (Exception e) { e.printStackTrace(); } lists.put("path", filepath.getName()); lists.put( "lenght", String.format("%02d", m) + ":" + String.format("%02d", s)); list.add(lists); listpath.put(filepath.getName(), filepath.toString()); } } return list; } }
?