安卓音乐播放器开发含源代码

合集下载

安卓音乐播放器开发,含源代码

安卓音乐播放器开发,含源代码

基于android平台的音乐播放器开发实验报告For personal use only in study and research; not for commercial use学生姓名:温从林学号:0215班级:计自1201第一章引言1.1 项目背景当今社会的生活节奏越来越快,人们对手机的要求也越来越高,由于手机市场发展迅速,使得手机操作系统也出现了不同各类,现在的市场上主要有三个手机操作系统,Windows mobile,symbian,以及谷歌的Android操作系统,其中占有开放源代码优势的Android系统有最大的发展前景。

那么能否在手机上拥有自己编写的个性音乐播放器呢?能的,谷歌Android系统就能做到。

本文的音乐播放器就是基于谷歌Android手机平台的播放器。

Android:是谷歌于2007年公布的开放式源代码手机系统,它的开放性就优于其它封闭式的手机系统,因此,任何人都可能根据自己的喜好将手机系统中的所有功能重新编写。

这使得越来越多的人关注这个操作系统。

本次作品音乐播放器就是基于Android平台的。

1.2 编写目的现今社会生活紧张,而欣赏音乐是其中最好的舒缓压力的方式之一,本项目的目的是开发一个可以播放主流音乐文件格式的播放器,本设计实现的主要功能是播放Mp3,Wav多种格式的音乐文件,并且能够控制播放,暂停,停止,播放列等基本播放控制功能,界面简明,操作简单。

本项目是一款基于Android手机平台的音乐播放器,使Android手机拥有个性的多媒体播放器,使手机显得更生动灵活化,与人们更为接近,让手机主人随时随地处于音乐视频的旋律之中。

使人们的生活更加多样化。

也使设计者更加熟练Android的技术和其它在市场上的特点。

1.3 开发环境Eclipse、Android SDK 3.2.0第二章系统需求分析2.1 功能需求(用例图分析)根据项目的目标,我们可获得项目系统的基本需求,以下从不同角度来描述系统的需求,并且使用用例图来描述,系统的功能需求,我们分成四部分来概括,即播放器的基本控制需要,播放列表管理需求,播放器友好性需求和播放器扩展卡需求。

android 开发之音乐播放器代码

android 开发之音乐播放器代码

