android通过点击播放视频,Android通过MediaPlayer实现播放视频实例
最进想通过MediaPlayer实现播放一个视频,并且SeekBar可拖动的功能,记录下来,以便查阅!
实现效果如下:
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
android:id="@+id/surfaceview"
android:layout_width="fill_parent"
android:layout_height="600dp" />
android:id="@+id/seekBar"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:max="100"/>
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >
android:id="@+id/start"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="播放" />
android:id="@+id/pause"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="暂停" />
android:id="@+id/stop"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="停止" />
package com.Javen;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.SurfaceView;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.Button;
import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener;
public class VideoPlayTestActivity extends Activity implements OnClickListener{
/** Called when the activity is first created. */
private SurfaceView surfaceView = null;
private Button startButton, pauseButton, stopButton;
private SeekBar seekBar = null;
private Player player = null;
private static final String TAG = "VideoPlayTestActivity";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.main);
findView();
player = new Player(surfaceView, seekBar);
}
private void findView()
{
surfaceView = (SurfaceView)findViewById(R.id.surfaceview);
seekBar = (SeekBar)findViewById(R.id.seekBar);
startButton = (Button)findViewById(R.id.start);
pauseButton = (Button)findViewById(R.id.pause);
stopButton = (Button)findViewById(R.id.stop);
startButton.setOnClickListener(this);
pauseButton.setOnClickListener(this);
stopButton.setOnClickListener(this);
seekBar.setOnSeekBarChangeListener(SeekBarLinstener);
}
@Override
public void onClick(View v)
{
// TODO Auto-generated method stub
int id = v.getId();
switch (id)
{
case R.id.start:
player.playPath("/mnt/usb/sda1/test.rmvb");
break;
case R.id.pause:
player.pause();
break;
case R.id.stop:
player.stop();
break;
default:
break;
}
}
OnSeekBarChangeListener SeekBarLinstener = new OnSeekBarChangeListener()
{
int progress;
@Override
public void onStopTrackingTouch(SeekBar seekBar)
{
// seekTo()的参数是相对与影片时间的数字,而不是与seekBar.getMax()相对的数字
player.mediaPlayer.seekTo(progress);
}
@Override
public void onStartTrackingTouch(SeekBar seekBar)
{
}
@Override
public void onProgressChanged(SeekBar seekBar, int arg0,
boolean fromUser)
{
/**
* 这里的arg0是百分比,即拖动位置暂全部视频的百分位置
* this.progress则是相当影片的总体时间的长度
*/
this.progress = arg0 * player.mediaPlayer.getDuration()/seekBar.getMax();
Log.d(TAG,"arg0 ="+arg0+" this.progress="+this.progress);
}
};
}
package com.Javen;
import java.io.IOException;
import java.util.Timer;
import java.util.TimerTask;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnBufferingUpdateListener;
import android.media.MediaPlayer.OnCompletionListener;
import android.os.Handler;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.widget.SeekBar;
public class Player implements SurfaceHolder.Callback, OnBufferingUpdateListener, OnCompletionListener, MediaPlayer.OnPreparedListener
{
public MediaPlayer mediaPlayer;
public SurfaceHolder surfaceHolder;
private SeekBar playerSeekBar;
private int videoWidth, videoHeight;
private Timer timer;
public Player(SurfaceView surfaceView, SeekBar seekBar)
{
super();
this.playerSeekBar = seekBar;
surfaceHolder = surfaceView.getHolder();
surfaceHolder.addCallback(this);
surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
timer = new Timer();
timer.schedule(timerTask, 0, 1000);//使用TimerTask实现更新seekBar的进度条
}
TimerTask timerTask = new TimerTask()
{
public void run()
{
if(mediaPlayer == null)
return;
if(mediaPlayer.isPlaying() && playerSeekBar.isPressed()== false)
{
handlerProgress.sendEmptyMessage(0);
}
};
};
Handler handlerProgress = new Handler()
{
public void handleMessage(android.os.Message msg)
{
switch (msg.what)
{
case 0:
int position = mediaPlayer.getCurrentPosition();//获取当前播放的影片文件位置
int duration = mediaPlayer.getDuration();//获取影片总文件大小位置
if(duration > 0)
{
long pos = playerSeekBar.getMax() * position/duration;
playerSeekBar.setProgress((int)pos);
}
break;
default:
break;
}
};
};
public void pause()
{
if(mediaPlayer != null)
{
mediaPlayer.pause();
}
}
public void start()
{
if(mediaPlayer != null)
{
mediaPlayer.start();
}
}
public void stop()
{
if(mediaPlayer != null)
{
mediaPlayer.stop();
mediaPlayer.release();
mediaPlayer = null;
}
}
public void playPath(String path)
{
try
{
if(mediaPlayer != null)
{
mediaPlayer.reset();
mediaPlayer.setDataSource(path);//设置播放影片路径
mediaPlayer.prepare();//做播放影片前的准备
}
} catch (IllegalArgumentException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalStateException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height)
{
}
@Override
public void surfaceCreated(SurfaceHolder holder)
{
mediaPlayer = new MediaPlayer();
mediaPlayer.setDisplay(surfaceHolder);//mediaPlayer绑定surfaceHolder
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);//设置音频流类型
mediaPlayer.setOnBufferingUpdateListener(this);//监听网络变化
mediaPlayer.setOnPreparedListener(this);//监听影片是否ready OK
mediaPlayer.setOnCompletionListener(this);//监听影片是否播放完全
}
@Override
public void surfaceDestroyed(SurfaceHolder holder)
{
}
@Override
public void onPrepared(MediaPlayer mp)
{
//影片ready好后,通过mediaPlayer的长宽判断是否有影片
videoHeight = mediaPlayer.getVideoHeight();
videoWidth = mediaPlayer.getVideoWidth();
if(videoHeight != 0 && videoWidth != 0)
{
mp.start();//start播放视频
}
}
@Override
public void onCompletion(MediaPlayer mp)
{
//播放完影片后调用
}
@Override
public void onBufferingUpdate(MediaPlayer mp, int percent)
{
// TODO Auto-generated method stub
playerSeekBar.setSecondaryProgress(percent);//seekBar的二级进度条
}
}
android通过点击播放视频,Android通过MediaPlayer实现播放视频实例相关推荐
- android menu点击事件6,Android Menu
Android Menu 1.Android Menu(菜单)分为两种 选项菜单 OptionMenu 上下文菜单ContextMenu 2. 实现目录的基本操作 在xml文件中定义布局文件 重写on ...
- android selector点击修改颜色,Android Selector 按下修改背景和文本颜色的实现代码
1,selector 按下修改背景和文本颜色 [1]点击改变字体颜色 - android:state_pressed(按压状态) [2]selector状态选择器(bg_btn_two (存放 res ...
- android开发点击展开列表,android - listView点击展开收起实现
废话不多说, 上图: GIF.gif 上思路: 动态改变数据适配器中的getCount()方法的返回值; 点击刷新适配器中的数据; 注意: 1.这是在普通的布局中实现; 2.如需要在ScrollVie ...
- android item 点击 获取position,Android ListView 子控件onClick正确获取position的方法
在实际开发中,我们有时候不仅需要响应ListView的onItemClick,还需要响应其子控件的点击事件,这个时候我们就会 发现,由于复用等原因,如果直接在子控件的onClick事件中调用getVi ...
- android root点击事件,在Android中使用InputManagerService进行事件传递
在Android中使用InputManagerService进行事件传递 发布时间:2020-11-25 16:47:31 来源:亿速云 阅读:67 作者:Leah 在Android中使用InputM ...
- android模拟点击滑动,模拟Android的view点击和滑动监听
一,简单形式的 /*模拟Android中的view 点击和滑动监听 * */ public class View { private OnClickListener onClickListener; ...
- android 模拟点击第三方app,Android实现打开第三方app
前言 在android开发过程中,我们有时会涉及到在本应用中打开第三方应用的需求,那么这里我封装了一个工具类--AppHelper,用于实现获取本设备中app安装列表及在本应用中打开第三方应用的功能, ...
- android 模拟点击某点,Android后台模拟点击探索(附源码)
工作中我们需要自制一套工具,其中遇到需要模拟点击事件的需求,类似按键精灵的功能,支持后台持续运行,满足触发条件时完成点击. 经过一番探索,一共整理出两种不同的方案:AccessibilityServi ...
- android频繁点击ui崩溃,android easeui 集成 启动崩溃
android easeui 集成 启动崩溃 07-19 15:46:20.084 829-829/? E/WifiTrafficPoller: packet count Tx=9079 Rx=18 ...
- android模拟点击webview,的Android的WebView点击模拟
您可以使用HTTPGET得到的页面和httpPost当用户按下提交后的结果.您所要做的就是确保该文章能够传输网页期望的数据,并且使用它期望的格式. 检查需要什么的好方法是使用Firefox Live ...
最新文章
- wireshark tcp data中文_wireshark流量分析入门
- python解决鸡兔同笼问题
- 积极开展网络营销的AI换脸软件短短几日经历了从爆红到下架
- maven package 知识(转载)
- 百万数据报表:分析以及解决办法
- 改logback logstash-logback-encoder 框架本身的日志级别
- strlen函数_四种好用的PHP自定义加密函数(可逆/不可逆)
- 《深入理解 Spring Cloud 与微服务构建》第九章 熔断器 Hystrix
- [Angular 2] Transclusion in Angular 2
- QT拖动界面的鼠标事件
- win10计算机管理员权限删除,win10删除需管理员权限的文件最佳解决方法
- autoit3 自动安装QQ音乐【版本QQMusicV7.96.2062.0525】
- 常见的颜色搭配、衣裤搭配指南
- 如何成为前端开发工程师
- 移动电子商务:五个技术标准与Trustonic TEE解决方案【转】
- 钉钉/微信开放平台加解密(钉钉/微信加密解密) 钉钉/微信AES 加密解密
- Matplotlib保存图片到文件
- 白帽子-高端信息安全培训(攻防技术、渗透测试、安全产品、安全标准、风险评估、等级保护、项目实战)...
- 目标检测之R-CNN
- nssl 1488.上升子序列