Android音乐播放器代码实现

本文介绍了一个智能播放器的实现,包括音乐播放、暂停、继续播放、停止等基本操作,以及如何实现在播放音乐时动态显示歌词的功能。通过解析歌词文件并根据音乐播放的时间动态更新歌词,实现了音乐播放与歌词同步显示的用户体验。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 
<EditText
        android:id="@+id/et_address"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true"
        android:ems="10"
        android:text="@string/fileName" >

        <requestFocus />
    </EditText>

    <Button
        android:id="@+id/btn_play"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_below="@+id/et_address"
        android:onClick="mediaPlay"
        android:text="@string/btn_tvplay" />

    <Button
        android:id="@+id/btn_replay"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/et_address"
        android:layout_toRightOf="@+id/btn_pause"
        android:onClick="mediaResumePlay"
        android:text="@string/btn_replay" />

    <Button
        android:id="@+id/btn_pause"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBaseline="@+id/btn_play"
        android:layout_alignBottom="@+id/btn_play"
        android:layout_toRightOf="@+id/btn_play"
        android:onClick="mediaPause"
        android:text="@string/btn_pausetv" />

    <Button
        android:id="@+id/btn_stop"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBaseline="@+id/btn_replay"
        android:layout_alignBottom="@+id/btn_replay"
        android:layout_alignParentRight="true"
        android:onClick="mediaStop"
        android:text="@string/btn_stoptv" />
    
    <TextView
        android:id="@+id/tv_lrc"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/btn_play"
        android:layout_alignParentBottom="true"
        android:layout_alignParentRight="true"
        android:gravity="center_vertical|center"
        android:layout_below="@+id/btn_play"
        android:text="@string/tv_lrct" />


 

public class PlayerActivity extends Activity {

	private EditText et_address;

	private MediaPlayer mediaPlayer;

	// 记录视频播放的位置
	private int currentPosition;

	private boolean isPlay = false;

	// 显示歌词对象
	private TextView tv_lrc;

	private Handler handler;

	private static final int SHOWLRC = 1;

	// 封装歌词显示的map集合
	private Map<Date, String> map;

	// 控制这个歌词是否显示
	private boolean showFlag = false;

	// 显示歌词的时间记录
	private long curretnTime;