package com.Aina.Android;import java.io.BufferedReader;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FilenameFilter;import java.io.IOException;import java.io.InputStreamReader;import java.util.ArrayList;import java.util.Iterator;import java.util.List;import java.util.TreeMap;import android.app.Activity;import android.app.AlertDialog;import android.app.Notification;import android.app.NotificationManager;import android.app.PendingIntent;import android.app.AlertDialog.Builder;import android.content.ActivityNotFoundException; import android.content.DialogInterface;import android.content.Intent;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.media.MediaPlayer;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.util.Log;import android.view.KeyEvent;import android.view.View;import android.widget.AdapterView;import android.widget.ArrayAdapter;import android.widget.ImageButton;import android.widget.ImageView;import android.widget.ListView;import android.widget.ScrollView;import android.widget.SeekBar;import android.widget.TextView;import android.widget.Toast;public class ActivityMain extends Activity{ /** Called when the activity is first created. */private ViewlrcKLOK viewlrcKLOK;private MediaPlayer mMediaPlayer = null;private SeekBar mSeekBar = null;private ListView mListView = null;private ImageButton mLastbtn = null;private ImageButton mStartbtn = null;private ImageButton mPausebtn = null;private ImageButton mStopbtn = null;private ImageButton mNextbtn = null;private TextView mTextView = null;private ScrollView scrollview =null;private ImageView header =null;private TextView lrc = null;private List<String> mMusiclist = null;private int mCurrent = 0;private int count = 0;private boolean isrun = false;private boolean isauto = false;private static final String PA TH = "/sdcard/mp3/";private static TreeMap<Integer, lrcObject> lrc_map;private static int lrc_timeend =0;private long KeyDownOldTime =0;private int KeyDownCount =0;private String songName ="";private String songAuthor ="";private NotificationManager mNotificationManager;private static int NOTIFICA TIONS_ID = yout.main;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.main);mListView = (ListView) this.findViewById(R.id.lv_music);mSeekBar = (SeekBar) this.findView ById(R.id.SeekBar01);mTextView = (TextView) this.findV iewById(R.id.mTextV iew);viewlrcKLOK = (ViewlrcKLOK) this.findView ById(R.id.lrc_view);lrc = (TextView) this.findViewById(R.id.lrc);scrollview = (ScrollView) this.findView ById(R.id.scrollview);mLastbtn = (ImageButton) this.findView ById(R.id.imgbtn_last);mStartbtn = (ImageButton) this.findViewById(R.id.imgbtn_start);mPausebtn = (ImageButton) this.findViewById(R.id.imgbtn_pause);mStopbtn = (ImageButton) this.findViewById(R.id.imgbtn_stop);mNextbtn = (ImageButton) this.findViewById(R.id.imgbtn_next);header = (ImageView) this.findViewById(R.id.header);mMusiclist = new ArrayList<String>();mMediaPlayer = new MediaPlayer();lrc_map = new TreeMap<Integer, lrcObject>();viewlrcKLOK.SetlrcContent("歌词",0,0,"......",0);lrc_timeend = 0;lrc.setV isibility(View.GONE);mNotificationManager = (NotificationManager) getSystemService(NOTIFICA TION_SERVICE);mMediaPlayer.setOnPreparedListener(prepareListener);mMediaPlayer.setOnCompletionListener(CompletionListener);mMediaPlayer.setOnErrorListener(ErrorListener);// 开始按钮mStartbtn.setOnClickListener(new ImageButton.OnClickListener() {@Overridepublic void onClick(View v) {//lrc.setV isibility(View.GONE); //控件隐藏PlayMusic(PA TH + mMusiclist.get(mCurrent));}});// 下一首mNextbtn.setOnClickListener(new ImageButton.OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubNextMusic();}});// 上一首mLastbtn.setOnClickListener(new ImageButton.OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubLastMusic();}});// 暂停mPausebtn.setOnClickListener(new ImageButton.OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubisrun = true;isauto = false;mPausebtn.setVisibility(V iew.GONE);// 隐藏暂停按钮mStartbtn.setV isibility(View.VISIBLE);// 显示启动按钮// 是否正在播放if (mMediaPlayer.isPlaying()) {viewlrcKLOK.Stop();mMediaPlayer.pause();}}});// 停止mStopbtn.setOnClickListener(new ImageButton.OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubStopMusic();}});mListView.setOnItemClickListener(new ListView.OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> arg0, V iew arg1, int arg2, long arg3) {mCurrent = arg2;StopMusic();PlayMusic(PA TH + mMusiclist.get(mCurrent));}});mSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {@Overridepublic void onProgressChanged(SeekBar seekBar,int progress, boolean fromUser) {if (!isauto) {mMediaPlayer.seekTo(progress);}}@Overridepublic void onStartTrackingTouch(SeekBar seekBar) {isauto = false;}@Overridepublic void onStopTrackingTouch(SeekBar seekBar) {isauto = true;}});this.MusicList();}private void setPlayint(String tickerText, String title, String content,int drawable) {Notification notification = new Notification(drawable, tickerText,System.currentTimeMillis());PendingIntent contentIntent = PendingIntent.getActivity(this, 0,new Intent(this, ActivityMain.class), 0);notification.setLatestEventInfo(this, title, content, contentIntent);mNotificationManager.notify(NOTIFICA TIONS_ID, notification);}private MediaPlayer.OnPreparedListener prepareListener = new MediaPlayer.OnPreparedListener(){public void onPrepared(MediaPlayer mp){isrun = true;setPlayint(songAuthor,songName, songAuthor, R.drawable.icon);lrc_timeend = 0;viewlrcKLOK.SetlrcContent("准备好",0,0,"go,go,go..",0);viewlrcKLOK.Star();count = mMediaPlayer.getDuration();Log.i("TAG-count", count + "");mSeekBar.setMax(count);// 设置最大值.mTextView.setText("当前播放歌曲:" + mMusiclist.get(mCurrent));mp.start(); //开始播放//Toast.makeText(ActivityMain.this, "开始播放",Toast.LENGTH_SHORT).show();myHandler.sendEmptyMessage(PROGRESS_CHANGED);}};//视频播放完成private MediaPlayer.OnCompletionListener CompletionListener=new MediaPlayer.OnCompletionListener(){@Overridepublic void onCompletion(MediaPlayer arg0) {mMediaPlayer.stop();isauto = true;mSeekBar.setProgress(0);viewlrcKLOK.SetlrcContent("准备好",0,0,"... ...",0);viewlrcKLOK.Stop();//Toast.makeText(ActivityMain.this, "播放完成:",Toast.LENGTH_SHORT).show();NextMusic();}};//播放时发现错误private MediaPlayer.OnErrorListener ErrorListener=new MediaPlayer.OnErrorListener(){ @Overridepublic boolean onError(MediaPlayer mp, int what, int extra) {// TODO Auto-generated method stubmMediaPlayer.stop();Toast.makeText(ActivityMain.this, "发现错误:-错误编号:"+what,Toast.LENGTH_SHORT).show();return true;}};public void PlayMusic(String path) {try {String lrcpath = path;//装载歌词lrcpath = lrcpath.substring(0,lrcpath.length()-4)+".lrc";this.lrc.setText(read(lrcpath));//Toast.makeText(this,"打开",Toast.LENGTH_SHORT).show();//装载头像String headerFile = path.substring(PA TH.length());int pos1 = headerFile.indexOf("-");int pos2 = headerFile.indexOf(".");if (pos1>=0){songName = headerFile.substring(pos1+1,pos2);headerFile = headerFile.substring(0,pos1);songAuthor = headerFile.trim();}headerFile = PA TH+"pic/"+headerFile.trim()+".jpg";//Toast.makeText(this, headerFile, Toast.LENGTH_SHORT).show();File myFile = new File(headerFile);if (myFile.exists()){Bitmap bm = BitmapFactory.decodeFile(headerFile);header.setImageBitmap(bm);}else{Bitmap bm = BitmapFactory.decodeResource(this.getResources(),R.drawable.back4);header.setImageBitmap(bm);}mStartbtn.setV isibility(View.GONE);// 隐藏启动按钮mPausebtn.setVisibility(V iew.VISIBLE);// 显示暂停按钮if (!isrun) {mMediaPlayer.reset();// 重置mMediaPlayer.setDataSource(path);// 设置数据源mMediaPlayer.prepare();// 准备} else {mMediaPlayer.start();// 暂停之后接着播放viewlrcKLOK.Star();}isauto = true;} catch (Exception ex) {this.ShowDialog("播放音乐异常:" + ex.getMessage());}}//创建一个消息处理private final static int PROGRESS_CHANGED = 0;private final static int HIDE_CONTROLER = 1;private final static int VIDEO_READY =3;Handler myHandler = new Handler(){@Overridepublic void handleMessage(Message msg) {switch(msg.what){case VIDEO_READY:break;case PROGRESS_CHANGED:{int nowTime = mMediaPlayer.getCurrentPosition();if (nowTime<count){mSeekBar.setProgress(nowTime);mSeekBar.invalidate();if (nowTime>lrc_timeend && isrun){//查找歌词Iterator<Integer> iterator = lrc_map.keySet().iterator();while(iterator.hasNext()) {Object ob =iterator.next();lrcObject val = (lrcObject)lrc_map.get(ob);if (nowTime>val.begintime){lrcObject val_1 = new lrcObject();val_1.begintime = 0;val_1.lrc ="...";val_1.timeline = 0;if (iterator.hasNext()){Object ob_1 =iterator.next();val_1 = (lrcObject)lrc_map.get(ob_1);}lrc_timeend = val_1.begintime+val_1.timeline;viewlrcKLOK.SetlrcContent(val.lrc,val.timeline,val_1.begintime-val.begintime-val.timeline, val_1.lrc,val_1.timeline);viewlrcKLOK.invalidate();}}}nowTime/=1000;int minute = nowTime/60;int hour = minute/60;int second = nowTime%60;minute %= 60;//mTextView.setText(String.format("%02d",nowTime));mTextView.setText(String.format("%02d:%02d:%02d", hour,minute,second));}sendEmptyMessage(PROGRESS_CHANGED);}break;case HIDE_CONTROLER:break;}super.handleMessage(msg);}};public void NextMusic() {int num = mMusiclist.size();if (++mCurrent >= num) {mCurrent = 0;}StopMusic();PlayMusic(PA TH + mMusiclist.get(mCurrent));}public void LastMusic() {int num = mMusiclist.size();if (--mCurrent < 0) {mCurrent = num - 1;}StopMusic();PlayMusic(PA TH + mMusiclist.get(mCurrent));}@Overrideprotected void onPause() {super.onPause();/*Dialog dialog = new AlertDialog.Builder(this).setTitle("对话框标题") .setIcon(R.drawable.icon).setMessage("登陆对话框")// 设置对话框显示一个单选的list.setPositiveButton("确定", new DialogInterface.OnClickListener() { @Overridepublic void onClick(DialogInterface dialog, int which) {// TODO Auto-generated method stubfinish();}}).setNeutralButton("退出", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {// TODO Auto-generated method stub}}).create();dialog.show();*/setPlayint(songAuthor,songName, songAuthor, R.drawable.icon);}/*** 销毁*/@Overrideprotected void onDestroy() {isauto = false;if (mMediaPlayer.isPlaying()) {mMediaPlayer.stop();// 停止}mMediaPlayer.reset();mMediaPlayer.release();super.onDestroy();}protected void dialog() {AlertDialog.Builder builder = new Builder(ActivityMain.this);builder.setMessage("确定要退出吗?");builder.setTitle("提示");builder.setPositiveButton("确认",new android.content.DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {dialog.dismiss();mNotificationManager.cancel(NOTIFICA TIONS_ID);android.os.Process.killProcess(android.os.Process.myPid());}});builder.setNegativeButton("取消",new android.content.DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {onPause();dialog.dismiss();}});builder.create().show();}@Overridepublic boolean onKeyDown(int keyCode,KeyEvent event){if (keyCode==79)//耳机键{long time = System.currentTimeMillis();if ((time-KeyDownOldTime)/1000>5)KeyDownCount = 0;KeyDownCount++;Toast.makeText(this, "按键次数:"+event.getRepeatCount()+"所用时间:"+(time-KeyDownOldTime)/1000, Toast.LENGTH_SHORT).show();KeyDownOldTime = time;}else if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {dialog();return true;}return super.onKeyDown(keyCode, event);/*if (keyCode == KeyEvent.KEYCODE_BACK) {PackageManager pm = getPackageManager();ResolveInfo homeInfo = pm.resolveActivity(new Intent(Intent.ACTION_MAIN).addCategory(Intent.CA TEGORY_HOME), 0);ActivityInfo ai = homeInfo.activityInfo;Intent startIntent = new Intent(Intent.ACTION_MAIN);startIntent.addCategory(Intent.CA TEGORY_LAUNCHER);startIntent.setComponent(new ComponentName(ai.packageName,));startActivitySafely(startIntent);return true;} elsereturn super.onKeyDown(keyCode, event);*/}void startActivitySafely(Intent intent) {intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);try {startActivity(intent);} catch (ActivityNotFoundException e) {} catch (SecurityException e) {}}public void StopMusic() {isrun = false;viewlrcKLOK.Stop();lrc_timeend = 99999;mPausebtn.setVisibility(V iew.GONE);// 隐藏暂停按钮mStartbtn.setV isibility(View.VISIBLE);// 显示启动按钮if (mMediaPlayer.isPlaying()) {mMediaPlayer.stop();// 停止}}/*** 文件过滤器** @author Aina**/class MusicFilter implements FilenameFilter {@Overridepublic boolean accept(File dir, String filename) {return (filename.endsWith(".mp3"));}}/*** 读取文件*/public static String read(String file) {TreeMap<Integer, lrcObject> lrc_read =new TreeMap<Integer, lrcObject>();String data = "";try {File saveFile=new File(file);FileInputStream stream = new FileInputStream(saveFile);// context.openFileInput(file);BufferedReader br = new BufferedReader(newInputStreamReader(stream,"GB2312"));int i = 0;while ((data = br.readLine()) != null) {data = data.replace("[","");data = data.replace("]","@");String splitdata[] =data.split("@");String lrcContenet = splitdata[splitdata.length-1];for (int j=0;j<splitdata.length-1;j++){String tmpstr = splitdata[j];tmpstr = tmpstr.replace(":",".");tmpstr = tmpstr.replace(".","@");String timedata[] =tmpstr.split("@");int m = Integer.parseInt(timedata[0]); //分int s = Integer.parseInt(timedata[1]); //秒int ms = Integer.parseInt(timedata[2]); //毫秒int currTime = (m*60+s)*1000+ms*10;lrcObject item1= new lrcObject();item1.begintime = currTime;item1.lrc = lrcContenet;lrc_read.put(currTime,item1);// 图像资源的IDi++;}}stream.close();}catch (FileNotFoundException e) {}catch (IOException e) {}/** 遍历hashmap 计算每句歌词所需要的时间*/lrc_map.clear();data ="";Iterator<Integer> iterator = lrc_read.keySet().iterator();lrcObject oldval = null;int i =0;StringBuffer sb = new StringBuffer();while(iterator.hasNext()) {Object ob =iterator.next();lrcObject val = (lrcObject)lrc_read.get(ob);if (oldval==null)oldval = val;else{lrcObject item1= new lrcObject();item1 = oldval;item1.timeline = val.begintime-oldval.begintime;lrc_map.put(new Integer(i), item1);sb.append(String.format("[%04d]-[%04d]-%s\n",item1.begintime,item1.timeline,item1.lrc));i++;oldval = val;}}data = sb.toString();return data;}/*** 播放列表*/public void MusicList() {try {File home = new File(PA TH);File[] f = home.listFiles(new MusicFilter());if (f.length > 0) {for (int i = 0; i < f.length; i++) {File file = f[i];mMusiclist.add(file.getName().toString());}ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,yout.simple_list_item_1, mMusiclist);mListView.setAdapter(adapter);}} catch (Exception ex) {this.ShowDialog("显示音乐列表异常:" + ex.getMessage());}}public void ShowDialog(String str) {new AlertDialog.Builder(this).setTitle("提示").setMessage(str).setPositiveButton("OK", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {}}).show();}/*@Overridepublic void run() {// TODO Auto-generated method stubwhile (true) {try {if (isauto) {int n = mMediaPlayer.getCurrentPosition();Message msg = new Message();msg.what = n;handler.sendMessage(msg);}Thread.sleep(100);} catch (Exception ex) {ex.printStackTrace();}}}*/}第二部分package com.Aina.Android;public class lrcObject {public int begintime;public int endtime;public int timeline;public String lrc;}第三部分package com.Aina.Android;import android.content.Context;import android.graphics.Bitmap;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.Rect;import android.graphics.Bitmap.Config;import android.util.AttributeSet;import android.view.View;public final class V iewlrcKLOK extends View implements Runnable { private final Paint paint;private Bitmap mBitlrcBack = null;private Bitmap mBitlrc = null;private Canvas lrc_backCanvas =null;private Canvas lrc_Canvas = null;private Canvas lrc_backNextCanvas =null;private Bitmap mBitlrcNextBack = null;private Canvas lrc_Canvas1 = null;private Bitmap mBitlrc1 = null;private int lrcWidth = 0;private int lrcWidth1 = 0;private int lrcHeight = 0;private int lrcSpeed = 100;private int lrcSpeed1 = 100;private int movex = 0;private int movex1 = 0;private int dispIndex = 0;private int mTimeduff = 0;private int DisplayWidth;//屏幕宽带private int DisplayHeight;//屏幕高度private String lrc_content="这是一个测试"; //歌词内容private String lrc_Nextcontent=""; //歌词内容private int lrc_timelen = 0;private int lrc_timelen1 = 0;private Thread ThreadKLOK =null;private int nState = 0;public V iewlrcKLOK(Context context,AttributeSet attrs) {super(context,attrs);paint = new Paint();//DisplayMetrics displayMetrics = new DisplayMetrics();//this.getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);//DisplayHeight = displayMetrics.heightPixels;//DisplayWidth = displayMetrics.widthPixels;ThreadKLOK = new Thread(this);ThreadKLOK.start();}@Overridepublic void onDraw(Canvas canvas) {Rect frame = new Rect();// canvas.drawText("speed"+lrcSpeed, 2, 30, paint);if (mBitlrc==null)return;this.DrawImage(canvas, mBitlrcBack,2, 8,lrcWidth,lrcHeight,0,0);this.DrawImage(canvas, mBitlrc,2, 8,movex,lrcHeight,0,0);this.DrawImage(canvas, mBitlrcNextBack,20, lrcHeight+15,lrcWidth1,lrcHeight,0,0);this.DrawImage(canvas, mBitlrc1,20, lrcHeight+15,movex1,lrcHeight,0,0);}@Overridepublic void run() {while (!Thread.interrupted()) {try {if (nState==1){if (dispIndex==0){if (movex<lrcWidth)movex++;else{movex1 = 0;dispIndex = 1;Thread.sleep(mTimeduff);}Thread.sleep(lrcSpeed);}else{if (movex1<lrcWidth1)movex1++;Thread.sleep(lrcSpeed1);}}} catch (Exception ex) {ex.printStackTrace();Thread.currentThread().interrupt();}this.postInvalidate();}}/*** x:屏幕上的x坐标* y:屏幕上的y坐标* w:要绘制的图片的宽度* h:要绘制的图片的高度* bx:图片上的x坐标* by:图片上的y坐标** @param canvas* @param mBitmap* @param x* @param y* @param w* @param h* @param bx* @param by*/public void DrawImage(Canvas canvas, Bitmap mBitmap, int x, int y, int w, int h, int bx, int by) {Rect src = new Rect();// 图片裁剪区域Rect dst = new Rect();// 屏幕裁剪区域src.left = bx;src.top = by;src.right = bx + w;src.bottom = by + h;dst.left = x;dst.top = y;dst.right = x + w;dst.bottom = y + h;canvas.drawBitmap(mBitmap, src, dst, paint);src = null;dst = null;}public void SetlrcContent(String lrc,int tiemlen,int timeduff,String lrc_1,int timelen1) {ThreadKLOK.suspend();lrc_content = lrc;lrc_timelen = tiemlen;lrc_timelen1 = timelen1;movex = 0;movex1 = 0;dispIndex = 0;paint.setTextSize(24);Rect rect = new Rect();mTimeduff = timeduff;//返回包围整个字符串的最小的一个Rect区域paint.getTextBounds(lrc, 0, 1, rect);float strwid = paint.measureText(lrc);float strwid1 = paint.measureText(lrc_1);lrcWidth = (int)strwid;lrcWidth1 = (int)strwid1;lrcHeight = 23;if (lrc_timelen>0)lrcSpeed = (lrc_timelen/lrcWidth);elselrcSpeed = 1000;if (lrc_timelen1>0)lrcSpeed1 = (lrc_timelen1/lrcWidth1);elselrcSpeed1 = 1000;mBitlrcBack = Bitmap.createBitmap( lrcWidth,lrcHeight, Config.ARGB_8888 ); mBitlrc = Bitmap.createBitmap( lrcWidth,lrcHeight, Config.ARGB_8888 );mBitlrcNextBack = Bitmap.createBitmap(lrcWidth1,lrcHeight, Config.ARGB_8888); mBitlrc1 = Bitmap.createBitmap(lrcWidth1,lrcHeight, Config.ARGB_8888 );lrc_backCanvas = new Canvas(mBitlrcBack);lrc_Canvas = new Canvas(mBitlrc);lrc_Canvas1 = new Canvas(mBitlrc1);lrc_backNextCanvas = new Canvas(mBitlrcNextBack);/*paint.setColor(Color.GREEN);rect.top = 0;rect.left = 0;rect.right =lrcWidth;rect.bottom = lrcHeight;lrc_backCanvas.drawRect(rect, paint);*/paint.setColor(Color.WHITE);lrc_backCanvas.drawText(lrc_content, 0, 20, paint);lrc_backNextCanvas.drawText(lrc_1, 0, 20, paint);paint.setColor(Color.RED);lrc_Canvas.drawText(lrc_content, 0, 20, paint);lrc_Canvas1.drawText(lrc_1, 0, 20, paint);}public void Star(){ThreadKLOK.resume();nState = 1;}public void Stop(){ThreadKLOK.suspend();nState =0;}}。

