我们知道android本身播放视频的的能力是有限的。。先来一个Demo

另附我的一个还未成熟的播放器,下载地址:http://www.eoemarket.com/soft/370334.html,正在完善中

package cn.marsXTU.mediaplayer;

import android.media.AudioManager;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnCompletionListener;
import android.os.Bundle;
import android.os.SystemClock;
import android.view.Surface;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.widget.EditText;
import android.widget.SeekBar;
import android.widget.Toast;
import android.widget.SeekBar.OnSeekBarChangeListener;
import android.widget.TextView;
import android.app.Activity;

/**
 * 1.确保在音乐能播放的情况下,进行功能增强
 * @author hjl
 *
 */
public class MainActivity extends Activity implements OnSeekBarChangeListener, OnCompletionListener {

	private boolean isStopUpdatingProgress=false;
	private EditText etPath;
	private MediaPlayer mMediapPlayer;
	private SeekBar mSeekbar;
	private TextView tvCurrentTime;
	private TextView tvTotalTime;

	private final int NORMAL=0;//闲置
	private final int PLAYING=1;//播放中
	private final int PAUSING=2;//暂停
	private final int STOPING=3;//停止中

	private  int currentstate=NORMAL;//播放器当前的状态,默认是空闲状态

	//用行动打消忧虑
	private SurfaceHolder holder;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		etPath=(EditText)findViewById(R.id.et_path);
		mSeekbar=(SeekBar) findViewById(R.id.sb_progress);
		tvCurrentTime=(TextView)findViewById(R.id.tv_current_time);
		tvTotalTime=(TextView)findViewById(R.id.tv_total_time);

		mSeekbar.setOnSeekBarChangeListener(this);

		SurfaceView mSurfaceView=(SurfaceView) findViewById(R.id.surfaceview);
		holder=mSurfaceView.getHolder();//SurfaceView帮助类对象

		//是采用自己内部的双缓冲区,而是等待别人推送数据

		holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

	}

	/**
	 * 开始
	 * @param v
	 */
	public void start(View v){
		if(mMediapPlayer!=null){
			if(currentstate!=PAUSING){
				mMediapPlayer.start();
				currentstate=PLAYING;
				isStopUpdatingProgress=false;//每次在调用刷新线程时,都要设为false
				return ;
				//下面这个判断完美的解决了停止后重新播放的,释放两个资源的问题
			}else if(currentstate==STOPING){
				mMediapPlayer.reset();
				mMediapPlayer.release();
			}
		}
		play();

	}
	/**
	 * 停止
	 * @param v
	 */
	public void stop(View v){
		if(mMediapPlayer!=null){
			mMediapPlayer.stop();
		}
	}

	/**
	 * 播放输入框的文件
	 */
	private void play(){
		String path=etPath.getText().toString().trim();
		mMediapPlayer=new MediaPlayer();
		try {
			//设置数据类型
			mMediapPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
			//设置以下播放器显示的位置
			mMediapPlayer.setDisplay(holder);

			mMediapPlayer.setDataSource(path);
			mMediapPlayer.prepare();
			mMediapPlayer.start();

			mMediapPlayer .setOnCompletionListener(this);
			//把当前播放器的状诚置为:播放中
			currentstate=PLAYING;

			//把音乐文件的总长度取出来,设置给seekbar作为最大值
			int duration=mMediapPlayer.getDuration();//总时长
			mSeekbar.setMax(duration);
			//把总时间显示textView上
			int m=duration/1000/60;
			int s=duration/1000%60;
			tvTotalTime.setText("/"+m+":"+s);
			tvCurrentTime.setText("00:00");

			isStopUpdatingProgress=false;
			new Thread(new UpdateProgressRunnable()).start();

		}catch(Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * 暂停
	 * @param v
	 */
	public void pause(View v){
		if(mMediapPlayer!=null&¤tstate==PLAYING){

			mMediapPlayer.pause();
			currentstate=PAUSING;
			isStopUpdatingProgress=true;//停止刷新主线程
		}
	}

	/**
	 * 重播
	 * @param v
	 */
	public void restart(View v){
		if(mMediapPlayer!=null){
			mMediapPlayer.reset();
			mMediapPlayer.release();
			play();
		}
	}

	@Override
	public void onProgressChanged(SeekBar seekBar, int progress,
			boolean fromUser) {

	}

	@Override
	public void onStartTrackingTouch(SeekBar seekBar) {
		isStopUpdatingProgress=true;//当开始拖动时,那么就开始停止刷新线程
	}

	@Override
	public void onStopTrackingTouch(SeekBar seekBar) {
		int progress=seekBar.getProgress();
		//播放器切换到指定的进度位置上
		mMediapPlayer.seekTo(progress);
		isStopUpdatingProgress=false;
		new Thread(new UpdateProgressRunnable()).start();
	}

	/**
	 * 当播放完成时回调此方法
	 */
	@Override
	public void onCompletion(MediaPlayer mp) {
	    Toast.makeText(this, "播放完了,重新再播放", 0).show();
	    mp.start();

	}

	/**
	 * 刷新进度和时间的任务
	 * @author hjl
	 *
	 */
	class  UpdateProgressRunnable implements Runnable{

		@Override
		public void run() {
			//每隔1秒钟取一下当前正在播放的进度,设置给seekbar
			while(!isStopUpdatingProgress){
				//得到当前进度
				int currentPosition=mMediapPlayer.getCurrentPosition();
				mSeekbar.setProgress(currentPosition);
				final int m=currentPosition/1000/60;
				final int s=currentPosition/1000%60;

				//此方法给定的runable对象,会执行主线程(UI线程中)
				runOnUiThread(new Runnable(){

					@Override
					public void run() {
						tvCurrentTime.setText(m+":"+s);

					}

				});
				SystemClock.sleep(1000);
			}

		}

	}

}

使用Mediaplay类写一个播放器的更多相关文章

  1. 使用AVPlayer制作一个播放器

    代码地址如下:http://www.demodashi.com/demo/11685.html AVPlayer 是一个强大的视频播放器,可以播放多种格式的视频,缺点是没有控制界面,需要自己去实现. ...

  2. 业余写的一个播放器SDK,求点意见

    好久没写博客了 现大致花了半年时间私下写一个音频SDK,想请csdn的达人提点意见,看看还需要增加哪些功能 我对这个的定位如下: 可以在游戏开发中播放音乐,作为一般的音频播放器后端,作为音频编辑器后端 ...

  3. 使用VideoView自定义一个播放器控件

    介绍 最近要使用播放器做一个简单的视频播放功能,开始学习VideoView,在横竖屏切换的时候碰到了点麻烦,不过在查阅资料后总算是解决了.在写VideoView播放视频时候定义控制的代码全写在Actv ...

  4. 【C++】从零开始,只使用FFmpeg,Win32 API,实现一个播放器(一)

    前言 起初只是想做一个直接读取视频文件然后播放字符动画的程序.我的设想很简单,只要有现成的库,帮我把视频文件解析成一帧一帧的原始画面信息,那么我只需要读取里面的每一个像素的RGB数值,计算出亮度,然后 ...

  5. 微信小程序 写音乐播放器 slider组件 将value设置为0 真机测试滑块不能回到起点

    最近在用微信小程序写一个音频播放页面,做时间进度的时候用到了slider插件,但是在自然播放完成,或者上/下切换的时候,将slider的value属性值设为0,开发工具上滑块会回到起点,有效.但是真机 ...

  6. 我的Java开发学习之旅------>工具类:将播放器的进度值转换成相应的时间格式

    在我的博客<我的Java开发学习之旅------>Java 格式化类(java.util.Formatter)基本用法,地址:http://blog.csdn.net/ouyang_pen ...

  7. 慕课网electron写音乐播放器教程,代码跟随教程变动(十)

    添加播放状态,首先是歌曲名称和时间 在index.html中添加 <div class="container fixed-bottom bg-white pb-4"> ...

  8. Arava: 用 swing 写一个取色器

    备哥以前发我了一个小工具,TakeColor 取色器.来复刻一个吧. 分析一下:顶部是菜单,左侧框显示当前鼠标所在的颜色(下面显示当前坐标和颜色值,默认RGB),中间框显示鼠标周围区域,右侧显示取色的 ...

  9. 手写一个类加载器demo

    1.什么是类加载器? 2.加载方式 ClassLoader类加载器,主要的作用是将class文件加载到jvm虚拟机中.jvm启动的时候,并不是一次性加载所有的类,而是根据需要动态去加载类,主要分为隐式 ...

随机推荐

  1. css文本强制一行 字间距

    white-space:nowrap 在一行 .slideLastlyNews img{margin-left:9px;margin-right:5px;margin-top:6px;width:5p ...

  2. C# WMI 远程PC(开机、关机、重启)

    啥也不多说,直接上码: //远程重启方法 public static bool Shutdown(ManagementScope scope) { ObjectQuery query=new Obje ...

  3. C++ 实现俄罗斯方块

    C++ 实现俄罗斯方块 一.实验介绍 1.1 实验内容 本节实验我们进行设计俄罗斯方块前的思路分析,以及介绍ncurses 库的使用方法. 1.2 实验知识点 C++ 编程基础 ncurses 库的使 ...

  4. 最小费用最大流(luogu P3381 【模板】最小费用最大流)

    题目链接 题目描述 如题,给出一个网络图,以及其源点和汇点,每条边已知其最大流量和单位流量费用,求出其网络最大流和在最大流情况下的最小费用. 输入输出格式 输入格式: 第一行包含四个正整数N.M.S. ...

  5. Android Design Support Library使用详解——TextInputLayout与TextInputEditText

    TextInputLayout 在谷歌的Material Design中,文本输入是这样表现的:当用户点击输入框想要输入文字时,如果输入框是空的,那么它的提示文字(hint)就会变小并且同时移动到输入 ...

  6. ejabberd开发和部署

    ejabberd开发和部署 (金庆的专栏 2016.10) 搭建了自己的ejabberd集群,然后少量更改源码,实现定制的XMPP服务器. 从github fork ejabberd 库,定为 mas ...

  7. 解决HTML外部引用CSS文件不生效问题

    作为一个前端小白,鼓捣了几天前端..今天突然发现我深信不疑的东西,竟然出现了问题..就比如我在css目录下面写了一个css样式文档:style.css.这时里面只有一句话: body { backgr ...

  8. STATE(状态)模式

    引子 场景 在我们软件开发的过程中,有许多对象是有状态的.而对象的行为会随着状态的改变而发生改变.例如开发一个电梯类,电梯有开门.关门.停止.运行等行为,同时电梯也会有开门状态.关门状态.停止状态.运 ...

  9. Android程序员必须掌握的知识点-多进程和多线程

    当某个应用组件启动且该应用没有运行其他任何组件时,Android 系统会使用单个执行线程为应用启动新的 Linux 进程.默认情况下,同一应用的所有组件在相同的进程和线程(称为"主" ...

  10. Tomcat怎么实现异步Servlet

    有时Servlet在生成响应报文前必须等待某些耗时的操作,比如在等待一个可用的JDBC连接或等待一个远程Web服务的响应.对于这种情况servlet规范中定义了异步处理方式,由于Servlet中等待阻 ...