<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;@Overrideprotected 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() {@Overridepublic 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() {@Overridepublic void onCompletion(MediaPlayer mp) {mp.release();isPlay = false;mp = null;}});/** * 播放出差错的时候触发的事件 */mediaPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() {@Overridepublic 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;}}@Overrideprotected void onPause() {super.onPause();if (mediaPlayer != null && isPlay) {mediaPlayer.pause();currentPosition = mediaPlayer.getCurrentPosition();}}@Overrideprotected void onRestart() {super.onRestart();if (mediaPlayer != null && isPlay) {mediaPlayer.seekTo(currentPosition);mediaPlayer.start();showLrc();}}@Overrideprotected 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() {@Overridepublic 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 blocke.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. Android 音乐播放器。
  2. android TabHost 对象报错
  3. Android wifi的WifiInfo对象详解
  4. Android之JAVASe基础篇-面向对象-IO(九)
  5. Android中,把XML文件转换成Object对象的方法
  6. 初学Android,五大布局对象(六)
  7. Android中intent传递对象和Bundle的用法
  8. Android中音乐文件的信息详解【安卓源码解析二】
  9. android本地音乐播放(二)

随机推荐

  1. 数据结构与算法(1)------数据结构的入门
  2. MySQL的SQL语句 - 数据定义语句 - DROP
  3. CentOS7.6修改主机名称hostname
  4. JAVA开发ORACLE的规范
  5. MySQL的SQL语句 - 数据定义语句(18)- RENAM
  6. 小白之路---C语言
  7. GitHub 标星 1.3w+,这可能是我见过最好的
  8. CISSP学习:第20章软开开发安全
  9. C语言
  10. 扎心一问:前后端分离开发,RESTful 接口要怎