研究生入学后碰上的第一个老师布置的Android小项目,也是借此机会复习一下本科时接触的安卓开发,主要包括两个部分:

一、音乐播放器

利用安卓提供的MediaPlayer媒体播放类实现简单的开始、暂停、以及停止指定音乐文件的播放功能,要求暂停后点击开始能够继续播放,停止后点击开始能够从头开始:

1) 基础的界面布局和控件(开始、暂停、停止三个按钮)设计,以及所有按钮相应的事件监听代码的实现:

主Activity代码:

MediaPlayerActivity.java:

package android.mediaplayer;import java.io.IOException;import android.app.Activity;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnCompletionListener;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageButton;
import android.widget.TextView;public class MediaPlayerActivity extends Activity {/** Called when the activity is first created. */MediaPlayer mMediaPlayer;TextView mTextView;ImageButton mPlay;ImageButton mPause;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);//创建MediaPlayer对象,音乐文件位置:/res/raw/ifeveryonecared.mp3mMediaPlayer = MediaPlayer.create(MediaPlayerActivity.this,  R.raw.ifeveryonecared);mTextView = (TextView)findViewById(R.id.activeText);mPlay = (ImageButton)findViewById(R.id.PlayBtn);mPause = (ImageButton)findViewById(R.id.PauseBtn);ImageButton mStop = (ImageButton)findViewById(R.id.StopBtn);mPlay.setOnClickListener(new playListener());mPause.setOnClickListener(new pauseListener());mStop.setOnClickListener(new stopListener());}class playListener implements OnClickListener{public void onClick(View v){try{//设置音乐循环播放mMediaPlayer.setLooping(true);              try{//准备开始mMediaPlayer.prepare();}catch(IllegalStateException e){e.printStackTrace();}catch(IOException e){e.printStackTrace();}mMediaPlayer.start();mTextView.setText("正在播放音乐!");mPause.setVisibility(View.VISIBLE);mPlay.setVisibility(View.INVISIBLE);}catch (IllegalStateException e){e.printStackTrace();}mMediaPlayer.setOnCompletionListener(new OnCompletionListener(){public void onCompletion(MediaPlayer arg0){//释放资源mMediaPlayer.release();}});}
}class pauseListener implements OnClickListener{public void onClick(View v){try{try{mMediaPlayer.prepare();}catch(IllegalStateException e){e.printStackTrace();}catch(IOException e){e.printStackTrace();}mMediaPlayer.pause();;mTextView.setText("已暂停,点击播放按钮可继续!");mPause.setVisibility(View.INVISIBLE);mPlay.setVisibility(View.VISIBLE);}catch (IllegalStateException e){e.printStackTrace();}mMediaPlayer.setOnCompletionListener(new OnCompletionListener(){public void onCompletion(MediaPlayer arg0){mMediaPlayer.release();}});}}class stopListener implements OnClickListener{public void onClick(View v){try{mMediaPlayer.setLooping(true);try{mMediaPlayer.prepare();}catch(IllegalStateException e){e.printStackTrace();}catch(IOException e){e.printStackTrace();}mMediaPlayer.stop();mTextView.setText("已停止,点击播放按钮重新播放!");mPause.setVisibility(View.INVISIBLE);mPlay.setVisibility(View.VISIBLE);}catch (IllegalStateException e){e.printStackTrace();}mMediaPlayer.setOnCompletionListener(new OnCompletionListener(){public void onCompletion(MediaPlayer arg0){mMediaPlayer.release();}});}}
}

布局文件main.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="fill_parent"android:layout_height="fill_parent"android:orientation="vertical" ><LinearLayoutandroid:id="@+id/linearLayout1"android:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="0.15"android:background="@drawable/bgcolor"android:gravity="center"android:orientation="vertical" ><TextViewandroid:id="@+id/textView1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="MusicPlayer"android:textAppearance="?android:attr/textAppearanceLarge" /></LinearLayout><LinearLayoutandroid:id="@+id/linearLayout3"android:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="0.85"android:gravity="center"android:orientation="vertical" ><TextViewandroid:id="@+id/activeText"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="left"android:text="Hello MusicActivity!"android:textAppearance="?android:attr/textAppearanceLarge" /><LinearLayoutandroid:id="@+id/linearLayout2"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_gravity="center"android:layout_weight="0.60"android:gravity="center" ><FrameLayoutandroid:id="@+id/frameLayout1"android:layout_width="80dp"android:layout_height="80dp" ><ImageButtonandroid:id="@+id/PlayBtn"android:layout_width="80dp"android:layout_height="80dp"android:src="@drawable/play" /><ImageButtonandroid:id="@+id/PauseBtn"android:layout_width="80dp"android:layout_height="80dp"android:visibility="invisible"android:src="@drawable/pause" /></FrameLayout><ImageButtonandroid:id="@+id/StopBtn"android:layout_width="80dp"android:layout_height="80dp"android:src="@drawable/stop" /></LinearLayout>
</LinearLayout>
</LinearLayout>

