您的位置:首页 > 移动开发 > Android开发

Android开发,简单MP3播放器

2014-04-12 11:07 288 查看
因为清明假期,好长时间没更博客了,之前做的MP3早在上上周就完工了,现在发上来。

这是学习Android开发之后自己做的第一个小APP,主要部分代码如下。

package com.example.mp3;

import java.util.List;

import com.example.domain.Mp3Info;

import com.example.adapter.MusicListAdapter;
import com.example.untils.MediaUtil;

import android.media.MediaPlayer;
import android.media.MediaPlayer.OnCompletionListener;
import android.os.Bundle;
import android.os.Handler;

import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
import android.view.KeyEvent;
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.TextView;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.IntentFilter;

public class MainActivity extends Activity {
private ListView mMusiclist; // 音乐列表
private List<Mp3Info> mp3Infos = null;
private TextView musictitle;
private SeekBar seekBar;
private int current;
private MediaPlayer player;
// private Handler handler = new Handler();
private Button ppButton;
private Button previous;
private Button next;
private boolean isPause;
private String url; // 歌曲路径
Handler handler = new Handler();

Runnable updateThread = new Runnable() {
public void run() {
// 获得歌曲现在播放位置并设置成播放进度条的值
seekBar.setProgress(player.getCurrentPosition());
// 每次延迟100毫秒再启动线程
handler.postDelayed(updateThread, 100);
}
};

MusicListAdapter listAdapter; // 改为自定义列表适配器

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mMusiclist = (ListView) findViewById(R.id.music_list);
musictitle = (TextView) findViewById(R.id.music_title);
ppButton = (Button) findViewById(R.id.play_music);
previous = (Button) findViewById(R.id.previous_music);
next = (Button) findViewById(R.id.next_music);
seekBar = (SeekBar) findViewById(R.id.audioTrack);
mp3Infos = MediaUtil.getMp3Infos(MainActivity.this); // 获取歌曲对象集合

listAdapter = new MusicListAdapter(this, mp3Infos);
mMusiclist.setAdapter(listAdapter);
// 创建一个音乐播放器
player = new MediaPlayer();

// 进度条监听器
seekBar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {

@Override
public void onStopTrackingTouch(SeekBar seekBar) {
// TODO Auto-generated method stub

}

@Override
public void onStartTrackingTouch(SeekBar seekBar) {
// TODO Auto-generated method stub

}

@Override
public void onProgressChanged(SeekBar seekBar, int progress,
boolean fromUser) {
// TODO Auto-generated method stub

// fromUser判断是用户改变的滑块的值
if (fromUser == true) {
player.seekTo(progress);
}
}
});

// 播放器监听器
player.setOnCompletionListener(new OnCompletionListener() {

@Override
public void onCompletion(MediaPlayer mp) {
// TODO Auto-generated method stub
next();
}
});

// 意图过滤器
IntentFilter filter = new IntentFilter();
mMusiclist.setOnItemClickListener(new OnItemClickListener() {

@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long arg3) {
// TODO Auto-generated method stub
current = position;
play();
}
});
ppButton.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
// TODO Auto-generated method stub

// 默认从第一首歌曲开始播放
if (!player.isPlaying() && !isPause) {
play();
return;
}

// 暂停/播放按钮
if ("暂停".equals(ppButton.getText())) {
pause();
ppButton.setText("播放");
} else {
resume();
ppButton.setText("暂停");
}
}
});
previous.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
// TODO Auto-generated method stub
current = current - 1 < 0 ? mp3Infos.size() - 1 : current - 1;
play();
}
});
next.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
// TODO Auto-generated method stub
current = (current + 1) % mp3Infos.size();
play();
}
});

// 播出电话暂停音乐播放
filter.addAction("android.intent.action.NEW_OUTGOING_CALL");
registerReceiver(new BroadcastReceiver() {

@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
pause();
}
}, filter);

// 创建一个电话服务
TelephonyManager manager = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);

// 监听电话状态,接电话时停止播放
manager.listen(new PhoneStateListener() {
public void onCallStateChanged(int state, String incomingNumber) {
pause();
}
}, PhoneStateListener.LISTEN_CALL_STATE);

}

private void play() {
try {
// 重播
player.reset();

// 获取歌曲路径
player.setDataSource(mp3Infos.get(current).getUrl());
url = mp3Infos.get(current).getUrl();

// 缓冲
player.prepare();

// 开始播放
player.start();

// 显示歌名
musictitle.setText(mp3Infos.get(current).getTitle());

// 设置进度条长度
seekBar.setMax(player.getDuration());

// 播放按钮样式
ppButton.setText("暂停");
handler.post(updateThread);

} catch (Exception e) {
e.printStackTrace();
}
}

/*
* 下一首按钮
*/
public void next(View view) {
next();
}

/*
* 播放下一首歌
*/
private void next() {
current = (current + 1) % mp3Infos.size();
play();
}

/*
* 开始操作
*/
private void resume() {
if (isPause) {
player.start();
isPause = false;
}
}

/*
* 暂停操作
*/
private void pause() {
if (player != null && player.isPlaying()) {
player.pause();
isPause = true;
handler.removeCallbacks(updateThread);
}
}

public void audioTrackChange(int progress) {
Intent intent = new Intent();
intent.setAction("com.wwj.media.MUSIC_SERVICE");
intent.putExtra("url", url);
intent.putExtra("listPosition", current);

intent.putExtra("progress", progress);
startService(intent);
}

protected void dialog() {

AlertDialog.Builder builder = new Builder(MainActivity.this);

builder.setMessage("确定要退出吗?");

builder.setTitle("提示");

builder.setPositiveButton("确认",

new android.content.DialogInterface.OnClickListener() {

@Override
public void onClick(DialogInterface dialog, int which) {

dialog.dismiss();
android.os.Process.killProcess(android.os.Process.myPid());
// player.stop();

// finish();

}

});

builder.setNegativeButton("取消",

new android.content.DialogInterface.OnClickListener() {

@Override
public void onClick(DialogInterface dialog, int which) {

dialog.dismiss();

}

});

builder.create().show();

}

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {

if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {

dialog();

return false;

}

return false;

}

}


运行之后的界面如下图。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息