Android音乐播放器

具体功能实现:
欢迎页面
在这里插入图片描述

登录页面
可输入账户密码进行登录、登录失败弹出提示、登陆成功转到主页
可选择忘记密码进行修改
可选择新用户注册进行注册
在这里插入图片描述在这里插入图片描述在这里插入图片描述

修改界面
可输入已有账户进行修改
输入成功出现提示
后跳转可进行密码修改
在这里插入图片描述在这里插入图片描述在这里插入图片描述

播放页面
在这里插入图片描述

操作及注意事项:
先注册,注册成功后可进行修改密码和和登录
登陆成功后可进行常规点击播放音乐与其他操作
主要类:

音乐播放服务类

/**
 * 类说明:音乐播放服务类
 * @author wangzhihao
 * @version 
 */
public class ControlPlay extends Service {

	//声明一个音频播放器
	public static MediaPlayer myMediaPlayer;

	public static MainActivity c_ma;

	public static int playing_id = 0;

	public static Music_infoAdapter m_in;
	
	//创建线程
	public Thread thread;
	Handler handler = new Handler();
	
	public boolean playFlag = true;
	public int vTemp = 0;
	

	@Override
	public IBinder onBind(Intent intent) {
		return null;
	}

	@Override
	public void onCreate() {
		super.onCreate();
		initMediaSource(initMusicUri(0));
	}

	@Override
	public void onDestroy() {
		super.onDestroy();
		if (myMediaPlayer != null) {
			myMediaPlayer.stop();
			myMediaPlayer.release();
			myMediaPlayer = null;
		}
	}

	@Override
	public void onStart(Intent intent, int startId) {
		String playFlag = intent.getExtras().getString("control");
		if ("play".equals(playFlag)) {
			playMusic();
		} else if ("next".equals(playFlag)) {
			playNext();
		} else if ("front".equals(playFlag)) {
			playFront();
		} else if ("listClick".equals(playFlag)) {
			playing_id = intent.getExtras().getInt("musicId_1");
			initMediaSource(initMusicUri(playing_id));
			playMusic();
		} else if ("gridClick".equals(playFlag)) {
			playing_id = intent.getExtras().getInt("musicId_2");
			initMediaSource(initMusicUri(playing_id));
			playMusic();
		}
	}

	/**
	 * 初始化媒体对象
	 * 
	 * @param mp3Path
	 *            mp3路径
	 */
	public void initMediaSource(String mp3Path) {
		Uri mp3Uri = Uri.parse(mp3Path);
		if (myMediaPlayer != null) {
			myMediaPlayer.stop();
			myMediaPlayer.reset();
			myMediaPlayer = null;
		}
		// 为myMediaPlayer创建对象
		myMediaPlayer = MediaPlayer.create(this, mp3Uri);
		//myMediaPlayer = MediaPlayer.create(this, R.raw.aaaa);
	//	c_ma.startRhythm(myMediaPlayer);
	}

