这些日子都在学习Android的应用开发,于是参考了Android从入门到精通里的代码(明日科技),抄抄写写做了一个简易的音乐播放器,修修改改也看了好多网上的代码,在三星盖世3上测试可以运行(关闭时会有停止运行的提示),但是在Genymotion的模拟器上无法运行,也就是闪退,还找不到原因,但是先把代码贴出来吧。。
Main.xml文件:
<?xml version="1.0" encoding="utf-8"?> <span style="font-family:Comic Sans MS;"><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <LinearLayout android:layout_width="wrap_content" android:layout_height="0dp" android:layout_weight="6"> <ListView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:id="@+id/list" android:drawSelectorOnTop="false"> </ListView> </LinearLayout> <include layout="@layout/buttom" android:layout_weight="1" android:layout_height="0dp" android:layout_width="fill_parent"/> <include layout="@layout/seek" android:layout_width="fill_parent" android:layout_height="0dp" android:layout_weight="1"/> </LinearLayout></span>
buttom.xml文件:
<span style="font-family:Comic Sans MS;"><?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="50dp"
android:orientation="horizontal">
<ImageButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:id="@+id/Pre"
android:src="@drawable/pre"/>
<ImageButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:id="@+id/Play"
android:src="@drawable/play"/>
<ImageButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:id="@+id/Pause"
android:src="@drawable/pause"/>
<ImageButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:id="@+id/Stop"
android:src="@drawable/stop"/>
<ImageButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:id="@+id/Next"
android:src="@drawable/next"/>
</LinearLayout>
</LinearLayout></span>
seek.xml文件:
<span style="font-family:Comic Sans MS;"><?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<SeekBar
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/seekBar"
android:layout_gravity="center_horizontal"/>
</LinearLayout>
</span>
MyActivity.java文件:
<span style="font-family:Comic Sans MS;">package com.example.Player;
import android.app.Activity;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.os.Message;
import android.view.View;
import android.widget.*;
import android.os.Handler;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
public class MyActivity extends Activity {
private MediaPlayer mediaPlayer;
private List<String>audioList=new ArrayList<String>();
private int currentItem=0;
private ImageButton pause;
private SeekBar seekBar;
@Override
protected void onDestroy() {
if (mediaPlayer.isPlaying()){
mediaPlayer.stop();
}
mediaPlayer.release();
super.onDestroy();
}
/**
* Called when the activity is first created.
*/
Handler handler=new Handler(){
@Override
public void handleMessage(Message msg) {
switch (msg.what){
case 0:
int position=mediaPlayer.getCurrentPosition();
int time=mediaPlayer.getDuration();
int max=seekBar.getMax();
seekBar.setProgress(position*max/time);
break;
default:
break;
}
}
};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mediaPlayer=new MediaPlayer();
ImageButton play=(ImageButton)findViewById(R.id.Play);
ImageButton pre=(ImageButton)findViewById(R.id.Pre);
ImageButton stop=(ImageButton)findViewById(R.id.Stop);
ImageButton next=(ImageButton)findViewById(R.id.Next);
pause= (ImageButton) findViewById(R.id.Pause);
audioList();
seekBar= (SeekBar) findViewById(R.id.seekBar);
seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
int dest=seekBar.getProgress();
int time=mediaPlayer.getDuration();
int max=seekBar.getMax();
mediaPlayer.seekTo(time*dest/max);
}
});
pre.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
preMusic();
}
});
play.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
playMusic(audioList.get(currentItem));
}
});
pause.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mediaPlayer.isPlaying()){
mediaPlayer.pause();
((ImageButton) v).setImageResource(R.drawable.pause1);
}else{
mediaPlayer.start();
((ImageButton) v).setImageResource(R.drawable.pause);
}
}
});
stop.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mediaPlayer.isPlaying()){
mediaPlayer.stop();
}
pause.setEnabled(false);
}
});
next.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
nextMusic();
}
});
mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
nextMusic();
}
});
}
private void audioList() {
getFiles("/sdcard/kgmusic/download/");
ArrayAdapter<String>adapter=new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,audioList);
ListView listView=(ListView)findViewById(R.id.list);
listView.setAdapter(adapter);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
currentItem = position;//将当前列表的索引值赋给currentItem
playMusic(audioList.get(currentItem));
}
});
final int milliseconds=100;
new Thread(){
@Override
public void run() {
while(true){
try{
sleep(milliseconds);
} catch (InterruptedException e) {
e.printStackTrace();
}
handler.sendEmptyMessage(0);
}
}
}.start();
}
private static String[] imageFormateSet=new String[]{"mp3","wav","3gp"};
private static boolean isAudioFile(String path){
for (String format:imageFormateSet){ //遍历数组
if (path.contains(format)){ //判断是否为合法的音频文件
return true;
}
}
return false;
}
private void playMusic(String path) {
try{
if (mediaPlayer.isPlaying()){
mediaPlayer.stop(); //停止当前音频的播放
}
mediaPlayer.reset();
mediaPlayer.setDataSource(path);
mediaPlayer.prepare();
mediaPlayer.start();
pause.setEnabled(true);
} catch (IOException e) {
e.printStackTrace();
}
}
void nextMusic(){
if (++currentItem>=audioList.size()){
currentItem=0;
}
playMusic(audioList.get(currentItem));
}
void preMusic(){
if (--currentItem>=0) {
if (currentItem >= audioList.size()) {
currentItem = 0;
}
} else {
currentItem = audioList.size() - 1;
}
playMusic(audioList.get(currentItem));
}
private void getFiles(String url) {
File files=new File(url);//创建文件对象
File[] file=files.listFiles();
try{
for (File f:file){ //通过for循环遍历获取到的文件数组
if (f.isDirectory()){
getFiles(f.getAbsolutePath());
}else {
if (isAudioFile(f.getPath())){ //如果是音频文件
audioList.add(f.getPath()); //将文件路径添加到List集合中
}
}
}
}catch (Exception e){
e.printStackTrace(); //输出异常信息
}
}
}</span>