这里由于考虑到实际需求,在音乐播放时会隐藏开始按钮,音乐暂停或停止后会重新显示开始按钮。

2) 开始运行(Android版本2.3.3)后,基础的播放、暂停、停止、暂停后播放功能均正常,不过当按下停止按钮后,再点击开始按钮没有声音,音乐不会从头开始播放。在网上查找关于MediaPlayer的start()、pause()、和stop()的用法后,发现若要实现重新播放,应在当前播放音乐暂停后,将播放进度重新设置到文件开头,即将mMediaPlayer.stop()更改为:

mMediaPlayer.pause();
mMediaPlayer.seekTo(0);

重新运行项目后,停止后重新播放功能正常运行。

二、视频播放器

这个相对来说更简单,利用MediaPlayer类和SurfaceView类(Android提供的媒体播放绘图窗口,不占用主UI线程)配合的方式实现:

1)

主Activity代码:

VideoPlayerActivity:

package android.video;import android.app.Activity;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.view.SurfaceHolder;
import android.view.SurfaceHolder.Callback;
import android.view.SurfaceView;public class VideoPlayerActivity extends Activity{/** Called when the activity is first created. */MediaPlayer mMediaPlayer = new MediaPlayer();SurfaceView sv;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);sv = (SurfaceView)findViewById(R.id.surface);SurfaceHolder sh = sv.getHolder();//为surface指定PUSH类型的缓冲区,在视频播放和相机预览中通常使用PUSH_BUFFERSsh.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);sh.addCallback(new Callback()/* 为正常使用SurfaceView,必须实现以下三个方法(SurfaceView的生命周期)*/{          public void surfaceDestroyed(SurfaceHolder holder) {  System.out.println("Destroyed调用调试...");}  public void surfaceCreated(SurfaceHolder holder) {  try {  //开始播放  play();  System.out.println("准备开始...");mMediaPlayer.seekTo(0);} catch (Exception e) {  // TODO: handle exception  }  }             public void surfaceChanged(SurfaceHolder holder, int format, int width,  int height) {  System.out.println("Change调用调试...");}  }); }private void play() {  try {  mMediaPlayer.reset();  mMediaPlayer  .setAudioStreamType(AudioManager.STREAM_MUSIC);  //设置需要播放的视频  mMediaPlayer.setDataSource("/mnt/sdcard/TestVideo.3gp");  //把视频画面输出到SurfaceView  mMediaPlayer.setDisplay(sv.getHolder());  mMediaPlayer.prepare();  //播放  mMediaPlayer.start();          } catch (Exception e) {  // TODO: handle exception  }  }
}

为便于调试,同时也想稍微探索下SurfaceView运行过程中发生了什么,这里在其surfaceCreated()、surfaceChanged()、surfaceDestroyed()三个方法中加入了相应的输出语句。

布局文件main.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="fill_parent"android:layout_height="fill_parent"android:orientation="vertical" >
<LinearLayoutandroid:id="@+id/linearLayout1"android:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="0.15"android:background="@drawable/bgcolor"android:gravity="center"android:orientation="vertical" ><TextViewandroid:id="@+id/textView1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="MusicPlayer"android:textAppearance="?android:attr/textAppearanceLarge" /></LinearLayout><FrameLayoutandroid:id="@+id/frameLayout1"android:layout_width="match_parent"android:layout_height="0dp" android:layout_weight="1.0"><SurfaceViewandroid:id="@+id/surface"android:layout_width="match_parent"android:layout_height="match_parent" /></FrameLayout></LinearLayout>

2) 不出所料,视频可以正常播放。另外,查看了一下LogCat里的日志记录:

前两条输出语句是在视频播放开始时输出的,最后一条则是在退出app时输出。(你有没有发现了什么?)

最后值得一提的是,如果选择的视频文件的编码手机不支持,是会报 error (1, -2147483648)这样一个错误的,这个也好解决,去重新下一个手机视频或者格式转换一下即可。