	private String content_lrc;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_player);
		et_address = (EditText) findViewById(R.id.et_address);

		tv_lrc = (TextView) findViewById(R.id.tv_lrc);

		handler = new Handler() {
			@Override
			public void handleMessage(Message msg) {
				switch (msg.what) {
				case SHOWLRC:
					tv_lrc.setText(content_lrc);
					break;
				default:
					break;
				}
			}
		};

	}

	/**
	 * 音乐播放
	 * 
	 * @param v
	 */
	public void mediaPlay(View v) {

		try {
			String path = et_address.getText().toString();
			File sdCardFile = Environment.getExternalStorageDirectory();
			path = sdCardFile.getPath() + "/Music/" + path;

			File lrcFile = new File(sdCardFile.getPath() + "/Music/xczl.lrc");

			System.out.println("输出path的路径为:" + path);
			if (TextUtils.isEmpty(path) || "".equals(path)) {
				Toast.makeText(this, "音乐播放文件的路径不能为空", Toast.LENGTH_LONG).show();

			} else {
				// 播放准备的过程中
				if (!isPlay) {

					// 获取歌词内容
					initLrc(lrcFile);

					// 创建的mediaPlayer对象
					mediaPlayer = new MediaPlayer();

					// 当前音乐是否播放mediaPlayer.isPlaying();

					// 显示歌词的时候
					// mediaPlayer.getDuration();
					/**
					 * 视频播放完成出发的事件
					 */
					mediaPlayer
							.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {

								@Override
								public void onCompletion(MediaPlayer mp) {
									mp.release();
									isPlay = false;
									mp = null;

								}
							});

					/**
					 * 播放出差错的时候触发的事件
					 */
					mediaPlayer
							.setOnErrorListener(new MediaPlayer.OnErrorListener() {

								@Override
								public boolean onError(MediaPlayer mp,
										int what, int extra) {
									mp.release();
									mp = null;
									isPlay = false;
									return false;
								}
							});
					mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
					mediaPlayer.setDataSource(path);
					mediaPlayer.prepare(); // might take long! (for buffering,
											// // etc)
					mediaPlayer.start();

					// 显示歌词
					showFlag = true;
					showLrc();
					// 让isPlay变为真
					isPlay = true;

					// 获取播放的总时间
					System.out.println("-----------"
							+ mediaPlayer.getDuration());

				}
			}

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

	}

	/**
	 * 音乐暂停
	 * 
	 * @param v
	 */
	public void mediaPause(View v) {
		if (mediaPlayer != null && isPlay) {
			mediaPlayer.pause();
		}
	}

	/**
	 * 音乐继续播放
	 * 
	 * @param v
	 */
	public void mediaResumePlay(View v) {
		if (mediaPlayer != null && isPlay) {
			mediaPlayer.start();
		}
	}

	/**
	 * 音乐停止
	 * 
	 * @param v
	 */
	public void mediaStop(View v) {
		if (mediaPlayer != null && isPlay) {
			mediaPlayer.stop();
			mediaPlayer.release();
			mediaPlayer = null;
			isPlay = false;
		}

	}

	@Override
	protected void onPause() {
		super.onPause();

		if (mediaPlayer != null && isPlay) {
			mediaPlayer.pause();
			currentPosition = mediaPlayer.getCurrentPosition();
		}
	}

	@Override
	protected void onRestart() {
		super.onRestart();

		if (mediaPlayer != null && isPlay) {
			mediaPlayer.seekTo(currentPosition);
			mediaPlayer.start();
			showLrc();
		}

	}

	@Override
	protected void onDestroy() {
		super.onDestroy();
		// 释放资源
		if (mediaPlayer != null) {
			mediaPlayer.release();
			mediaPlayer = null;
		}
	}

	public void initLrc(File lrcFile) throws Exception {
		map = new HashMap<Date, String>();
		// 创建文件输入流对象
		FileInputStream fis = new FileInputStream(lrcFile);
		// 创建reader对象
		BufferedReader reader = new BufferedReader(new InputStreamReader(fis));
		String lineContent = null;
		while ((lineContent = reader.readLine()) != null) {
			LrcUtil.splitLineContent(lineContent, map);
		}

	}

	public void showLrc() {
		// 显示歌词
		if (map != null) {
			new Thread(new Runnable() {
				@Override
				public void run() {
					while (showFlag) {

						try {
							Thread.sleep(1);
							curretnTime++;
							if (map != null) {
								SimpleDateFormat dateFormat = new SimpleDateFormat(
										"mm:ss.SS");
								Date date = new Date(curretnTime);
								String source = dateFormat.format(date);
								try {
									// 根据时间来获取 歌词
									content_lrc = map.get(dateFormat
											.parse(source));

									// 当读取的歌词不为空的时候 发送消息处理机制
									if (content_lrc != null) {
										handler.sendEmptyMessage(PlayerActivity.SHOWLRC);
									}
									System.out.println(content_lrc
											+ "xxxxxxxx"
											+ source);

								} catch (ParseException e) {
									// TODO Auto-generated catch block
									e.printStackTrace();
								}
							}

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

				}
			}).start();
		}
	}
}


 

public class LrcUtil {

	// 一行一行的解析
	public static void splitLineContent(String content, Map map)
			throws Exception {
		if ("".equals(content) || content == null) {
			return;
		}
		int startIndex = content.indexOf("[");
		int endIndex = content.indexOf("]");
		String date = content.substring(startIndex + 1, endIndex);
		String lrc = content.substring(endIndex + 1, content.length());

		SimpleDateFormat sdf = new SimpleDateFormat("mm:ss.SS");
		map.put(sdf.parse(date), lrc);
	}

}


 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值