Android下MP3播放器的实现源代码

Android下MP3播放器的实现源代码

MusicInfoController.javapackage com.yarin.android.MusicPlayer;import android.content.ContentResolver;import android.database.Cursor;import .Uri;import android.provider.MediaStore;public class MusicInfoController{private static MusicInfoController mInstance = null;private MusicPlayerApp pApp = null;public static MusicInfoController getInstance(MusicPlayerApp app){if (mInstance == null){mInstance = new MusicInfoController(app);}return mInstance;}private MusicInfoController(MusicPlayerApp app){pApp = app;}public MusicPlayerApp getMusicPlayer(){return pApp;}private Cursor query(Uri uri, String[] prjs, String selections, String[] selectArgs, String order){ ContentResolver resolver = pApp.getContentResolver();if (resolver == null){return null;}return resolver.query(uri, prjs, selections, selectArgs, order);}public Cursor getAllSongs(){return query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null, null, null, MediaStore.Audio.Media.DEFAULT_SORT_ORDER);MusicList.javapackage com.yarin.android.MusicPlayer;import android.app.ListActivity;import android.content.BroadcastReceiver;import ponentName;import android.content.Context;import android.content.Intent;import android.content.IntentFilter;import android.content.ServiceConnection;import android.database.Cursor;import android.os.Bundle;import android.os.IBinder;import android.provider.MediaStore;import android.view.View;import android.widget.Button;import android.widget.ListAdapter;import android.widget.ListView;import android.widget.SimpleCursorAdapter;import android.widget.T extView;public class MusicList extends ListActivity{private MusicPlayerService mMusicPlayerService = null;private MusicInfoController mMusicInfoController = null;private Cursor mCursor = null;private TextView mTextView = null;private Button mPlayPauseButton = null;private Button mStopButton = null;private ServiceConnection mPlaybackConnection = new ServiceConnection() { public void onServiceConnected(ComponentName className, IBinder service) { mMusicPlayerService = ((MusicPlayerService.LocalBinder)service).getService();}public void onServiceDisconnected(ComponentName className){ mMusicPlayerService = null;}};protected BroadcastReceiver mPlayerEvtReceiver = new BroadcastReceiver() { @Overridepublic void onReceive(Context context, Intent intent) {String action = intent.getAction();if (action.equals(MusicPlayerService.PLAYER_PREPARE_END)) {// will begin to playmTextView.setVisibility(View.INVISIBLE); mPlayPauseButton.setVisibility(View.VISIBLE);mStopButton.setVisibility(View.VISIBLE);mPlayPauseButton.setText(R.string.pause);} else if(action.equals(MusicPlayerService.PLAY_COMPLETED)){ mPlayPauseButton.setText(R.string.play);}}};public void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.list_layout);MusicPlayerApp musicPlayerApp=(MusicPlayerApp)getApplication(); mMusicInfoController =(musicPlayerApp).getMusicInfoController();// bind playback servicestartService(new Intent(this,MusicPlayerService.class));bindService(new Intent(this,MusicPlayerService.class), mPlaybackConnection,Context.BIND_AUTO_CREATE);mTextView = (TextView)findViewById(R.id.show_text); mPlayPauseButton = (Button)findViewById(R.id.play_pause_btn); mStopButton = (Button) findViewById(R.id.stop_btn);mPlayPauseButton.setOnClickListener(new Button.OnClickListener() {public void onClick(View v) {// Perform action on clickif (mMusicPlayerService != null && mMusicPlayerService.isPlaying()) { mMusicPlayerService.pause();mPlayPauseButton.setText(R.string.play);} else if (mMusicPlayerService != null){mMusicPlayerService.start();mPlayPauseButton.setText(R.string.pause);}}});mStopButton.setOnClickListener(new Button.OnClickListener() {public void onClick(View v) {// Perform action on clickif (mMusicPlayerService != null ) {mTextView.setVisibility(View.VISIBLE);mPlayPauseButton.setVisibility(View.INVISIBLE);mStopButton.setVisibility(View.INVISIBLE); mMusicPlayerService.stop();}}});IntentFilter filter = new IntentFilter();filter.addAction(MusicPlayerService.PLAYER_PREPARE_END);filter.addAction(MusicPlayerService.PLAY_COMPLETED);registerReceiver(mPlayerEvtReceiver, filter);}protected void onResume() {super.onResume();mCursor = mMusicInfoController.getAllSongs();ListAdapter adapter = new MusicListAdapter(this,yout.simple_expandable_list_item_2, mCursor, new String[]{}, new int[]{});setListAdapter(adapter);}protected void onListItemClick(ListView l, View v, int position, long id) {super.onListItemClick(l, v, position, id);if (mCursor == null ||mCursor.getCount() == 0) {return;}mCursor.moveToPosition(position);String url = mCursor.getString(mCursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DATA));mMusicPlayerService.setDataSource(url);mMusicPlayerService.start();}/********************************************************************/class MusicListAdapter extends SimpleCursorAdapter {public MusicListAdapter(Context context, int layout, Cursor c,String[] from, int[] to) { super(context, layout, c, from, to);}public void bindView(View view, Context context, Cursor cursor) {super.bindView(view, context, cursor);TextView titleView = (TextView) view.findViewById(android.R.id.text1);TextView artistView = (TextView) view.findViewById(android.R.id.text2);titleView.setText(cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.TITLE)));artistView.setText(cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ARTIST)));//int duration cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DURATION));}public static String makeTimeString(long milliSecs) {StringBuffer sb = new StringBuffer();long m = milliSecs / (60 * 1000);sb.append(m < 10 ? "0" + m : m);sb.append(":");long s = (milliSecs % (60 * 1000)) / 1000;sb.append(s < 10 ? "0" + s : s);return sb.toString();}MusicPlayerApp.java package com.yarin.android.MusicPlayer;import android.app.Application;public class MusicPlayerApp extends Application{private MusicInfoController mMusicInfoController = null;public void onCreate(){ super.onCreate();mMusicInfoController = MusicInfoController.getInstance(this); }public MusicInfoController getMusicInfoController(){return mMusicInfoController;}}MusicPlayerService.javapackage com.yarin.android.MusicPlayer;import java.io.IOException;import android.app.Service;import android.content.Intent;import android.media.MediaPlayer;import android.os.Binder;import android.os.IBinder;public class MusicPlayerService extends Service{private final IBinder mBinder = new LocalBinder();private MediaPlayer mMediaPlayer = null;public static final String PLAYER_PREPARE_END = "com.yarin.musicplayerservice.prepared";public static final String PLAY_COMPLETED = "com.yarin.musicplayerservice.playcompleted";MediaPlayer.OnCompletionListener mCompleteListener = new MediaPlayer.OnCompletionListener(){public void onCompletion(MediaPlayer mp){ broadcastEvent(PLAY_COMPLETED);}};MediaPlayer.OnPreparedListener mPrepareListener = new MediaPlayer.OnPreparedListener(){public void onPrepared(MediaPlayer mp){ broadcastEvent(PLAYER_PREPARE_END);}};private void broadcastEvent(String what){Intent i = new Intent(what); sendBroadcast(i);}public void onCreate(){super.onCreate();mMediaPlayer = new MediaPlayer(); mMediaPlayer.setOnPreparedListener(mPrepareListener);mMediaPlayer.setOnCompletionListener(mCompleteListener);}public class LocalBinder extends Binder{public MusicPlayerService getService(){return MusicPlayerService.this;public IBinder onBind(Intent intent){return mBinder;}public void setDataSource(String path){try{mMediaPlayer.reset();mMediaPlayer.setDataSource(path); mMediaPlayer.prepare();}catch (IOException e){return;}catch (IllegalArgumentException e){return;}}public void start(){mMediaPlayer.start();}public void stop(){mMediaPlayer.stop();}public void pause(){mMediaPlayer.pause();public boolean isPlaying(){return mMediaPlayer.isPlaying();}public int getDuration(){return mMediaPlayer.getDuration();}public int getPosition(){return mMediaPlayer.getCurrentPosition();}public long seek(long whereto){mMediaPlayer.seekTo((int) whereto);return whereto;}}。

Androidstudio简单的音乐播放器实现

Androidstudio简单的音乐播放器实现

Androidstudio简单的音乐播放器实现JAVA文件:MainActivity.java,menuActivity.java,Music.java,PreActivity.javaXML文件:activity_main.xml,activity_pre.xml,activity_menu.xml在PreActivity.java文件中,程序主要执行开启线程,实现开启软件进入欢迎界面,并在1秒后自动跳转到音乐播放器主界面,界面在activity_pre.xml文件中实现。

PreActivity.javapublic class PreActivity extends Activity {Handler handler=new Handler(){public void handleMessage(Message msg){if(msg.what==250){Intent intent=new Intent(PreActivity.this,MainActivity.class);startActivity(intent);finish();}};};@Overrideprotected void onCreate(Bundle savedInstanceState){//TODO Auto-generated method stubsuper.onCreate(savedInstanceState);setContentView(yout.activity_pre); //加载布局WaitThread thread=new WaitThread(); //开启线程thread.start();}public class WaitThread extends Thread{ //创建线程@Overridepublic void run(){//TODO Auto-generated method stubtry{Thread.sleep(1000);}catch (InterruptedException e){//TODO Auto-generated catch blocke.printStackTrace();}Message message=new Message();message.what=250;message.arg1=1;handler.sendMessage(message);}}}activity_pre.xml<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android=""android:layout_width="400dp"android:layout_height="800dp"android:background="#ffffff"android:orientation="vertical"android:weightSum="1"><ImageViewandroid:src="@drawable/welcome"android:layout_width="408dp"android:layout_height="451dp"android:layout_weight="0.77" /></LinearLayout>主要功能实现MainActivity.java,音乐播放器主界面activity_main.xml。

Android Studio Service编程 音乐播放器

Android Studio Service编程 音乐播放器

广州xx 学院Android 程序设计 实验报告专业班级 计算机181 实验日期__ 2021.5.18_ _ 姓 名 xx 学 号201xx 实验名称 Service 编程 指导老师__ xx _(报告内容包括:实验目的、实验设备及器材、实验步骤、实验数据、图表及曲线处理、实验小结等)。

1. 实验目的(1) 了解如何创建服务;(2) 掌握服务的两种启动方式;(3) 掌握如何使用本地服务通信。

2. 实验要求(1) 使用服务通信,实现音乐播放器功能,实现音乐的播放、暂停、继续播放、退出。

3. 实验步骤(1)导入音乐文件和界面图片之后,开始创建布局,代码如下,效果图如图1-1所示。

<ImageViewandroid :id ="@+id/iv_music"android :layout_width ="240dp"android :layout_height ="240dp"android :layout_gravity ="center_horizontal" android :layout_margin ="15dp"android :src ="@drawable/music"/><SeekBarandroid :id ="@+id/sb"android :layout_width ="match_parent"android :layout_height ="wrap_content" /><RelativeLayoutandroid :layout_width ="match_parent"android :layout_height ="wrap_content"android:paddingLeft="8dp"android:paddingRight="8dp"><TextViewandroid:id="@+id/tv_progress"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="00:00" /><TextViewandroid:id="@+id/tv_total"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentRight="true"android:text="00:00" /></RelativeLayout><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal"><Buttonandroid:id="@+id/btn_play"android:layout_width="0dp"android:layout_height="40dp"android:layout_margin="8dp"android:layout_weight="1"android:background="@drawable/btn_bg_selector"android:text="播放音乐" /><Buttonandroid:id="@+id/btn_pause"android:layout_width="0dp"android:layout_height="40dp"android:layout_margin="8dp"android:layout_weight="1"android:background="@drawable/btn_bg_selector"android:text="暂停播放" /><Buttonandroid:id="@+id/btn_continue_play"android:layout_width="0dp"android:layout_height="40dp"android:layout_margin="8dp"android:layout_weight="1"android:background="@drawable/btn_bg_selector"android:text="继续播放" /><Buttonandroid:id="@+id/btn_exit"android:layout_width="0dp"android:layout_height="40dp"android:layout_margin="8dp"android:layout_weight="1"android:background="@drawable/btn_bg_selector"android:text="退出" /></LinearLayout>图1-1 界面布局效果图(2)创建背景选择器btn_bg_selector.xml关键代码如下:<selector xmlns:android="/apk/res/android"><item android:state_pressed="true" ><shape android:shape="rectangle"><corners android:radius="3dp"/><solid android:color="#d4d4d4"/></shape></item><item android:state_pressed="false" ><shape android:shape="rectangle"><corners android:radius="3dp"/><solid android:color="#ffffff" /></shape></item></selector>(3)创建MusicService服务关键代码如下所示:public class MusicService extends Service {private MediaPlayer player;private Timer timer;public MusicService() {}@Overridepublic IBinder onBind(Intent intent) {return new MusicControl();}@Overridepublic void onCreate() {super.onCreate();player = new MediaPlayer();//创建音乐播放器对象}public void addTimer() { //添加计时器用于设置音乐播放器中的播放进度条if (timer == null) {timer = new Timer(); //创建计时器对象TimerTask task = new TimerTask() {@Overridepublic void run() {if (player == null) return;int duration = player.getDuration(); //获取歌曲总时长int currentPosition = player.getCurrentPosition();//获取播放进度Message msg = MainActivity.handler.obtainMessage();//创建消息对象//将音乐的总时长和播放进度封装至消息对象中Bundle bundle = new Bundle();bundle.putInt("duration", duration);bundle.putInt("currentPosition", currentPosition);msg.setData(bundle);//将消息发送到主线程的消息队列MainActivity.handler.sendMessage(msg);}};//开始计时任务后的5毫秒,第一次执行task任务,以后每500毫秒执行一次timer.schedule(task, 5, 500);}}class MusicControl extends Binder {public void play() {try {player.reset();//重置音乐播放器//加载多媒体文件player = MediaPlayer.create(getApplicationContext(),R.raw.music);player.start();//播放音乐addTimer(); //添加计时器} catch (Exception e) {e.printStackTrace();}}public void pausePlay() {player.pause(); //暂停播放音乐}public void continuePlay() {player.start(); //继续播放音乐}public void seekTo(int progress) {player.seekTo(progress);//设置音乐的播放位置}}@Overridepublic void onDestroy() {super.onDestroy();if (player == null) return;if (player.isPlaying()) player.stop();//停止播放音乐player.release(); //释放占用的资源player = null; //将player置为空}}(4)编写界面交互代码关键代码如下:public class MainActivity extends AppCompatActivity implementsView.OnClickListener{private static SeekBar sb;private static TextView tv_progress, tv_total;private ObjectAnimator animator;private MusicService.MusicControl musicControl;MyServiceConn conn;Intent intent;private boolean isUnbind = false;//记录服务是否被解绑@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.activity_main);init();}private void init() {tv_progress = (TextView) findViewById(_progress);tv_total = (TextView) findViewById(_total);sb = (SeekBar) findViewById(R.id.sb);findViewById(R.id.btn_play).setOnClickListener(this);findViewById(R.id.btn_pause).setOnClickListener(this);findViewById(R.id.btn_continue_play).setOnClickListener(this);findViewById(R.id.btn_exit).setOnClickListener(this);intent = new Intent(this, MusicService.class);//创建意图对象conn = new MyServiceConn();//创建服务连接对象bindService(intent, conn, BIND_AUTO_CREATE); //绑定服务//为滑动条添加事件监听sb.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {@Overridepublic void onProgressChanged(SeekBar seekBar, int progress, booleanfromUser) { //滑动条进度改变时,会调用此方法if (progress == seekBar.getMax()) { //当滑动条滑到末端时,结束动画animator.pause(); //停止播放动画}}@Overridepublic void onStartTrackingTouch(SeekBar seekBar) {//滑动条开始滑动时调用}@Overridepublic void onStopTrackingTouch(SeekBar seekBar) { //滑动条停止滑动时调用//根据拖动的进度改变音乐播放进度int progress = seekBar.getProgress();//获取seekBar的进度musicControl.seekTo(progress); //改变播放进度}});ImageView iv_music = (ImageView) findViewById(R.id.iv_music);animator = ObjectAnimator.ofFloat(iv_music, "rotation", 0f, 360.0f);animator.setDuration(10000); //动画旋转一周的时间为10秒animator.setInterpolator(new LinearInterpolator());animator.setRepeatCount(-1); //-1表示设置动画无限循环}4.运行结果开始播放如图4-1所示图4-15.实验小结通过此次实验,让我了解到了Android中的服务创建,比如下载文件、播放音乐等功能,其中让我学到了一个背景选择器,可以通过这个选择器动态呈现按钮的背景颜色。

Android实现音乐视频播放

Android实现音乐视频播放

Android实现⾳乐视频播放本⽂实例为⼤家分享了Android实现⾳乐视频播放的具体代码,供⼤家参考,具体内容如下步骤1、新建⼀个安卓项⽬,再加⼀个assets包2、在 assets中加⼊⼀段⾳频3、在界⾯中加⼊⾳乐的“开始”按钮和“暂停”按钮。

4、在 MainActivity⽂件中写相应逻辑package com.hnucm.c201901020110;import androidx.annotation.RequiresApi;import androidx.appcompat.app.AppCompatActivity;import android.media.MediaPlayer;import android.os.Build;import android.os.Bundle;import android.view.View;import java.io.IOException;public class MainActivity extends AppCompatActivity {MediaPlayer mediaPlayer = new MediaPlayer(); //⾳频对象 //⼤于Build.VERSION_CODES.N版本才能⽤@RequiresApi(api = Build.VERSION_CODES.N)@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.activity_main);//加载⾳乐⽂件try {// mediaPlayer.setDataSource("联⽹后,⽹址");mediaPlayer.setDataSource(getAssets().openFd("a1.mp3"));mediaPlayer.prepare();}catch (IOException e){e.printStackTrace();}findViewById(R.id.button).setOnClickListener(new View.OnClickListener() { @Overridepublic void onClick(View v) {// 播放⾳乐mediaPlayer.start();}});findViewById(R.id.button2).setOnClickListener(new View.OnClickListener() { @Overridepublic void onClick(View v) {// 暂停⾳乐mediaPlayer.pause();}});}}视频播放1、新建⼀个⽂件夹,将视频⽂件放⼊raw⽂件夹中2、在界⾯中加⼊视频的“开始”按钮和“暂停”按钮。

Android简易音乐播放器实现代码

Android简易音乐播放器实现代码

Android简易⾳乐播放器实现代码本⽂实例为⼤家分享了Android⾳乐播放器的具体代码,供⼤家参考,具体内容如下1.播放项⽬内的⾳乐package com.thm.g150820_android26_playmusic;import Android.media.MediaPlayer;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.View;import android.widget.ImageButton;import android.widget.SeekBar;public class MainActivity extends AppCompatActivity {private MediaPlayer mediaPlayer;private SeekBar seekBar;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.activity_main);seekBar = (SeekBar) findViewById(R.id.seekBar);seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {@Overridepublic void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {}@Overridepublic void onStartTrackingTouch(SeekBar seekBar) {}@Overridepublic void onStopTrackingTouch(SeekBar seekBar) {//获取拖动结束之后的位置int progress = seekBar.getProgress();//跳转到某个位置播放mediaPlayer.seekTo(progress);}});}public void isPlayOrPause(View view){//把View强转为ImageButtonImageButton imageButton = (ImageButton) view;if(mediaPlayer==null) {//实例化MediaPlayermediaPlayer = MediaPlayer.create(this, R.raw.yao);//开始播放mediaPlayer.start();//图标修改为暂停的图标imageButton.setImageResource(android.R.drawable.ic_media_pause);//获取⾳乐的总时长int duration = mediaPlayer.getDuration();//设置进度条的最⼤值为⾳乐的总时长seekBar.setMax(duration);new MyThre().start();}//判断如果⾳乐在播放else if(mediaPlayer.isPlaying()){//就暂停⾳乐mediaPlayer.pause();//图标修改为播放的图标imageButton.setImageResource(android.R.drawable.ic_media_play);}else{mediaPlayer.start();//图标修改为暂停的图标imageButton.setImageResource(android.R.drawable.ic_media_pause);}}//写内部类class MyThre extends Thread{@Overridepublic void run() {super.run();while(seekBar.getProgress()<=seekBar.getMax()){//获取当前⾳乐播放的位置int currentPosition = mediaPlayer.getCurrentPosition();//让进度条动起来seekBar.setProgress(currentPosition);}}}}2.播放内存卡中的⾳乐package com.thm.g150820_android26_playmusic;import android.media.AudioManager;import android.media.MediaPlayer;import .Uri;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.View;import android.widget.ImageButton;import android.widget.SeekBar;import java.io.IOException;public class MainActivity extends AppCompatActivity {private MediaPlayer mediaPlayer;private SeekBar seekBar;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.activity_main);seekBar = (SeekBar) findViewById(R.id.seekBar);seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { @Overridepublic void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { }@Overridepublic void onStartTrackingTouch(SeekBar seekBar) {}@Overridepublic void onStopTrackingTouch(SeekBar seekBar) {//获取拖动结束之后的位置int progress = seekBar.getProgress();//跳转到某个位置播放mediaPlayer.seekTo(progress);}});}public void isPlayOrPause(View view){//把View强转为ImageButtonImageButton imageButton = (ImageButton) view;if(mediaPlayer==null) {//实例化MediaPlayer//播放应⽤内的⾳乐//mediaPlayer = MediaPlayer.create(this, R.raw.yao);//播放内存卡中的⾳乐mediaPlayer = new MediaPlayer();//设置类型mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);//设置⾳乐路径try {mediaPlayer.setDataSource(this, Uri.parse("storage/sdcard0/Music/a.mp3"));//播放之前准备⼀下mediaPlayer.prepare();} catch (IOException e) {e.printStackTrace();}//开始播放mediaPlayer.start();//图标修改为暂停的图标imageButton.setImageResource(android.R.drawable.ic_media_pause);//获取⾳乐的总时长int duration = mediaPlayer.getDuration();//设置进度条的最⼤值为⾳乐的总时长seekBar.setMax(duration);new MyThre().start();}//判断如果⾳乐在播放else if(mediaPlayer.isPlaying()){//就暂停⾳乐mediaPlayer.pause();//图标修改为播放的图标imageButton.setImageResource(android.R.drawable.ic_media_play);}else{mediaPlayer.start();//图标修改为暂停的图标imageButton.setImageResource(android.R.drawable.ic_media_pause);}}//写线程内部类class MyThre extends Thread{@Overridepublic void run() {super.run();while(seekBar.getProgress()<=seekBar.getMax()){//获取当前⾳乐播放的位置int currentPosition = mediaPlayer.getCurrentPosition();//让进度条动起来seekBar.setProgress(currentPosition);}}}}3.添加读取内存的权限更多关于播放器的内容请点击进⾏学习。

最全的Android开源音乐播放器源码汇总

最全的Android开源音乐播放器源码汇总

最全的Android开源音乐播放器源码汇总收集了很多音乐播放器类的Android项目源码,非常不错的开源项目,会让你事半功倍,希望大家补充。

谢谢!Android基于经纬度切歌的冲绳音乐播放器源码Android应用源码适合新手学习的本地音乐播放器Android应用源码网络本地音乐播放器工程源码Android应用源码仿手机QQ音乐播放器项目Android应用源码超级精致的本地音乐播放器Android应用源码教学自学用音乐播放器Android应用源码25国语言音乐播放器Android应用源码仿唱片机音乐播放器Android应用源码仿多米音乐播放器项目Android应用源码安卓win8风格音乐播放器Android应用源码仿酷狗音乐播放器本地版Android应用源码安卓奇葩音乐播放器项目Android应用源码魔音盒音乐播放器项目Android应用源码音乐实时跳动频谱显示Android应用源码强大的3D音乐播放器项目Android应用源码仿安卓QQ音乐播放器项目android应用源码先锋音乐快剪铃声剪辑项目Android和讯音乐播放器培训项目Android应用源码安卓乐迹音乐播放器项目Android应用源码带歌词与频谱SMplaye音乐播放器Android应用源码含歌词列表gif简单音乐播放器Android应用源码国外在线电台音乐播放器.rarAndroid例子源码音乐播放器aidl实现进程间的通讯Android 音乐播放器android开发源码分享之在线音乐播放器完整项目jamendo_android一个开源的Android在线音乐播放器实例。

Android 音乐播放器(晴天播放)Android优雅音乐源码Android MusicPlayer音乐播放器源码Android 简易音乐播放器源码GitHub开源项目之Jamendo音乐播放器Android音乐播放器歌词显示实例。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

基于an droid平台的音乐播放器开发实验报告学生姓名:_______ 温从林 _________________学号: ___________________________________班级:计自1201 _____________第一章引言1.1项目背景当今社会的生活节奏越来越快,人们对手机的要求也越来越高,由于手机市场发展迅速,使得手机操作系统也出现了不同各类,现在的市场上主要有三个手机操作系统,Win dowsmobile,symbia n,以及谷歌的An droid操作系统,其中占有开放源代码优势的An droid系统有最大的发展前景。

那么能否在手机上拥有自己编写的个性音乐播放器呢?能的,谷歌An droid系统就能做到。

本文的音乐播放器就是基于谷歌An droid手机平台的播放器。

An droid :是谷歌于2007年公布的开放式源代码手机系统,它的开放性就优于其它封闭式的手机系统,因此,任何人都可能根据自己的喜好将手机系统中的所有功能重新编写。

这使得越来越多的人关注这个操作系统。

本次作品音乐播放器就是基于An droid平台的。

1.2编写目的现今社会生活紧张,而欣赏音乐是其中最好的舒缓压力的方式之一,本项目的目的是开发一个可以播放主流音乐文件格式的播放器,本设计实现的主要功能是播放Mp3 Wav多种格式的音乐文件,并且能够控制播放,暂停,停止,播放列等基本播放控制功能,界面简明,操作简单。

本项目是一款基于An droid手机平台的音乐播放器,使An droid手机拥有个性的多媒体播放器,使手机显得更生动灵活化,与人们更为接近,让手机主人随时随地处于音乐视频的旋律之中。

使人们的生活更加多样化。

也使设计者更加熟练An droid的技术和其它在市场上的特点。

1.3开发环境Eclipse、An droid SDK 320第二章系统需求分析2.1功能需求(用例图分析)根据项目的目标,我们可获得项目系统的基本需求,以下从不同角度来描述系统的需求,并且使用用例图来描述,系统的功能需求,我们分成四部分来概括,即播放器的基本控制需要,播放列表管理需求,播放器友好性需求和播放器扩展卡需求。

以下分别描述:2.1.1播放器的用例图假设安装了音乐播放器的用户是系统的主要设计对象,其拥有以下操作,启动软件、播放音乐、暂停播放、停止播放、退出软件,其用例图如下图2.1 播放器基本用例图2.1.2用例分析用例名称:退出参与者:用户目标:使得用户退出或者后台播放音乐前置条件:程序在运行基本事件流:1.用户按返回键2. 播放器退出或者进入后台播放第三章概要设计3.1软件播放流程图Stepl.启动软件后,软件自动检索手机和sd卡的音频文件,并组织显示成列表Step2.点击列表的歌曲名字。

Step3.播放音乐。

Step4.点击暂停,音乐暂停Step5.点击播放转到step3Step6.点击停止停止播放音乐Step7 .点击退出。

自动检索手机中暂停/退出软件图3.1音乐播放器流第四章界面展示4.1 软件部署系统编译生成apk 文件,将apk 文件拷到手机或者sd 卡中,直接打开即可安装。

4.2 启动软件打开软件后的界面4.3 歌曲列表界面歌曲列表界面4.4 播放界面4.5 收藏界面4.6 在线搜索音乐界面第五章结论(1) 通过本次幵发解决了诸如SD卡音乐文件搜索并显示、联网搜索歌曲等难题,对安卓的开发有了更深入的认识。

(2) 通过对Android 手机平台的音乐播放器软件的开发,使我对Android 音乐播放器系统的整体设计有一个深入的了解,对整个流程也会有一个清晰的认识。

开发Android 音乐播放器,要抓住开发的核心部分,音乐播放器大体由播放主界面、播放列表、菜单、播放设置、文件浏览、歌曲搜索六大核心组成。

(3) 本次程序设计,对播放器的系统结构框架做了精心的构思与设计,采用主要开发工具是Eclips4.0+Java 语言的支持,Android Development Tool 的插件,和Android SDK2.1 版本的全面结合,才使整个音乐播放器系统得以实现第五章部分源代码以下给出功能实现代码,布局,风格等代码量过大,放在压缩文件中MainActivity.java:packageimportimportimportimportimportimportimportimportimportimportpublic class MainActivity extends ActionBarActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super .onCreate(savedInstanceState);requestWindowFeature(Window. FEATURE_NO_TITLE);setContentView(yout. fragment_main );Thread thread = new Thread() {public void run() {try {sleep (2500);} catch (InterruptedException e) {e.printStackTrace();}finish();Intent intent = new Intent(MainActivity. this , MusicActivity. class ); startActivity(intent);}};thread.start();}@Overridepublic 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 ;}@Overridepublic boolean onOptionsItemSelected(MenuItem item) { //Handle action bar item clicks here. The action bar will// automatically handle clicks on the Home/Up button, so long// as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId();if (id == R.id. action_settings ) {return true ;}return super .onOptionsItemSelected(item);}* A placeholder fragment containing a simple view. */public static class PlaceholderFragment extends Fragment {public PlaceholderFragment() {}@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {View rootView = inflater.inflate(yout. fragment_main false );, container, return rootView;}}}BandanActivity.javapackage ;importimportimportimportimportimportimportimportimportimportimportimportimportsuper .onCreate(savedInstanceState);setContentView(yout. bangdanmusic_list );listview = (ListView) findViewById(R.id. bangdan_music_list );listview .setOnItemClickListener( new MusicListOnClickListener()); ShowMp3List(); }*显示MP3言息,其中」ds 保存了所有音乐文件的_ID ,用来确定到底要播放哪一首歌曲,_titles 存放音乐名,用来显示在播放界面,*而_path 存放音乐文件的路径(删除文件时会用到)*/private void ShowMp3List() {// 用游标查找媒体详细信息this .getContentResolver().query(DISPLAY_NAME , // 显示名称 ,4cursor.moveToFirst();/** 分别将各个标题数组实例化 **/ _ids = new int [cursor.getCount()];_titles = new String[cursor.getCount()];_artists = new String[cursor.getCount()];_path =new Strin g[cursor.getCo un t()]; _album =new Strin g[cursor.getCo un t()]; privateListView listview ; privateString musicpath ; privateint _ids []; // 存放音乐文件的 id 数组 privateString _titles []; // 存放音乐文件的标题数组 privateString _artists []; // 存放音乐艺术家的标题数组 privateString[] _path ; // 存放音乐路径的标题数组 privateString[] _times ; // 存放总时间的标题数组 privateString[] _album ; // 存放专辑的标题数组 privateint _sizes []; // 存放文件大小的标题数组 private String[] displayname ; // 存放名称的标题数组@Overrideprotected void onCreate(Bundle savedInstanceState) {extends Activity { public class BangdanActivityCursor cursor = EXTERNAL_CONTENT new String[] {TITLE ,DURATION ,ARTIST , , UR ,I// 标题,游标从 0读取 // 持续时间 ,1 // 艺术家 ,2 // id ,3 DATA ,ALBUM_ID , ALBUM ,SIZE }, null/** 将游标移到第一位 **/ // 数据, 5 // 专辑名称 ID ,6// 专辑 ,7 , null ART IST ); // 大小 ,8_times = new Strin g[cursor.getCo un t()];_displa yn ame = new Strin g[cursor.getCo un t()];_sizes = new int [cursor.getCount()];到的内容格式为/mnt/sdcard/[ 子文件夹名/]音乐文件名,而我们想要得到的是/sdcard/[ 子文件夹名]音乐文件名*/for (int i = 0; i < cursor.getCount(); i++) {_ids [i] = cursor.getInt(3);_titles [i] = cursor.getStri ng(0);_artists [i] = cursor.getStri ng(2);_path [i] = cursor.getString(5).substring(4);/***** 以下是为提供音乐详细信息而生成的******/_album [i] = cursor.getString(7);_times [i] = toTime(cursor.getInt(1));_sizes [i] = cursor.getInt(8);_displa yn ame [i] = cursor.getStri ng(4);cursor.moveToNext();}listview .setAdapter( new MusicListAdapter( this , cursor));}/**时间的转换*/public String toTime( int time) {time /= 1000;int minute = time / 60;int second = time % 60;minute %= 60;/**返回结果用string 的format方法把时间转换成字符类型**/return Stri ng. format ("%02d:%02d" , min ute, seco nd);}/**音乐列表添加监听器,点击之后播放音乐*/public class MusicList On ClickListe ner impleme nts On ItemClickListe ner { @Overridepublic void on ltemClick(AdapterView<?>argO, View view, int positi on, long id) {musicpath ="/mnt" +_path [position];playMusic( musicpath );/*putExtraMusic(positio n); */Intent intent = new Inten t(Ba ngda nActivity. this PlayMusicActivity. class );startActivity(i ntent);fin ish();}}public void playMusic(String musicpath) {try {MediaPlayer mp = new MediaPlayer();mp.reset();mp.setDataSource(musicpath);mp.prepare();mp.start();} catch (Exception e){Toast. makeText (getApplicationContext(), Toast. LENGTH_SHOR)T.show();}}public void putExtraMusic( int position) { Intent intentIntent(BangdanActivity. this ,PlayMusicActivity. class );/*intent.putExtra("_ids", _ids);intent.putExtra("_path", _path);intent.putExtra("_titles", _titles);intent.putExtra("_artists", _artists);intent.putExtra("position", position);startActivity(intent);finish();*/intent = new Intent();Bundle bundle = new Bundle();bundle.putInt( "position" , 25);intent.putExtras(bundle);intent.setClass(BangdanActivity. this , PlayMusicActivity. class ); startActivity(intent);finish();}@Overrideprotected void onStop() {super .onStop();}private long exitTime = 0;public boolean onKeyDown( int keyCode, KeyEvent event) {if (keyCode == KeyEvent. KEYCODE_BACK && event.getAction() KeyEvent.ACTION_DOWN){if ((System. currentTimeMillis ()- exitTime ) > 2000){Toast. makeText (getApplicationContext(), " 再按一次退出程序 Toast.LENGTH_SHOR)T.show();exitTime = System. currentTimeMillis ();else {finish();System. exit (0);}return true ;无法播放此文件new}return super .onKeyDown(keyCode, event);}}CollectionActivity.javapublic class CollectionActivity extends ExpandableListActivity { @Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);// 一级条目List<Map<String, String>>groups=new ArrayList<Map<String,String>>();Map<String, String> group1=new HashMap<String, String>();group1.put("group"," 【歌手】");Map<String, String> group2=new HashMap<String, String>();group2.put("group"," 【专辑】");groups.add(group1);groups.add(group2);// 二组条目List<List<Map<String, String>>> childs=newArrayList<List<Map<String,String>>>();// 第一组二级科目数据List<Map<String, String>> ArrayList<Map<String,String>>(); Map<String, String> item1=new HashMap<String, String>(); item1.put("child"," 林俊杰");Map<String, String> item2=new HashMap<String, String>(); item2.put("child"," 周杰伦");child1.add(item1);child1.add(item2);// 第二组二级科目数据List<Map<String, String>> ArrayList<Map<String,String>>(); Map<String, String> item3=new HashMap<String, String>(); item3.put("child","<< 因你而在>>");Map<String, String> item4=new HashMap<String, String>(); item4.put("child","<< 流行主教>>");Map<String, String> item5=new HashMap<String, String>(); item5.put("child","<< 第二天堂>>");child2.add(item3);child2.add(item4);child2.add(item5);childs.add(child1); child1=new child2=newchilds.add(child2);//SimpleExpandableListAdapter构造函数参数//1.content//2. 一级条目数据//3. 一级条目布局文件// 4 . 一级条目Key//5. 一级条目显示信息控件id//6. 二级条目数据//7. 二级条目布局文件//8. 二级条目Key//9. 二级条目显示信息控件idsetListAdapter(adapter);}private long exitTime = 0;public boolean onKeyDown(int keyCode, KeyEvent event) {if(keyCode == KeyEvent.KEYCODE_BACK&& event.getAction() KeyEvent.ACTION_DOWN){if((System.currentTimeMillis()-exitTime) >2000){ Toast.makeText(getApplicationContext(), " 再按一次退出程序", Toast.LENGTH_SHORT).show();exitTime = System.currentTimeMillis();}else { finish();System.exit(0);}return true;}return super.onKeyDown(keyCode, event);}/*** 初始化菜单*/public boolean onMenuKeyDown(int keyCode, KeyEvent event) { if(keyCode==KeyEvent.KEYCODE_MENU&& event.getAction() = KeyEvent.ACTION_DOWN){Toast.makeText(getApplicationContext(), " 未定义菜单" Toast.LENGTH_SHORT).show();}return true;}}Contsant.javapublic class Contsant {* 获取屏幕的大小0:宽度1 :高度}**/public static int[] getScreen(Context context) { WindowManager windowManagercontext.getSystemService(Context.WINDOW_SERVICE);Display display = windowManager.getDefaultDisplay();DisplayMetrics outMetrics = new DisplayMetrics(); display.getMetrics(outMetrics);return new int[] { (int) (outMetrics.density * outMetrics.widthPixels), (int)(outMetrics.density * outMetrics.heightPixels) };}/**获取文件的后缀名,返回大写**/ public static String getSuffix(String str) {int i = stIndexOf('.');if (i != -1) {return str.substring(i + 1).toUpperCase(); } return str;}/**格式化文件大小Byte->MB**/public static String formatByteToMB(int size){ float mb=size/1024f/1024f;return String.format("%.2f",mb);LRCbean.javapackage/** 歌词实体*/public class LRCbean {private int beginTime = 0; // 开始时间public int getBeginTime() {return beginTime;}public void setBeginTime( int beginTime) { this .beginTime = beginTime;}public int getLineTime() {return lineTime;(WindowManager)public void setLineTime( int lineTime) { this .lineTime = lineTime;}public String getLrcBody() { return lrcBody;public void setLrcBody(String lrcBody) {this .lrcBody = lrcBody;}private int lineTime = 0;private String lrcBody = null ; // 歌词实体}MDialog.java* 自定义的对话框*/public class MDialog extends Dialog {public MDialog(Context context) {super(context);}public MDialog(Context context, int theme) { super(context, theme);}public static class Builder {private Context context;private int mIcon = -1; // 提示图标private CharSequence mTitle; // 提示标题private CharSequence mMessage;// 提示内容private CharSequence mPositiveButtonText;// privateCharSequence mNegativeButtonText;// privateCharSequence mNeutralButtonText; // private booleanmCancelable = true;//private int mViewSpacingLeft; private int mViewSpacingTop;private int mViewSpacingRight;private int mViewSpacingBottom;private boolean mViewSpacingSpecified = false; // 提示内容Viewprivate View mView; private OnClickListener mPositiveButtonClickListener, mNegativeButtonClickListener, mNeutralButtonClickListener;private OnCancelListener mCancelListener;// private OnKeyListener mKeyListener; //取消键事件按键处理确定按钮文本拒绝按钮文本中间按钮文本是否启用取消键public Builder(Context context) {this.context = context;}public Builder setMessage(CharSequence message) { this.mMessage = message;return this;}public Builder setMessage(int message) { this.mMessage = context.getText(message);return this;}public Builder setTitle(int title) {this.mTitle = context.getText(title); return this;}public Builder setTitle(CharSequence title) {this.mTitle = title;return this;}public Builder setIcon(int icon) {this.mIcon = icon;return this;}public Builder setView(View view) {this.mView = view;mViewSpacingSpecified = false;return this;}public Builder setView(View view, int left, int top, int right, int bottom) {this.mView = view;this.mViewSpacingLeft = left; this.mViewSpacingTop = top; this.mViewSpacingRight = right; this.mViewSpacingBottom = bottom; mViewSpacingSpecified = true; return this; }public Builder setPositiveButton(int textId,final OnClickListener listener) { this.mPositiveButtonText = context.getText(textId);this.mPositiveButtonClickListener = listener; return this;}public Builder setPositiveButton(String text,final OnClickListener listener) { this.mPositiveButtonText = text;this.mPositiveButtonClickListener = listener; return this;}public Builder setNeutralButton(int textId,final OnClickListener listener) { this.mNeutralButtonText = context.getText(textId);this.mNeutralButtonClickListener = listener; return this;}public Builder setNeutralButton(String text,final OnClickListener listener) { this.mNeutralButtonText = text;this.mNeutralButtonClickListener = listener; return this;}public Builder setNegativeButton(int textId,final OnClickListener listener) { this.mNegativeButtonText = context.getText(textId);this.mNegativeButtonClickListener = listener; return this;}public Builder setNegativeButton(String text,final OnClickListener listener) { this.mNegativeButtonText = text;this.mNegativeButtonClickListener = listener; return this;}public Builder setCancelable(boolean cancelable) { this.mCancelable = cancelable;return this;}public Builder setOnCancelListener(OnCancelListener listener) { this.mCancelListener = listener;return this;}public Builder setOnKeyListener(OnKeyListener listener) { this.mKeyListener = listener;return this;}public MDialog create() {LayoutInflater inflater = (LayoutInflater) context.getSystemService(YOUT_INFLATER_SERVICE);dialog.setCancelable(mCancelable);// 设置取消键事件if (mCancelListener != null) {dialog.setOnCancelListener(mCancelListener);}// 设置键盘监听事件if (mKeyListener != null) { dialog.setOnKeyListener(mKeyListener);}// 获取对话框布局layout.setLayoutParams(newLayoutParams(LayoutParams.FILL_PARENT,LayoutParams.WRAP_CONTENT));// 设置标题// 设置图标if (mIcon != -1) {}int count = 0;// 设置确定按钮count++;// 设置拒绝按钮count++;// 设置中间按钮count++;if(count==0){}// 一个按钮时,显示两边空间if (count == 1) {}// 设置提示消息if (!TextUtils.isEmpty(mMessage)) {} else {}// 设置提示内容布局if (mView != null) {if (mViewSpacingSpecified) {customPanel.setPadding(mViewSpacingLeft, mViewSpacingTop,mViewSpacingRight, mViewSpacingBottom);}customPanel.addView(mView);} else {}dialog.setContentView(layout);return dialog;}public MDialog show() {MDialog dialog = create();dialog.show();return dialog;}private boolean setButton(View layout, mPositiveButtonText2, int id,final Dialog dialog, final OnClickListener listener) {CharSequence if (!TextUtils.isEmpty(mPositiveButtonText2)) {final Button button1 = (Button) layout.findViewById(id);button1.setText(mPositiveButtonText2);if (listener != null) {button1.setOnClickListener(new View.OnClickListener(){ public void onClick(View v) {listener.onClick(dialog,DialogInterface.BUTTON_POSITIVE);}});}else{// 默认事件为关闭对话框button1.setOnClickListener(newView.OnClickListener() { public void onClick(View v) {dialog.cancel(); dialog.dismiss();}});}return true;} else { layout.findViewById(id).setVisibility(View.GONE); return false;}}}}MusicActivity.java/* 以Tabhost+RadioGroup 组合*/public class MusicActivity extends TabActivity OnCheckedChangeListener{private TabHost tabhost;private RadioGroup radiogroup;@OverrideimplementsrequestWindowFeature(Window.FEATURE_NO_TITLE); tabhost=getTabHost(); radiogroup.setOnCheckedChangeListener(this); radiogroup.setClickable(true);tabhost.addTab(tabhost.newTabSpec("local_music").setIndicator("local_musi c").setContent(new Intent(this,MusicListActivity.class)));tabhost.addTab(tabhost.newTabSpec("my_collect").setIndicator("my_collect" ).setContent(new Intent(this,CollectionActivity.class)));tabhost.addTab(tabhost.newTabSpec("net_music").setIndicator("net_music"). setContent(new Intent(this,NetMusicActivity.class)));}@Overridepublic void onCheckedChanged(RadioGroup group, int checkedId) { switch (checkedId) { tabhost.setCurrentTabByTag("local_music");break; tabhost.setCurrentTabByTag("my_collect"); break; tabhost.setCurrentTabByTag("net_music"); break;}}}MusicListActivity.javapublic class MusicListActivity extends Activity {/** 音乐列表 **/private LayoutParams params; private Toast toast; // 提示 public static final int Ringtone = 0; public static final int Alarm = 1; public static final int Notification = 2; private TextView timers;// 显示倒计时的文字 public MusicListAdapter adapter; @Overrideprivate ListView listview; private String musicpath; private int _ids[]; // private String _titles[]; // private String _artists[]; // private String[] _path; // private String[] _times; // private String[] _album; // private int _sizes[]; // private String[] _displayname;// private int num; //num private LayoutInflater inflater;//存放音乐文件的 id 数组 存放音乐文件的标题数组 存放音乐艺术家的标题数组 存放音乐路过的标题数组 存放总时间的标题数组 存放专辑的标题数组 存放文件大小的标题数组 存放名称的标题数组确定一个标识 装载布局/** 选择子项点击事件***/ listview.setOnItemClickListener(new MusicListOnClickListener());listview.setOnCreateContextMenuListener(newMusicListContextListener());inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);params = newLayoutParams(LayoutParams.FILL_PARENT,LayoutParams.WRAP_CONTENT);ShowMp3List();}/**显示MP3信息,其中」ds保存了所有音乐文件的_ID,用来确定到底要播放哪一首歌曲,_titles 存放音乐名,用来显示在播放界面,_path 存放音乐文件的路径(删除文件时会用到) 。

相关文档
最新文档