简单音乐播放器
来源:互联网 发布:linux上安装oracle 编辑:程序博客网 时间:2024/06/11 11:26
很简单的音乐播放器哦,网上的播放器东西有点多,自己做了一个简单的。
实现了扫描SD卡上的歌曲,声音控制,进度条控制,自动播放下一首,以及后台播放。因为时间仓促,界面美观,多包涵。
效果图
下面是代码
Java代码
package com.phone1000.days24service03mediapalylist;import java.io.File;import java.io.FilenameFilter;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import android.app.ListActivity;import android.content.Intent;import android.database.Cursor;import android.media.AudioManager;import android.os.Bundle;import android.provider.MediaStore;import android.view.Menu;import android.view.View;import android.view.View.OnClickListener;import android.widget.ArrayAdapter;import android.widget.Button;import android.widget.ListView;import android.widget.SeekBar;import android.widget.SeekBar.OnSeekBarChangeListener;import android.widget.Toast;public class MainActivity extends ListActivity {// 传地址给PlyerService public static Map<Integer, String> map = new HashMap<Integer, String>(); // 四个按钮 private Button playButton = null, mFrontButton = null, mLastButton = null, exitButton = null; // 播放进度seekbar public static SeekBar audioSeekBar = null; // 控制声音的seekbar private SeekBar audioVolumn = null; // 声音管理器 private AudioManager mAudioManager = null; // 播放列表 public static List<String> mMusicList = new ArrayList<String>(); // 设置播放当前的选项条目 public static int currentListItem = 0; Cursor mAudioCursor; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); getMusicList(); initView(); } /** * 给ListActivity中的ListView添加所有的以mp3结尾的音乐文件 */ private void getMusicList() { // 清空list mMusicList.clear(); mAudioCursor = this.getContentResolver().query( MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null,// 字段 没有字段 就是查询所有信息 相当于SQL语句中的 “ * ” null, // 查询条件 null, // 条件的对应?的参数 MediaStore.Audio.AudioColumns.TITLE);// 排序方式 // 循环输出歌曲的信息 mMusicList = new ArrayList<String>(); for (int i = 0; i < mAudioCursor.getCount(); i++) { mAudioCursor.moveToNext(); // 找到歌曲标题和总时间对应的列索引 int indexTitle = mAudioCursor .getColumnIndex(MediaStore.Audio.AudioColumns.TITLE); int indexARTIST = mAudioCursor .getColumnIndex(MediaStore.Audio.AudioColumns.ARTIST); int indexALBUM = mAudioCursor .getColumnIndex(MediaStore.Audio.AudioColumns.ALBUM); int indexData = mAudioCursor .getColumnIndex(MediaStore.Audio.AudioColumns.DATA); String strTitle = mAudioCursor.getString(indexTitle); String strARTIST = mAudioCursor.getString(indexARTIST); String strALBUM = mAudioCursor.getString(indexALBUM); String strData = mAudioCursor.getString(indexData); map.put(i,strData); mMusicList.add(strTitle + "---" + strARTIST + "---" + strALBUM); // 构建Adapter,将mMusicList的数据添加到Adapter内 ArrayAdapter<String> musicAdapter = new ArrayAdapter<String>( MainActivity.this, android.R.layout.simple_list_item_1, mMusicList); // 设置当前ListActivity中id为android:list的适配器为musicAdapter setListAdapter(musicAdapter); } } // 内部工具类,过滤所有以mp3结尾的文件 class MusicFilter implements FilenameFilter { @Override public boolean accept(File dir, String filename) { return filename.endsWith(".mp3"); } } private void initView() { mFrontButton = (Button) findViewById(R.id.button3); playButton = (Button) findViewById(R.id.button2); mLastButton = (Button) findViewById(R.id.button1); exitButton = (Button) findViewById(R.id.button4); audioVolumn = (SeekBar) findViewById(R.id.seekBar2); audioSeekBar = (SeekBar) findViewById(R.id.seekBar1); playButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { playMusic(AppConstant.PAUSE); } }); mFrontButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { nextMusic(); } }); mLastButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { frontMusic(); } }); exitButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(MainActivity.this, PlayerService.class); stopService(intent); finish(); } }); // 给播放进度添加监听 audioSeekBar.setOnSeekBarChangeListener(new SeekBarChangeEvent()); if (PlayerService.mMediaPlayer != null) { // 设置进度的最大值 audioSeekBar.setMax(PlayerService.mMediaPlayer.getDuration()); audioSeekBar.setProgress(PlayerService.mMediaPlayer .getCurrentPosition()); } mAudioManager = (AudioManager) getSystemService(AUDIO_SERVICE); audioVolumn.setProgress(mAudioManager .getStreamVolume(AudioManager.STREAM_MUSIC)); audioVolumn.setOnSeekBarChangeListener(new AudioVolumnChangeEvent()); } class AudioVolumnChangeEvent implements OnSeekBarChangeListener { @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, progress, 0); } @Override public void onStartTrackingTouch(SeekBar seekBar) { } @Override public void onStopTrackingTouch(SeekBar seekBar) { } } class SeekBarChangeEvent implements OnSeekBarChangeListener { @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { // 如果用户手动拖动seekbar的时候 if (fromUser) { PlayerService.mMediaPlayer.seekTo(progress); } } @Override public void onStartTrackingTouch(SeekBar seekBar) { // 开始拖动进度条的时候,音乐暂停 PlayerService.mMediaPlayer.pause(); } @Override public void onStopTrackingTouch(SeekBar seekBar) { // 停止拖動進度條的時候,音樂開始播放 PlayerService.mMediaPlayer.start(); } } protected void frontMusic() { if (--currentListItem >= 0) { playMusic(AppConstant.PLAY); } else { Toast.makeText(this, "已经是第一首歌曲了", Toast.LENGTH_LONG).show(); currentListItem = 0; } } protected void nextMusic() { if (++currentListItem >= mMusicList.size()) { Toast.makeText(this, "已经是最后一首歌曲了", Toast.LENGTH_LONG).show(); currentListItem = mMusicList.size() - 1; } else { playMusic(AppConstant.PLAY); } } private void playMusic(int pauseOrPlay) { Intent intent = new Intent(this, PlayerService.class); intent.putExtra("MSG", pauseOrPlay); startService(intent); } /** * 用户点击了ListActivity中的ListView的时候的操作 * * @param l * listView控件本身 * @param v * TextView用户点击的某一条目所对应的TextView * @param position * 位置 * @param id * id */ @Override protected void onListItemClick(ListView l, View v, int position, long id) { currentListItem = position; playMusic(AppConstant.PLAY); super.onListItemClick(l, v, position, id); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; }}
PlayerService :
package com.phone1000.days24service03mediapalylist;import android.app.Service;import android.content.Intent;import android.media.MediaPlayer;import android.media.MediaPlayer.OnCompletionListener;import android.os.IBinder;import android.widget.Toast;public class PlayerService extends Service implements OnCompletionListener, Runnable { public static MediaPlayer mMediaPlayer = null; // 设置是否单曲循环 private static boolean isLoop = false; // 用户的操作 private int MSG; @Override public void onCreate() { if (mMediaPlayer != null) { mMediaPlayer.reset(); mMediaPlayer.release(); mMediaPlayer = null; } mMediaPlayer = new MediaPlayer(); mMediaPlayer.setOnCompletionListener(this); super.onCreate(); } private void playMusic() { try { mMediaPlayer.reset(); mMediaPlayer.setDataSource(MainActivity.map .get(MainActivity.currentListItem)); mMediaPlayer.prepare(); mMediaPlayer.start(); mMediaPlayer.setLooping(isLoop); MainActivity.audioSeekBar.setMax(PlayerService.mMediaPlayer .getDuration()); new Thread(this).start(); } catch (Exception e) { e.printStackTrace(); } } @Override public void run() { int currentPostion = 0; // 获得媒体的播放持续时间 int toal = mMediaPlayer.getDuration(); while (mMediaPlayer != null && currentPostion < toal) { try { Thread.sleep(1000); if (mMediaPlayer != null) { // 获得媒体的当前播放位置 currentPostion = mMediaPlayer.getCurrentPosition(); } } catch (InterruptedException e) { e.printStackTrace(); } // 设置MainActivity中audioSeekBar控件的当前进度为currentPostion MainActivity.audioSeekBar.setProgress(currentPostion); } } /** * 播放完当前歌曲,自动播放下一首 */ @Override public void onCompletion(MediaPlayer mp) { if (++MainActivity.currentListItem >= MainActivity.mMusicList.size()) { Toast.makeText(this, "已经到最后一首了", Toast.LENGTH_LONG).show(); MainActivity.currentListItem--; MainActivity.audioSeekBar.setMax(0); } else { playMusic(); } } @Override public int onStartCommand(Intent intent, int flags, int startId) { MSG = intent.getIntExtra("MSG", AppConstant.PLAY); switch (MSG) { case AppConstant.PLAY: playMusic(); break; case AppConstant.PAUSE: if (mMediaPlayer.isPlaying()) { mMediaPlayer.pause(); } else { mMediaPlayer.start(); } break; default: break; } return super.onStartCommand(intent, flags, startId); } @Override public void onDestroy() { if (mMediaPlayer != null) { mMediaPlayer.stop(); mMediaPlayer.release(); mMediaPlayer = null; } super.onDestroy(); } @Override public IBinder onBind(Intent intent) { // TODO Auto-generated method stub return null; }}
AppConstant
package com.phone1000.days24service03mediapalylist;public interface AppConstant { int PLAY = 1; // 播放 int PAUSE = 2; // 暂停}
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/LinearLayout1" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:background="@drawable/pic1" tools:context=".MainActivity" > <SeekBar android:id="@+id/seekBar1" android:layout_width="match_parent" android:layout_height="wrap_content" /> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" > <Button android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="pre" /> <Button android:id="@+id/button2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="pau" /> <Button android:id="@+id/button3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="nex" /> <Button android:id="@+id/button4" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="exi" /> </LinearLayout> <SeekBar android:id="@+id/seekBar2" android:layout_width="match_parent" android:layout_height="wrap_content" /> <Button android:id="@+id/button5" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="Play list" /> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" > <ListView android:id="@+id/android:list" android:layout_width="match_parent" android:layout_height="wrap_content" > </ListView> </LinearLayout></LinearLayout>
最后别忘记加权限了:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
[源代码下载](http://download.csdn.net/detail/qq_29089575/9172387)今天发现了一个错误,没播放音乐时拖动进度条会报错。
解决办法是給监听事件设置条件。如果进度条不是0的时候给它注册监听。
if(PlayerService.currentPostion==0){ }else{audioSeekBar.setOnSeekBarChangeListener(new SeekBarChangeEvent()); }
0 0
- 简单音乐播放器
- 简单音乐播放器
- 简单音乐播放器
- 简单~音乐播放器
- Android-简单音乐播放器
- 简单音乐播放器实现
- 简单的音乐播放器
- 简单的音乐播放器
- Android简单音乐播放器
- 简单html音乐播放器
- android简单音乐播放器
- Android简单音乐播放器
- 简单的音乐播放器
- 简单的音乐播放器
- 简单的音乐播放器
- Android简单音乐播放器
- android简单音乐播放器
- 简单Android音乐播放器
- hadoop网络配置十分重要
- CVPR 2015 Oral概览 - 第一天下午
- 迷茫
- 随笔
- objective-c如何获得文件路径
- 简单音乐播放器
- DSP using MATLAB中的函数学习
- 【Python】Learn Python the hard way, ex32 for循环
- 对内核添加cramfs支持
- 静态内部类与成员内部类
- 千里之行,始于足下。
- 红黑树
- 黑马程序员——JavaSE之集合框架一
- Easier Done Than Said?