	/**
	 * 返回列表第几行的歌曲路径
	 * 
	 * @param _id
	 *            表示歌曲序号,从0开始
	 */
	public String initMusicUri(int _id) {
		playing_id = _id;
		String s;
		// 判断列表和列表长度不为空时才获取
		if (Music_infoAdapter.musicList != null&& Music_infoAdapter.musicList.size() != 0) {
			s = Music_infoAdapter.musicList.get(_id).getMusicPath();
			return s;
		} else {
			// 否则返回空字符串
			return "";
		}
	}
	/**
	 * 音乐播放方法,并且带有暂停方法
	 */
	public void playMusic() {

		// 判断歌曲不能为空
System.out.println("sfajfdsa");
		if (myMediaPlayer != null && Music_infoAdapter.musicList.size() != 0) {
			if (myMediaPlayer.isPlaying()) {
				// 歌曲暂停
				myMediaPlayer.stop();
				// 更换播放按钮背景
				MainActivity.play_ImageButton.setBackgroundResource(R.drawable.play_button);
			} else {
				System.out.println("sfajfdsa2");
		//		myMediaPlayer.start();
				try {       
				     if(myMediaPlayer != null)  
				     {  
				    	 myMediaPlayer.stop();  
				     }      
				     myMediaPlayer.prepare();  
				     myMediaPlayer.start();  
				    
				    } catch (Exception e) {  
				   
				     e.printStackTrace();  
				    }
				// /// 初始化歌词配置 /// //

				// 更换背景-
				MainActivity.play_ImageButton.setBackgroundResource(R.drawable.pause_button);
				// 启动线程更新SeekBar
				startSeekBarUpdate();
				
				// 截取.mp3字符串
				String a = Music_infoAdapter.musicList.get(playing_id).getMusicName();

				// 切换带动画更新歌曲名
				MainActivity.music_Name.setText(a);
				MainActivity.music_Name.setAnimation(AnimationUtils.loadAnimation(ControlPlay.this, R.anim.translate_z));

				// 带动画更新专辑名
				MainActivity.music_Album.setText(Music_infoAdapter.musicList.get(playing_id).getMusicAlbum());
				MainActivity.music_Album.setAnimation(AnimationUtils.loadAnimation(ControlPlay.this, R.anim.alpha_y));

				// 更新歌曲时间
				MainActivity.time_right.setText(Music_infoAdapter.toTime(Music_infoAdapter.musicList.get(playing_id).getMusicTime()));

			}

			/**
			 * 监听播放是否完成
			 */
			myMediaPlayer.setOnCompletionListener(new OnCompletionListener() {

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

					// 播放完当前歌曲,自动播放下一首
					playNext();
				}
			});

		} else {
			Toast.makeText(ControlPlay.this, "木有在手机里找到歌曲啊...",
					Toast.LENGTH_SHORT).show();
		}
	}

	/**
	 * 播放下一首
	 */
	public void playNext() {

		// 判断歌曲不能为空
		if (Music_infoAdapter.musicList.size() != 0) {
			// 如果到了最后一首则一直播放最后一首
			if (playing_id == Music_infoAdapter.musicList.size() - 1) {
				playing_id = Music_infoAdapter.musicList.size() - 1;
				Toast.makeText(ControlPlay.this, "已经是最后一首啦!",
						Toast.LENGTH_SHORT).show();

				MainActivity.play_ImageButton
						.setBackgroundResource(R.drawable.play_button);
				MainActivity.mNotificationManager.cancel(1);

			} else {
				initMediaSource(initMusicUri(++playing_id));
				playMusic();
			}
		} else {
			Toast.makeText(ControlPlay.this, "木有找到歌曲啊!", Toast.LENGTH_SHORT)
					.show();
		}
	}

	/**
	 * 播放上一首
	 */
	public void playFront() {

		// 判断歌曲不能为空
		if (Music_infoAdapter.musicList.size() != 0) {
			// 如果到了第一首则一直播放第一首
			if (playing_id == 0) {
				playing_id = 0;
				Toast.makeText(ControlPlay.this, "现在就是第一首哦!",
						Toast.LENGTH_SHORT).show();
			} else {
				initMediaSource(initMusicUri(--playing_id));
				playMusic();
			}
		} else {
			Toast.makeText(ControlPlay.this, "木有找到歌曲啊!", Toast.LENGTH_SHORT)
					.show();
		}
	}

	public void startSeekBarUpdate() {
		handler.post(start);
	}

	Runnable start = new Runnable() {

		@Override
		public void run() {
			// TODO Auto-generated method stub

			handler.post(updatesb);
		}

	};

	Runnable updatesb = new Runnable() {

		@Override
		public void run() {
			// 获取SeekBar走动到那的时间
			MainActivity.play_time = myMediaPlayer.getCurrentPosition();

			// 设置填充当前获取的进度
			MainActivity.seekbar.setProgress(MainActivity.play_time);
			// SeekBar的最大值填充歌曲时间
			MainActivity.seekbar.setMax(Music_infoAdapter.musicList.get(playing_id).getMusicTime());

			// 线程延迟1000毫秒启动
			handler.postDelayed(updatesb, 1000);
		}
	};

	

	
}

MainActivity类

public class MainActivity extends Activity {

	private ImageButton left_ImageButton;// 上一曲
	public static ImageButton play_ImageButton;// 播放
	private ImageButton right_ImageButton;// 下一曲
	public static Context mContext;
	private ListView musicListView;// 歌曲列表


	// 绑定SeekBar和各种属性TextView
	public static SeekBar seekbar;
	public static TextView time_left;
	public static TextView time_right;
	public static TextView music_Name;
	public static TextView music_Album;
	public static ImageView music_AlbumArt;

	// 为歌曲时间和播放时间定义静态变量
	public static int song_time = 0;
	public static int play_time = 0;

	public static Music_infoAdapter music_info;
	public static NotificationManager mNotificationManager;
	
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		mContext = MainActivity.this;
		musicListView = (ListView) findViewById(R.id.listView1);

		time_left = (TextView) findViewById(R.id.time_tv1);
		time_right = (TextView) findViewById(R.id.time_tv2);
		music_Name = (TextView) findViewById(R.id.music_name);
		music_Album = (TextView) findViewById(R.id.music_album);
		seekbar = (SeekBar) findViewById(R.id.player_seekbar);

		// 创建对象获得系统服务
		mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

		ShowMp3List();
		// 监听播放列表点击事件
		musicListView.setOnItemClickListener(new OnItemClickListener() {

			@Override
			public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,long arg3) {
				Intent play_1 = new Intent(mContext, ControlPlay.class);
				play_1.putExtra("control", "listClick");
				play_1.putExtra("musicId_1", arg2);
				startService(play_1);
			}
		});

		/**
		 * 监听“上一首”并实现功能
		 */
		left_ImageButton = (ImageButton) findViewById(R.id.ib1);
		left_ImageButton.setOnClickListener(new ImageButton.OnClickListener() {

			@Override
			public void onClick(View v) {
				Intent play_left = new Intent(mContext, ControlPlay.class);
				play_left.putExtra("control", "front");
				startService(play_left);
			}
		});

		/**
		 * 监听“下一首”并实现功能
		 */
		right_ImageButton = (ImageButton) findViewById(R.id.ib3);
		right_ImageButton.setOnClickListener(new ImageButton.OnClickListener() {

			@Override
			public void onClick(View v) {
				Intent play_right = new Intent(mContext, ControlPlay.class);
				play_right.putExtra("control", "next");
				startService(play_right);
			}
		});

		/**
		 * 播放按钮,实现方法
		 * */
		play_ImageButton = (ImageButton) findViewById(R.id.ib2);
		play_ImageButton.setOnClickListener(new ImageButton.OnClickListener() {

			@Override
			public void onClick(View v) {
				Intent play_center = new Intent(mContext, ControlPlay.class);
				play_center.putExtra("control", "play");
				startService(play_center);
			}

		});

		// 判断歌曲不能为空并且后缀为.mp3
		if (music_info.getCount() > 0&& Music_infoAdapter.musicList.get(ControlPlay.playing_id).getMusicName().endsWith(".mp3")) {
			// 显示获取的歌曲时间
			time_right.setText(Music_infoAdapter.toTime(Music_infoAdapter.musicList.get(ControlPlay.playing_id).getMusicTime()));
			// 截取.mp3字符串
			String a = Music_infoAdapter.musicList.get(ControlPlay.playing_id).getMusicName();
			int b = a.indexOf(".mp3");
			String c = a.substring(0, b);
			// 显示获取的歌曲名
			music_Name.setText(c);
			music_Name.setAnimation(AnimationUtils.loadAnimation(mContext,R.anim.translate_z));
		} else {
			System.out.println("请点击列表播放歌曲!");
		}

		/**
		 * 监听拖动SeekBar事件
		 */
		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) {
				// 判断用户是否触拖SeekBar并且不为空才执行
				if (fromUser && ControlPlay.myMediaPlayer != null) {
					ControlPlay.myMediaPlayer.seekTo(progress);
				}
				time_left.setText(Music_infoAdapter.toTime(progress));
			}
		});

	}


	private void ShowMp3List() {
		// 用游标查找媒体详细信息
		Cursor cursor = this.getContentResolver().query(
				MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
				new String[] { MediaStore.Audio.Media.TITLE,// 标题,游标从0读取
						MediaStore.Audio.Media.DURATION,// 持续时间,1
						MediaStore.Audio.Media.ARTIST,// 艺术家,2
						MediaStore.Audio.Media._ID,// id,3
						MediaStore.Audio.Media.DISPLAY_NAME,// 显示名称,4
						MediaStore.Audio.Media.DATA,// 数据,5
						MediaStore.Audio.Media.ALBUM_ID,// 专辑名称ID,6
						MediaStore.Audio.Media.ALBUM,// 专辑,7
						MediaStore.Audio.Media.SIZE }, null, null,
				MediaStore.Audio.Media.ARTIST);// 大小,8
		/**
		 * 判断游标是否为空,有些地方即使没有音乐也会报异常。而且游标不稳定。稍有不慎就出错了,其次,如果用户没有音乐的话,
		 * 不妨可以告知用户没有音乐让用户添加进去
		 */
		if (cursor != null && cursor.getCount() == 0) {
			Toast.makeText(mContext, "你的手机未找到音乐,请添加音乐", Toast.LENGTH_LONG).show();
			return;
		}
		System.out.println(" cursor size " + cursor.getCount());
		music_info = new Music_infoAdapter(this, cursor);
		new MusicListView().disPlayList(musicListView, this, cursor);

	}

}

歌曲适配类

/**
 * 类说明:歌曲列表适配类
 * @author wangzhihao
 * @version 
 */
public class Music_infoAdapter extends BaseAdapter {

	// 用来装查询到得音乐文件数据
	//游标
	public Cursor mCursor;
	// 歌曲列表信息
	public static List<MusicInfomation> musicList;
	public MusicInfomation mi;

	public Context mContext;
	
	// 音乐信息:1、歌曲名,2、歌手,3、歌曲时间,4、专辑,5、歌曲大小
	public Music_infoAdapter(Context context,Cursor cursor) {
	System.out.println("Music_infoAdapter");
		this.mContext = context;
		this.mCursor = cursor;
		musicList = new ArrayList<MusicInfomation>();
		/** 将游标移到第一位 **/
		mCursor.moveToFirst();
		if (mCursor != null) {
			// 移动到第一个
			mCursor.moveToFirst();
			// 获得歌曲的各种属性
			for (int i = 0; i < mCursor.getCount(); i++) {
				// 过滤mp3文件
				if (mCursor.getString(5).endsWith(".mp3")) {
					mi = new MusicInfomation();
					mi.setMusicName(mCursor.getString(0));//歌曲名称
					mi.setMusicTime(mCursor.getInt(1));//歌曲时间长度
					mi.setMusicAlbum(mCursor.getString(2));//专辑
					mi.setMusicSinger(mCursor.getString(3));//歌手
					mi.setMusicSize(mCursor.getInt(4));//大小
					mi.setMusicPath(mCursor.getString(5));//路径
					mi.set_id(mCursor.getInt(6));//歌曲id
					musicList.add(mi);
				}
				// 移动到下一个
				mCursor.moveToNext();
			}
			System.out.println("musicList size "+ musicList.size());
		}
	}

	@Override
	public int getCount() {
		return musicList.size();
	}

	@Override
	public Object getItem(int arg0) {
		return musicList.get(arg0);
	}

	@Override
	public long getItemId(int arg0) {
		return 0;
	}

	@Override
	public View getView(int arg0, View arg1, ViewGroup arg2) {
		LayoutInflater li = LayoutInflater.from(mContext);
		View v = li.inflate(R.layout.musiclist_item, null);

		TextView tv1;
		TextView tv2;
		TextView tv3;
		TextView tv4;
		// ImageView iv1;

		tv1 = (TextView) v.findViewById(R.id.tv1);
		tv2 = (TextView) v.findViewById(R.id.tv2);
		tv3 = (TextView) v.findViewById(R.id.tv3);
		tv4 = (TextView) v.findViewById(R.id.tv4);

		tv1.setText(musicList.get(arg0).getMusicName());
		tv2.setText(toTime(musicList.get(arg0).getMusicTime()));
		//tv3.setText(musicList.get(arg0).getMusicPath());
		tv3.setText(musicList.get(arg0).getMusicAlbum());
		tv4.setText(toMB(musicList.get(arg0).getMusicSize()) + "MB");
		return v;
	}

	/**
	 * 时间转化处理
	 */
	public static String toTime(int time) {
		time /= 1000;
		int minute = time / 60;
		int second = time % 60;
		minute %= 60;
		return String.format(" %02d:%02d ", minute, second);
	}

	/**
	 * 文件大小转换,将B转换为MB
	 */
	public String toMB(int size) {
		float a = (float) size / (float) (1024 * 1024);
		String b = Float.toString(a);
		int c = b.indexOf(".");
		String fileSize = "";
		fileSize += b.substring(0, c + 2);
		return fileSize;
	}

	/**
	 * 歌曲专辑图片显示,如果有歌曲图片,才会返回,否则为null,要注意判断
	 * 
	 * @param trackId是音乐的id
	 * @return 返回类型是String 类型的图片地址,也就是uri
	 */
	public String getAlbumArt(int trackId) {



		return "";
	}

	/**
	 * 1、歌曲名 2、歌手 3、歌曲时间 4、专辑(专辑图片,专辑名称,专辑ID[用来获取图片]) 5、歌曲大小
	 */
	public class MusicInfomation {

		private int _id;
		private String musicName;
		private String musicSinger;
		private int musicTime;
		private String musicAlbum;
		private int musicSize;
		private String musicPath;

		public int get_id() {
			return _id;
		}

		public void set_id(int _id) {
			this._id = _id;
		}

		public String getMusicName() {
			return musicName;
		}

		public void setMusicName(String musicName) {
			this.musicName = musicName;
		}

		public String getMusicSinger() {
			return musicSinger;
		}

		public void setMusicSinger(String musicSinger) {
			this.musicSinger = musicSinger;
		}

		public int getMusicTime() {
			return musicTime;
		}

		public void setMusicTime(int musicTime) {
			this.musicTime = musicTime;
		}

		public String getMusicAlbum() {
			return musicAlbum;
		}

		public void setMusicAlbum(String musicAlbum) {
			this.musicAlbum = musicAlbum;
		}

		public int getMusicSize() {
			return musicSize;
		}

		public void setMusicSize(int musicSize) {
			this.musicSize = musicSize;
		}

		public String getMusicPath() {
			return musicPath;
		}

		public void setMusicPath(String musicPath) {
			this.musicPath = musicPath;
		}

	}

}

如需源码可私信

  • 17
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 12
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值