Android开发,简单MP3播放器
2014-04-12 11:07
288 查看
因为清明假期,好长时间没更博客了,之前做的MP3早在上上周就完工了,现在发上来。
这是学习Android开发之后自己做的第一个小APP,主要部分代码如下。
运行之后的界面如下图。
这是学习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; } }
运行之后的界面如下图。
相关文章推荐
- Android开发准备工作简单啦!---Android开发环境搭建及配置
- Android 多媒体开发学习之制作一个简单的画板
- android Jni NDK开发环境搭建及其简单实例的编写
- Android UI开发: 横向ListView(HorizontalListView)及一个简单相册的完整实现 (附源码下载)
- Android开发之Android studio中的Theme Editor的简单使用
- Android开发之利用注解简单实现动态权限申请
- Android开发初学者之简单的列表实现
- 深入浅出 - Android系统移植与平台开发(十) - led HAL简单设计案例分析
- Android开发--APK反编译就这么简单 详解(附图)和使用AXMLPrinter2.jar批量反编译xml文件
- 简单开发的android阅读器源码,包含了读取数据库和文件流处理功能
- Android 驱动跟系统开发 1. 一个简单的例子
- 最简单的android开发环境的搭建
- Android开发中WebView的简单使用小结
- Android开发之ButterKnife,GreenDao简单运用,以及推荐并使用一个好用的开源库BaseRecyclerViewAdapterHelper。
- Android开发笔记---contentProvider的简单了解
- Android UI开发: 横向ListView(HorizontalListView)及一个简单相册的完整实现 (附源码下载)
- Android开发中ProgressDialog简单用法示例
- Android开发shape的简单使用
- [android游戏开发初学]简单的游戏框架
- Android UI开发: 横向ListView(HorizontalListView)及一个简单相册的完整实现 (附源码下载)