在没有学编码以前感觉手机上的软件都是很复杂的,感觉一个音乐播放器我们是做不出来的,在经过我们这篇博客后你会发现一个简单的音乐播放器做起来是这么简单,我们可以在代码上继续完善我们的程序,做出属于我们自己的音乐播放器,在朋友面前也能装装了,但千万别在编程人员面前装,要不你会被鄙视的很惨的。
现在就让我们一起来研究一下我的学习笔记吧!
首先说说它说实现的功能,我们还是以效果图开始,
我们的这个程序实现了扫描内存卡上的MP3格式的音乐,当你点击它的时候就会开始播放,上方有三个按钮(做的不怎么好看,可以替换成图片按钮),分别是开始、暂停、停止。按钮下方是进度条。再下方是播放列表。
下面是完整代码:
main.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <TableLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:stretchColumns="*" > <TableRow > <Button android:id="@+id/startID" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="开始" /> <Button android:id="@+id/suspendID" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="暂停" /> <Button android:id="@+id/stopID" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="停止" /> </TableRow> </TableLayout> <SeekBar android:id="@+id/seek_bar" android:layout_width="fill_parent" android:layout_height="wrap_content" /> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="歌曲列表:" /> <ListView android:id="@id/android:list" android:layout_width="fill_parent" android:layout_height="wrap_content" > </ListView> </LinearLayout>
List.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal" > <TextView android:id="@+id/nameID" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <TextView android:id="@+id/fileSizeID" android:layout_width="wrap_content" android:layout_height="wrap_content" android:paddingLeft="10dp" /> </LinearLayout>
这是我们的扫描文件代码,可以得到我们需要的文件名和大小FileList.java
package cn.class3g.list; import java.io.File; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class FileList { public static List<Map<String, String>> fileList(String filepath) { List<Map<String, String>> list = new ArrayList<Map<String, String>>(); File dir = new File(filepath); File[] files = dir.listFiles(); for (int i = 0; i < files.length; i++) { File file = files[i]; System.out.println(file == null); if (file.isDirectory() && file.listFiles() != null) { fileList(file.getAbsolutePath()); } else if ((file.getName()).endsWith(".mp3")) { Map<String, String> map = new HashMap<String, String>(); map.put("name", file.getName()); map.put("fileSize", "" + file.length()); list.add(map); } } return list; } }
这是我们的ActivityMusic_PlayerAvtivity.javapackage cn.class3g.player; import java.io.IOException; import java.util.List; import java.util.Map; import android.app.ListActivity; import android.media.MediaPlayer; import android.os.Bundle; import android.os.Environment; import android.os.Handler; 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.ListView; import android.widget.SeekBar; import android.widget.SeekBar.OnSeekBarChangeListener; import android.widget.SimpleAdapter; import android.widget.TextView; public class Music_PlayerActivity extends ListActivity implements OnClickListener, OnItemClickListener, OnSeekBarChangeListener { private MediaPlayer player; private String name; private List<Map<String, String>> list; // 定义一个标志 private int current; Button startBtn, suspendBtn, stopBtn; SeekBar seekBar; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); findViews(); player = new MediaPlayer(); // 准备数据 String path = Environment.getExternalStorageDirectory() .getAbsolutePath(); list = cn.class3g.list.FileList.fileList(path); SimpleAdapter adapter = new SimpleAdapter(Music_PlayerActivity.this, list, R.layout.list, new String[] { "name", "fileSize" }, new int[] { R.id.nameID, R.id.fileSizeID }); setListAdapter(adapter); ListView lv = getListView(); lv.setOnItemClickListener(this); startBtn.setOnClickListener(this); suspendBtn.setOnClickListener(this); stopBtn.setOnClickListener(this); seekBar.setOnSeekBarChangeListener(this); } private void findViews() { startBtn = (Button) this.findViewById(R.id.startID); suspendBtn = (Button) this.findViewById(R.id.suspendID); stopBtn = (Button) this.findViewById(R.id.stopID); seekBar = (SeekBar) this.findViewById(R.id.seek_bar); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.startID: player.start(); break; case R.id.suspendID: player.pause(); break; case R.id.stopID: player.seekTo(0); player.stop(); try { player.prepare(); } catch (IllegalStateException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } break; } } @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { new Thread(new UpdateBar()).start(); current = position; TextView textview = (TextView) view.findViewById(R.id.nameID); name = textview.getText().toString(); // 重置 player.reset(); // 路径 try { player.setDataSource(Environment.getExternalStorageDirectory() .getAbsolutePath() + ("/" + name)); player.prepare(); } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalStateException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } player.start(); } @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { if (fromUser) player.seekTo(seekBar.getProgress()); } @Override public void onStartTrackingTouch(SeekBar seekBar) { // TODO Auto-generated method stub } @Override public void onStopTrackingTouch(SeekBar seekBar) { // TODO Auto-generated method stub } class UpdateBar implements Runnable { int position = 0; @Override public void run() { // TODO Auto-generated method stub while (player != null) { seekBar.setMax(player.getDuration()); position = player.getCurrentPosition(); seekBar.setProgress(position); try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } }