Android学习笔记_25_多媒体之在线播放器
一、布局文件:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="#FFFFFF"
android:orientation="vertical" > <TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/filename" /> <EditText
android:id="@+id/filename"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="11.RMVB" /> <LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" > <ImageButton
android:id="@+id/play"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/play" /> <ImageButton
android:id="@+id/pause"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/pause" /> <ImageButton
android:id="@+id/reset"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/reset" /> <ImageButton
android:id="@+id/stop"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/stop" />
</LinearLayout> <SurfaceView
android:id="@+id/surfaceView"
android:layout_width="fill_parent"
android:layout_height="240dip" /> </LinearLayout>
二、代码实现:
package com.example.video; import java.io.File;
import java.io.FileInputStream;
import java.io.IOException; import android.R.integer;
import android.app.Activity;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnPreparedListener;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.Toast; public class MainActivity extends Activity {
private static final String TAG = "VideoActivity";
private EditText filenameText;
private SurfaceView surfaceView;
private MediaPlayer mediaPlayer;
private String filename;// 当前播放文件的名称
private int position;// 记录播放位置
private boolean pause=false;//是否被暂停
private File file; @Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); this.mediaPlayer = new MediaPlayer();
this.filenameText = (EditText) this.findViewById(R.id.filename);
this.surfaceView = (SurfaceView) this.findViewById(R.id.surfaceView);
ImageButton playButton = (ImageButton) this.findViewById(R.id.play);
ImageButton pauseButton = (ImageButton) this.findViewById(R.id.pause);
ImageButton resetButton = (ImageButton) this.findViewById(R.id.reset);
ImageButton stopButton = (ImageButton) this.findViewById(R.id.stop); ButtonClickListener listener = new ButtonClickListener();
playButton.setOnClickListener(listener);
pauseButton.setOnClickListener(listener);
resetButton.setOnClickListener(listener);
stopButton.setOnClickListener(listener); /* 下面设置Surface不维护自己的缓冲区,而是等待屏幕的渲染引擎将内容推送到用户面前 */
this.surfaceView.getHolder().setType(
SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
this.surfaceView.getHolder().setFixedSize(176, 144);// 设置分辨率
//让屏幕高亮,不要锁频
this.surfaceView.getHolder().setKeepScreenOn(true);
this.surfaceView.getHolder().addCallback(new SurfaceListener());
} private class ButtonClickListener implements View.OnClickListener {
@Override
public void onClick(View v) {
try {
switch (v.getId()) {
case R.id.play:// 来自播放按钮
filename = filenameText.getText().toString();
file=new File("/storage/sdcard0/Music",filename);
if (file.exists()) {
play(0);
}else {
Toast.makeText(getApplicationContext(), "文件不存在", Toast.LENGTH_LONG).show();
}
break; case R.id.pause:// 来自暂停按钮
if (mediaPlayer.isPlaying()) {
mediaPlayer.pause();
pause=true;
} else {
if (pause) {
mediaPlayer.start();
pause=false;
}
}
break; case R.id.reset:// 来自重新播放按钮
if (mediaPlayer.isPlaying()) {
mediaPlayer.seekTo(0);
}else {
if(file!=null){
play(0);
}
}
break;
case R.id.stop:// 来自停止按钮
if (mediaPlayer.isPlaying())
mediaPlayer.stop();
break;
}
} catch (Exception e) {
Log.e(TAG, e.toString());
}
}
} /**
* 播放视频
*/
private void play(int position) throws IOException {
mediaPlayer.reset();
//mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mediaPlayer.setDataSource(file.getAbsolutePath());// 设置需要播放的视频
mediaPlayer.setDisplay(surfaceView.getHolder());// 把视频画面输出到SurfaceView
mediaPlayer.prepare();//进行缓冲处理,完成之后播放
mediaPlayer.setOnPreparedListener(new PrepareListener(position)); }
private final class PrepareListener implements OnPreparedListener{
private int position;
public PrepareListener(int position) {
this.position=position;
} //当缓冲完成之后就会调用onPrepared方法
@Override
public void onPrepared(MediaPlayer mp) {
mediaPlayer.start();//播放
if (position>0) {
mediaPlayer.seekTo(position);
}
}
} private class SurfaceListener implements SurfaceHolder.Callback {
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
} //当画面再次回到前台时调用
@Override
public void surfaceCreated(SurfaceHolder holder) {// 方法在onResume()后被调用
Log.i(TAG, "surfaceCreated()");
if (position > 0 && filename != null) {
try {
play(position);
position = 0;
} catch (Exception e) {
Log.e(TAG, e.toString());
}
}
} @Override
public void surfaceDestroyed(SurfaceHolder holder) {
if (mediaPlayer.isPlaying()) {
position = mediaPlayer.getCurrentPosition();// 得到播放位置
mediaPlayer.stop();
}
Log.i(TAG, "surfaceDestroyed()");
}
} @Override
protected void onDestroy() {
if (mediaPlayer.isPlaying())
mediaPlayer.stop();
mediaPlayer.release();
super.onDestroy();
} @Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
} }
Android学习笔记_25_多媒体之在线播放器的更多相关文章
- Android学习笔记_24_多媒体MediaPlayer对象之音乐播放器与SoundPool声音池
一.MediaPlayer对象常用方法介绍: MediaPlayer mediaPlayer = new MediaPlayer(); if (mediaPlayer.isPlaying()) { m ...
- Android学习笔记进阶十一图片动画播放(AnimationDrawable)
大家平时见到的最多的可能就是Frame动画了,Android中当然也少不了它.它的使用更加简单,只需要创建一个 AnimationDrawabledF对象来表示Frame动画,然后通过addFrame ...
- Android学习笔记_27_多媒体之视频刻录
一.配置文件: <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android= ...
- Android学习笔记_26_多媒体之拍照
一.配置文件: 需要引入摄像头权限,sdcard读写权限. <?xml version="1.0" encoding="utf-8"?> <m ...
- JS学习笔记(6)--音乐播放器
说明(2017.3.15): 1. lrc.js里面存储LRC歌词的格式的数组,获取里面的时间轴,转为秒数. 2. 通过audio.currentTime属性,setinterval每秒获取歌曲播放的 ...
- udacity android 学习笔记: lesson 4 part b
udacity android 学习笔记: lesson 4 part b 作者:干货店打杂的 /titer1 /Archimedes 出处:https://code.csdn.net/titer1 ...
- 【转】 Pro Android学习笔记(七七):服务(2):Local Service
目录(?)[-] Local service代码 调用Local ServiceLocal Service client代码 AndroidManifestxml定义Serviceacitivty的l ...
- 【转】 Pro Android学习笔记(二九):用户界面和控制(17):include和merge
目录(?)[-] xml控件代码重用include xml控件代码重用merge 横屏和竖屏landsacpe portrait xml控件代码重用:include 如果我们定义一个控件,需要在不同的 ...
- Android 学习笔记之Volley(七)实现Json数据加载和解析...
学习内容: 1.使用Volley实现异步加载Json数据... Volley的第二大请求就是通过发送请求异步实现Json数据信息的加载,加载Json数据有两种方式,一种是通过获取Json对象,然后 ...
随机推荐
- 九度oj题目1027:欧拉回路
题目1027:欧拉回路 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:2844 解决:1432 题目描述: 欧拉回路是指不令笔离开纸面,可画过图中每条边仅一次,且可以回到起点的一条 ...
- mysql存储过程嵌套循环并分页处理数据
业务背景:公司存证产品升级,随着数据量的增加,存证产品线按业务分表,导致以往的存证关联数据需要做数据同步更新.版本发布前,通过当前存储过程解决数据升级问题. ##创建存证文档关联情况下更新所用存储过程 ...
- Class.forName和ClassLoader的区别
一 看名字就知道了,一个是类的创建,一个类加载器 二 再看下Class.forName源码,调用了ClassLoader @CallerSensitive public static Class< ...
- (三)TestNG
1.testNG的部分注解 test测试方法都是执行顺序:并不是从上往下执行的,而是根据方法名ASCII码进行执行的,小的先执行 比如a比b先执行,1比2先执行,不管代码放的顺序是怎么样. impor ...
- Java线程中断的本质深入理解
Java的中断是一种协作机制.也就是说调用线程对象的interrupt方法并不一定就中断了正在运行的线程,它只是要求线程自己在合适的时机中断自己. 一.Java中断的现象 首先,看看Thread类里的 ...
- ubuntu 下查找某个文件的方法
1.whereis 文件名 特点:快速,但是是模糊查找,例如 找 #whereis mysql 它会把mysql,mysql.ini,mysql.*所在的目录都找出来. 2.find / -name ...
- 多结果集IMultipleResult接口
在某些任务中,需要执行多条sql语句,这样一次会返回多个结果集,在应用程序就需要处理多个结果集,在OLEDB中支持多结果集的接口是IMultipleResult. 查询数据源是否支持多结果集 并不是所 ...
- iDempiere 视频教程下载
Created by 蓝色布鲁斯,QQ32876341,blog http://www.cnblogs.com/zzyan/ iDempiere官方中文wiki主页 http://wiki.idemp ...
- Mysql 服务无法启动解决办法
1.我使用的是MySQL-5.7.10-winx64 版本,在安装后启动服务时出现 “服务无法启动”错误 2.解决办法为删除安装目录中的data文件,然后打开cmd调到自己的安装目录下输入mysqld ...
- sql server性能分析--执行sql次数和逻辑次数
目前在做一个项目优化时,想通过数据库层分析sql server系统性能,查了一下网上代码,修改了一下标题和DMVs代码,以下代码可以用来分析系统运行一段时间后,那些语句是系统忙的sql语句.做为参考. ...