安卓音乐播放器和视频播放器实现
来源:互联网 发布:mac桌面壁纸软件 编辑:程序博客网 时间:2024/04/28 16:08
1.1实验名称
音乐播放器和视频播放器实验。
1.2实验背景
1.2.1需求分析
随着社会的快速发展,现今社会生活紧张,而欣赏音乐和视频是较好的舒缓压力的方式,音乐和视频成了我们生活工作中重要的组成部分。而移动时代的到来,智能手机应用越来越普遍。移动音乐视频服务正是为这一形势而发展起来,开发这种手机音乐播放器和视频播放器的应用,主要为了满足音乐视频爱好人群的需要,于是提出和实现了基于Android系统多媒体播放器的主要功能。
1.3实验目的
(1)了解并熟悉SurfaceView;
(2)了解并掌握MediaPlayer;
(3)熟悉sd卡数据存储;
(4)熟悉LinearLayout或RelativeLayout的使用;
了解Android下的编程,完成一个媒体播放器小项目的开发。
1.4实验过程
1.4.1设计
1.4.1.1音乐播放器架构设计
利用AbsoluteLayout添加按钮,分别控制播放开始、暂停、停止。
1.4.1.2视频播放器架构设计
SurfaceView提供直接访问一个可画图的界面,可以控制在界面顶部的子视图层。SurfaceView是提供给需要直接画像素而不是使用窗体部件的应用使用的。Android图形系统中一个重要的概念和线索是surface。View及其子类(如TextView, Button)要画在surface上。每个surface创建一个Canvas对象(但属性时常改变),用来管理view在surface上的绘图操作,如画点画线。
SurfaceHolder接口持有Surface引用,并且定义了方法控制Surface的尺寸和格式。在SurfaceHolder中定义了4种Surface类型,分别是NORMAL、HARDWARE、GPU和PUSH_BUFFERS。在视频播放与相机预览中,通常是使用PUSH_BUFFERS,也就是说,Surface本身并没有维护一个缓冲区,而是等待屏幕的渲染引擎将内容推送到用户面前。
可以通过holder = mPreview.getHolder();获得这个对象。
SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS是为了surface 指定PUSH类型的缓冲区。
1.4.2音乐播放器编码实现
1.4.2.1新建工程
建立Android project,命名为MusicPlayer。
1.4.2.2.1 AndroidManifest.xml布局设计及实现
其中部分核心代码如下所示:
音乐播放器代码:
package com.example.musicplayer;import java.io.IOException;import android.media.MediaPlayer;import android.os.Bundle;import android.app.Activity;import android.view.Menu;import android.view.View;import android.widget.ImageButton;import android.widget.TextView;public class MainActivity extends Activity { ImageButton mStartImageButton = null; ImageButton mPauseImageButton = null; ImageButton mStopImageButton = null; MediaPlayer mMediaPlayer = null; TextView mTextView = null; private boolean bIsPlaying = false; private boolean bIsReleased = false; private boolean bIsPause = false; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mStopImageButton = (ImageButton) findViewById(R.id.StopImageButton); mStartImageButton = (ImageButton) findViewById(R.id.StartImageButton); mPauseImageButton = (ImageButton) findViewById(R.id.PauseImageButton); mTextView = (TextView) findViewById(R.id.textView1); //mMediaPlayer = MediaPlayer.create(MainActivity.this, R.raw.la_isla_bonita); mStartImageButton.setOnClickListener(new ImageButton.OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub try { if ( !bIsPlaying ) { bIsPlaying = true; /* 装载资源中的音乐 */ mMediaPlayer = MediaPlayer.create(MainActivity.this, R.raw.la_isla_bonita); /* 设置是否循环 */ mMediaPlayer.setLooping(true); try { mMediaPlayer.prepare(); } catch (IllegalStateException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } mMediaPlayer.start(); bIsReleased = false; mTextView.setText("正在播放音乐!"); } } catch (IllegalStateException e) { e.printStackTrace(); } } }); mStopImageButton.setOnClickListener(new ImageButton.OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub try { if ( bIsPlaying ) { if(!bIsReleased){ mMediaPlayer.stop(); mMediaPlayer.release(); bIsReleased = true; } bIsPlaying = false; mMediaPlayer.start(); mTextView.setText("当前为停止状态,请按开始键播放音乐!"); } } catch (IllegalStateException e) { e.printStackTrace(); } } }); mPauseImageButton.setOnClickListener(new ImageButton.OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub try { if ( !bIsReleased ) { if(!bIsPause){ mMediaPlayer.pause(); bIsPause = true; bIsPlaying = true; mTextView.setText("已经暂停,请再次按暂停按钮恢复播放!"); } else{ mMediaPlayer.start(); bIsPause = false; mTextView.setText("音乐恢复播放!"); } } } catch (IllegalStateException e) { e.printStackTrace(); } } }); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; }}
视频播放器代码:
package com.example.surface;import java.io.File;import android.media.AudioManager;import android.media.MediaPlayer;import android.media.MediaPlayer.OnCompletionListener;import android.media.MediaPlayer.OnErrorListener;import android.media.MediaPlayer.OnPreparedListener;import android.os.Bundle;import android.app.Activity;import android.util.Log;import android.view.SurfaceHolder;import android.view.SurfaceHolder.Callback;import android.view.SurfaceView;import android.view.View;import android.widget.ImageButton;import android.widget.SeekBar;import android.widget.SeekBar.OnSeekBarChangeListener;import android.widget.Toast;public class MainActivity extends Activity { private final String TAG = "main"; private SurfaceView sv; private ImageButton btn_play, btn_pause, btn_replay, btn_stop; private MediaPlayer mediaPlayer; private SeekBar seekBar; private int currentPosition = 0; private boolean isPlaying; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); seekBar = (SeekBar) findViewById(R.id.seekBar); sv = (SurfaceView) findViewById(R.id.sv); btn_play = (ImageButton) findViewById(R.id.StartImageButton); btn_pause = (ImageButton) findViewById(R.id.PauseImageButton); btn_stop = (ImageButton) findViewById(R.id.StopImageButton); btn_play.setOnClickListener(click); btn_pause.setOnClickListener(click); btn_stop.setOnClickListener(click); // 为SurfaceHolder添加回调 sv.getHolder().addCallback(callback); seekBar.setOnSeekBarChangeListener(change); } private Callback callback = new Callback() { // SurfaceHolder被修改的时候回调 @Override public void surfaceDestroyed(SurfaceHolder holder) { Log.i(TAG, "SurfaceHolder 被销毁"); // 销毁SurfaceHolder的时候记录当前的播放位置并停止播放 if (mediaPlayer != null && mediaPlayer.isPlaying()) { currentPosition = mediaPlayer.getCurrentPosition(); mediaPlayer.stop(); } } @Override public void surfaceCreated(SurfaceHolder holder) { Log.i(TAG, "SurfaceHolder 被创建"); if (currentPosition > 0) { // 创建SurfaceHolder的时候,如果存在上次播放的位置,则按照上次播放位置进行播放 play(currentPosition); currentPosition = 0; } } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { Log.i(TAG, "SurfaceHolder 大小被改变"); } }; private OnSeekBarChangeListener change = new OnSeekBarChangeListener() { @Override public void onStopTrackingTouch(SeekBar seekBar) { // 当进度条停止修改的时候触发 // 取得当前进度条的刻度 int progress = seekBar.getProgress(); if (mediaPlayer != null && mediaPlayer.isPlaying()) { // 设置当前播放的位置 mediaPlayer.seekTo(progress); } } @Override public void onStartTrackingTouch(SeekBar seekBar) { } @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { } }; private View.OnClickListener click = new View.OnClickListener() { @Override public void onClick(View v) { switch (v.getId()) { case R.id.StartImageButton: play(0); break; case R.id.PauseImageButton: pause(); break; case R.id.StopImageButton: stop(); break; default: break; } } }; /* * 停止播放 */ protected void stop() { if (mediaPlayer != null && mediaPlayer.isPlaying()) { mediaPlayer.stop(); mediaPlayer.release(); mediaPlayer = null; btn_play.setEnabled(true); isPlaying = false; } } /** * 开始播放 * * @param msec 播放初始位置 */ protected void play(final int msec) { // 获取视频文件地址 String path = "/mnt/sdcard/nobody.3gp"; File file = new File(path); if (!file.exists()) { Toast.makeText(this, "视频文件路径错误", 0).show(); return; } try { mediaPlayer = new MediaPlayer(); mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); // 设置播放的视频源 mediaPlayer.setDataSource(file.getAbsolutePath()); // 设置显示视频的SurfaceHolder mediaPlayer.setDisplay(sv.getHolder()); Log.i(TAG, "开始装载"); mediaPlayer.prepareAsync(); mediaPlayer.setOnPreparedListener(new OnPreparedListener() { @Override public void onPrepared(MediaPlayer mp) { Log.i(TAG, "装载完成"); mediaPlayer.start(); // 按照初始位置播放 mediaPlayer.seekTo(msec); // 设置进度条的最大进度为视频流的最大播放时长 seekBar.setMax(mediaPlayer.getDuration()); // 开始线程,更新进度条的刻度 new Thread() { @Override public void run() { try { isPlaying = true; while (isPlaying) { int current = mediaPlayer .getCurrentPosition(); seekBar.setProgress(current); sleep(500); } } catch (Exception e) { e.printStackTrace(); } } }.start(); btn_play.setEnabled(false); } }); mediaPlayer.setOnCompletionListener(new OnCompletionListener() { @Override public void onCompletion(MediaPlayer mp) { // 在播放完毕被回调 btn_play.setEnabled(true); } }); mediaPlayer.setOnErrorListener(new OnErrorListener() { @Override public boolean onError(MediaPlayer mp, int what, int extra) { // 发生错误重新播放 play(0); isPlaying = false; return false; } }); } catch (Exception e) { e.printStackTrace(); } } /** * 暂停或继续 */ protected void pause() { if (mediaPlayer != null && !mediaPlayer.isPlaying()) { mediaPlayer.start(); Toast.makeText(this, "继续播放", 0).show(); return; } if (mediaPlayer != null && mediaPlayer.isPlaying()) { mediaPlayer.pause(); Toast.makeText(this, "暂停播放", 0).show(); } }}
- 安卓音乐播放器和视频播放器实现
- 用HTML5实现音乐播放器和视频播放器
- 安卓实现音乐播放器
- 安卓音乐播放器
- 安卓 音乐播放器
- 安卓实现视频播放器
- 安卓视频播放器 一行代码快速实现视频播放,Android视频播放,AndroidMP3播放,安卓视频播放一行代码搞定
- 22_Android中的本地音乐播放器和网络音乐播放器的编写,本地视频播放器和网络视频播放器,照相机案例,偷拍案例实现
- 音乐播放器和视频播放器的使用
- 安卓视频播放器 一行代码快速实现在线视频播放,Android视频播放,AndroidMP3播放,安卓视频播放一行代码搞定
- 安卓音乐播放器--侧边栏
- 安卓音乐播放器1
- 安卓简易音乐播放器
- 安卓 简易音乐播放器
- 安卓 多媒体音乐播放器
- 安卓之音乐播放器
- 安卓音乐播放器,简单,开源
- 安卓音乐播放器_MediaPlayer
- Linux 下Cmake安装
- Eclipse中Maven的集成和使用介绍
- Android自定义控件实战——下拉刷新控件终结者:PullToRefreshLayout
- weex sdk集成到Android工程三. weex服务项目搭建
- iphone7以及7P的模拟器删除应用解决办法
- 安卓音乐播放器和视频播放器实现
- 同一页面把js的值传入input
- 基于JavaMail的Java邮件发送:简单邮件发送
- JavaScript type 对比 Objective-C type 转换
- 微信小程序开发之五星评分
- MFC数组类CArray的使用
- java 最小子序列和
- linux内核中等待队列(wait_event,wake_up...)
- 方法join(long)与方法sleep(long)的区别