一个迷你音频播放器项目相关推荐

  1. 《华为音乐播放器项目》——1.项目简介与环境搭建

    华为音乐播放器项目 项目简介:做出一个华为音乐播放器项目,涉及技术有JS.SVG.SCSS 最终效果预览:点击查看 目的:自己JS基础太差了,需要熟悉JS,CSS 具体环境搭建过程 一.首先肯定是创建 ...

  2. 微信小程序:音频播放器

    由于产品需求,需要做一个自定义音频播放器,现在也差不多做完了,接下来呢,给大家分享一下,大家先来看看效果图哦~ 这里呢,我选择的是 wx.createInnerAudioContext 这个方法,大家 ...

  3. HTML5用audio标签做一个最简单的音频播放器

    在做系统的时候,要求做一个音频播放器,就在网上查找了一些资料,发现这样的资料还是很千篇一律的,EasyUI框架并没有给我们一个音频播放器的功能,在bootstrap上有,但是也是结合html5来写的, ...

  4. 【创新项目实训】Android移动开发教学app案例之音频播放器(二)

    教学app案例之音频播放器(二) 一.开发环境 二.项目介绍 三.开始主界面 四.显示歌曲列表 五.播放音乐的服务 六.实现播放音乐 一.开发环境 软件环境: Android Studio 4.1.3 ...

  5. 一个WPF开发的、界面简洁漂亮的音频播放器

    今天推荐一个界面简洁.美观的.支持国际化开源音频播放器. 项目简介 这是一个基于C# + WPF开发的,界面外观简洁大方,操作体验良好的音频播放器. 支持各种音频格式,包括:MP4.WMA.OGG.F ...

  6. 完整打造一个多功能音乐播放器项目(初步设想跟酷狗类似)

    本人目前准备利用闲暇时间打造一个完整的音乐播放器项目,主要用于学习及分享!原创不易,转载请注明出处. 这是一个什么样的音乐播放器呢?整体的架构跟酷狗差不多吧,我的方式呢,是一个个组件一个个模块先做好, ...

  7. php项目网页音乐播放器插件,基于HTML5 canvas和Web Audio的音频播放器插件

    wavesurfer.js是一款基于HTML5 canvas和Web Audio的音频播放器插件.通过wavesurfer.js你可以使用它来制作各种HTML5音频播放器,它可以在各种支持 Web A ...

  8. web音频播放器_Web设计:如何创建一个时尚的Web音频播放器

    我仍然记得在2000年代初,在线播放富媒体(音频和视频)时遇到了很多限制. 很容易就将开始视为理所当然,尤其是自从今天以来,我们有很多商店可以播放音频,例如last.fm或播放视频,例如Youtube ...

  9. jquery 音频播放_10个jQuery HTML5音频播放器

    jquery 音频播放 根据Buzz Angle Music的数据 ,仅在美国,2017年第一季度就消费了830亿个音频流.这比上一季度增长了61.2%. 同时,音乐销量下降了23.8%. 2017年 ...

最新文章

  1. 2011年图书馆技术发展方向
  2. 【转】NHIBERNATE的各种保存方式的区别 (SAVE,PERSIST,UPDATE,SAVEORUPDTE,MERGE,FLUSH,LOCK)
  3. h5跳转小程序页面url_web-view h5跳转到小程序页面,无法跳转?
  4. 【知识小课堂】4 之 索引
  5. leetcode 278. 第一个错误的版本(二分)
  6. rsync的原理和安装使用及配制详解(三)(转)
  7. Web框架——Flask系列之模板使用练习(六)
  8. linux下安装TensorFlow(centos)
  9. 详解SESSION与COOKIE的区别
  10. C# 操作List集合报错:集合被修改,枚举操作可能不会执行(Collection was modified, enumeration operation may not execute)
  11. Python代码规范
  12. 三星线刷工具Odin3_V3.12.7
  13. 卷积神经网络之“浅层特征”与“深层特征”
  14. SAP ABAP搜狗输入法注释删除注释快捷键设置(未解决)
  15. 3.4 Postman调用手顺(Netsuite相关)
  16. 智能车|直流电机、编码器与驱动器
  17. 一个霸占程序员休息时间的 APP
  18. (超详细)MapReduce工作原理及基础编程
  19. 能量原理与变分法笔记03:证明两点之间直线最短
  20. android视频解码数据分辨率改变,Android实现任意分辨率视频编码的思考与实现

热门文章

  1. c语言三日通 下载,sama
  2. python桌面界面开发在那种编译器写代码_Python智慧编程——第1讲 遇见Mu editor
  3. 2021年工业软件行业研究报告
  4. nacos的feign报错Error creating bean with name ‘configurationPropertiesBeans‘ defined in class path reso
  5. 【ZZULIOJ】1008: 美元和人民币
  6. Java程序员修炼之路
  7. 新加坡设自动巡逻机器人,助力城市精细化治理
  8. CSP-J CSP-S初赛相关知识汇总
  9. 数据库设计经验谈之一
  10. 【蓝桥杯】Python字符串处理和应用