1、Android视频音频播放1、课程名称: Android音频视频播放2、知识点2.1、上次课程的主要知识点2.2、本次预计讲解的知识点3、具体内容3.1、Activity生命周期及其应用(重点)Activity在创建到销毁的过程中也经历过多个方法来监听其生命周期执行过程。其中,主要有以下几个方法:1) onCreate:当Activity在创建后,自动执行此方法,来对Activity中的布局和组件进行一些初始化。2) onDestory:当Activity退出销毁时自动执行的方法, 主要用来进行一些收尾和垃圾回收的工作。3) onStart4) onResume5) onPause6) onS
2、top7) onRestart使用一张流程图来查看整个Activity的生命周期。生命周期的这些监听方法主要可以在以下功能中使用:1) 退出功能,可以在onCreate中记录下当前经历过的Activity类,在onDestory中将记录的Activity移除。只需要将打开过的所有Activity统一关闭,即可实现退出整个程序的功能。2) 当从详细界面返回到列表界面时,进行数据刷新功能。3) onDestory中是否音乐播放器的内存。应用生命周期的功能,实现面试宝典中的退出系统功能。 Override protected void onCreate(Bundle savedInstanceSta
3、te) super.onCreate(savedInstanceState); allActiveActivities.add(this); Override protected void onDestroy() / 将当前要退出的Activity从所有活动的Activity集合中删除 try allActiveActivities.remove(this); catch (Exception e) e.printStackTrace(); super.onDestroy(); 当点击退出时,需要将整个集合中所有的Activity关闭。 exit.setOnClickListener(new
4、OnClickListener() Override public void onClick(View v) / 循环迭代所有活动的Activity Iterator iter = allActiveActivities .iterator(); while (iter.hasNext() iter.next().finish(); );3.2、SeekBar拖动条(掌握)使用SeekBar组件,可以实现一个拖动条,用来完成调整亮度,改变音乐播放位置等功能。 也可以加入监听功能。public class MainActivity extends Activity private SeekBar
5、 seekbar; private TextView result; Override protected void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState); Globals.init(this); / 设置所使用的布局界面 setContentView(R.layout.activity_main); seekbar = (SeekBar) findViewById(R.id.seekbar); result = (TextView) findViewById(R.id.result); s
6、eekbar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() Override public void onStopTrackingTouch(SeekBar seekBar) result.setText(停止拖动); Override public void onStartTrackingTouch(SeekBar seekBar) result.setText(开始拖动); Override public void onProgressChanged(SeekBar seekBar, int progress, boole
7、an fromUser) result.setText(正在拖动,当前的值为: + progress); ); 3.3、音乐播放器(掌握)在进行音频和视频播放时,都需要使用MediaPlayer类来加载音频或视频文件。同时要注意,如果想使用模拟器播放音频时,不能使用snapshot。同时还要注意,如果使用win7 + 模拟器播放音频时,必须使用管理员身份启动Eclipse,否则SD卡无法识别。准备工作都完成后,可以开始初始化音频播放的类,MediaPlayer这个类也有自己的生命周期。可以通过其API文档来查看生命周期的执行流程:1) 建立对象后,MediaPlayer对象会默认处于空闲状态(
8、idle)2) 需要为其设置播放的数据来源(音频或视频文件)3) 调用prepare()方法,将里面的一些信息读入并准备好。4) 准备好后,才可以调用start()进行播放5) 如果设置了循环播放(looping=true)且歌曲已经播放完成,则会自动重新播放。6) 在播放状态下,调用pause()方法会进入暂停状态,再次调用start()即可继续播放。7) 如果没有设置循环播放(Looping= false),且音乐播放完成,会自动进入播放完成状态,这时如果再次调用start(),则会重新开始当前歌曲的播放。8) 停止状态不会自动进入,必须调用stop方法才会进入这个状态。9) 如果想完整的
9、释放所有内存,需要调用release()方法来完成。这里先完成一个基本的歌曲播放功能,没有界面。public class MainActivity extends Activity private MediaPlayer player; private String filePath = /mnt/sdcard/a.mp3; Override protected void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);
10、/ 初始化 player = new MediaPlayer(); try / 设置要播放的文件 player.setDataSource(filePath); / 进行准备操作 player.prepare(); / 开始播放 player.start(); catch (Exception e) e.printStackTrace(); Toast.makeText(this, 当前加载的音乐有问题,请确定文件格式是否正确!, Toast.LENGTH_LONG) .show(); Override protected void onDestroy() / 退出时释放音乐 if (play
11、er != null) if (player.isPlaying() player.stop(); player.release(); super.onDestroy(); 设计界面,加入播放,暂停,上一首,下一首,以及所有歌曲列表等界面组件。 完成各种音乐播放的操作功能。public class MainActivity extends Activity private MediaPlayer player; private String filePath = /mnt/sdcard/a.mp3; private String songName = Fly Me To The Moon; /
12、 音乐名称 private TextView musicName; / 播放时间长度的文本 private TextView timeText; / 拖动条 private SeekBar seekbar; / 播放/暂停 按钮 private Button playBtn; / 上一首 private Button preBtn; / 下一首 private Button nextBtn; / 总播放时长的文本 private String durationTimeStr; / 建立消息通道,以便在子线程中修改界面 private Handler handler; Override prot
13、ected void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); handler = new Handler() Override public void handleMessage(Message msg) seekbar.setProgress(player.getCurrentPosition(); timeText.setText(getTextByMs(player.getCurrentPosition()
14、 + / + durationTimeStr); ; / 取得所有组件 musicName = (TextView) findViewById(R.id.music_name); timeText = (TextView) findViewById(R.id.time_text); seekbar = (SeekBar) findViewById(R.id.seekbar); playBtn = (Button) findViewById(R.id.play_btn); preBtn = (Button) findViewById(R.id.pre_btn); nextBtn = (Butto
15、n) findViewById(R.id.next_btn); / 初始化 player = new MediaPlayer(); try / 设置要播放的文件 player.setDataSource(filePath); / 进行准备操作 player.prepare(); / player.start(); / 初始化拖动条的总长度 seekbar.setMax(player.getDuration(); durationTimeStr = getTextByMs(player.getDuration(); / 修改歌曲标题 musicName.setText(songName); /
16、设置显示的播放时间 timeText.setText(00:00 / + durationTimeStr); catch (Exception e) e.printStackTrace(); Toast.makeText(this, 当前加载的音乐有问题,请确定文件格式是否正确!, Toast.LENGTH_LONG) .show(); / 加入一个多线程,通过子线程控制拖动条以及显示时间的改变 Thread t = new Thread() Override public void run() while (true) try Thread.sleep(1000); / 取得当前的播放时间位
17、置,设置到拖动条里 if (player.isPlaying() / 传递一个空消息,不需要有具体的消息内容,因为消息通道中只有一个固定的操作,而且不需要参数. handler.sendEmptyMessage(0); catch (Exception e) e.printStackTrace(); ; t.start(); / 为播放按钮加监听 playBtn.setOnClickListener(new OnClickListener() Override public void onClick(View v) if (player.isPlaying() player.pause();
18、playBtn.setBackgroundResource(R.drawable.ic_player_play_default); else player.start(); playBtn.setBackgroundResource(R.drawable.ic_player_pause_default); ); / 开始播放 playBtn.performClick(); / 加入拖动条的监听 seekbar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() Override public void onStopTrackingTouch(SeekBar seekBar) /
copyright@ 2008-2023 冰点文库 网站版权所有
经营许可证编号:鄂ICP备19020893号-2