最进想通过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实现播放视频实例相关推荐

  1. android menu点击事件6,Android Menu

    Android Menu 1.Android Menu(菜单)分为两种 选项菜单 OptionMenu 上下文菜单ContextMenu 2. 实现目录的基本操作 在xml文件中定义布局文件 重写on ...

  2. android selector点击修改颜色,Android Selector 按下修改背景和文本颜色的实现代码

    1,selector 按下修改背景和文本颜色 [1]点击改变字体颜色 - android:state_pressed(按压状态) [2]selector状态选择器(bg_btn_two (存放 res ...

  3. android开发点击展开列表,android - listView点击展开收起实现

    废话不多说, 上图: GIF.gif 上思路: 动态改变数据适配器中的getCount()方法的返回值; 点击刷新适配器中的数据; 注意: 1.这是在普通的布局中实现; 2.如需要在ScrollVie ...

  4. android item 点击 获取position,Android ListView 子控件onClick正确获取position的方法

    在实际开发中,我们有时候不仅需要响应ListView的onItemClick,还需要响应其子控件的点击事件,这个时候我们就会 发现,由于复用等原因,如果直接在子控件的onClick事件中调用getVi ...

  5. android root点击事件,在Android中使用InputManagerService进行事件传递

    在Android中使用InputManagerService进行事件传递 发布时间:2020-11-25 16:47:31 来源:亿速云 阅读:67 作者:Leah 在Android中使用InputM ...

  6. android模拟点击滑动,模拟Android的view点击和滑动监听

    一,简单形式的 /*模拟Android中的view 点击和滑动监听 * */ public class View { private OnClickListener onClickListener; ...

  7. android 模拟点击第三方app,Android实现打开第三方app

    前言 在android开发过程中,我们有时会涉及到在本应用中打开第三方应用的需求,那么这里我封装了一个工具类--AppHelper,用于实现获取本设备中app安装列表及在本应用中打开第三方应用的功能, ...

  8. android 模拟点击某点,Android后台模拟点击探索(附源码)

    工作中我们需要自制一套工具,其中遇到需要模拟点击事件的需求,类似按键精灵的功能,支持后台持续运行,满足触发条件时完成点击. 经过一番探索,一共整理出两种不同的方案:AccessibilityServi ...

  9. android频繁点击ui崩溃,android easeui 集成 启动崩溃

    android easeui 集成 启动崩溃 07-19 15:46:20.084 829-829/? E/WifiTrafficPoller:  packet count Tx=9079 Rx=18 ...

  10. android模拟点击webview,的Android的WebView点击模拟

    您可以使用HTTPGET得到的页面和httpPost当用户按下提交后的结果.您所要做的就是确保该文章能够传输网页期望的数据,并且使用它期望的格式. 检查需要什么的好方法是使用Firefox Live ...

最新文章

  1. wireshark tcp data中文_wireshark流量分析入门
  2. python解决鸡兔同笼问题
  3. 积极开展网络营销的AI换脸软件短短几日经历了从爆红到下架
  4. maven package 知识(转载)
  5. 百万数据报表:分析以及解决办法
  6. 改logback logstash-logback-encoder 框架本身的日志级别
  7. strlen函数_四种好用的PHP自定义加密函数(可逆/不可逆)
  8. 《深入理解 Spring Cloud 与微服务构建》第九章 熔断器 Hystrix
  9. [Angular 2] Transclusion in Angular 2
  10. QT拖动界面的鼠标事件
  11. win10计算机管理员权限删除,win10删除需管理员权限的文件最佳解决方法
  12. autoit3 自动安装QQ音乐【版本QQMusicV7.96.2062.0525】
  13. 常见的颜色搭配、衣裤搭配指南
  14. 如何成为前端开发工程师
  15. 移动电子商务:五个技术标准与Trustonic TEE解决方案【转】
  16. 钉钉/微信开放平台加解密(钉钉/微信加密解密) 钉钉/微信AES 加密解密
  17. Matplotlib保存图片到文件
  18. 白帽子-高端信息安全培训(攻防技术、渗透测试、安全产品、安全标准、风险评估、等级保护、项目实战)...
  19. 目标检测之R-CNN
  20. nssl 1488.上升子序列

热门文章

  1. Active Directory的安装
  2. 2014.10.18笔记
  3. Office365—Exchange管理4—通讯组和安全组
  4. 支持Flash和JavaScript的图表控件FusionWidgets
  5. Linux下的 API Hook
  6. 来点硬件知识吧,今天求职吃亏了!
  7. [2017-10-26]Abp系列——DTO入参验证使用方法及经验分享
  8. Redis 存储SQL表格 方法
  9. 建造者模式Builder
  10. Python基础-程序控制结构