找过好过视频播放器的例子,但是都特么给一半代码,不给一半代码!
还有的
我也是醉了!把自己以前的笔记发一下吧,
虽然有缺陷:
1,横屏切换的时候,线程会死掉,不能激活... (已经搞定了!谢谢各位dalao!)
2,停止的时候,线程释放了资源,但是还是有一张图片在
3,待机状态,还有有声音播放的。
现在还没有解决,希望公布代码后,有人提出改进建议...
暂时实现了:
1,进度条绑定播放器的进度
2,三个按钮:播放,暂停,停止
3,视频从SD卡读取,就在根目录,当前是hand.mp4(其他格式嘛?应该不支持吧....)
4、切换屏幕的时候,仍然可以播放,线程没有死掉!播放也继续进度!
这是布局:
播放:
暂停:
1、TestVedioActivity.java
package com.open_open.android_ch14_2;
import android.app.Activity;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.os.Environment;
import android.os.SystemClock;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.widget.Button;
import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener;
/* 视频播放器 素材:1280x 720 ,来自sd卡
Surface:原始图形缓冲区,
Surface是管理显示内容的数据,储存数据的交换
*/
public class TestVedioActivity extends Activity {
private SurfaceView sfview; //在Surface的基础上,显示视频
private SurfaceHolder holder; //在Surface的基础上,控制尺寸大小和格式
private SeekBar sb; //进度条
private MediaPlayer mp; //媒体播放器
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test_vedio);
sb=(SeekBar)findViewById(R.id.sb);
sfview=(SurfaceView)findViewById(R.id.sfView);
holder=sfview.getHolder();
sb.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
if(mp!=null)
mp.seekTo(seekBar.getProgress());
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
}
});
}
public void doPlay(View view){
if(mp!=null)
return;
mp=new MediaPlayer();
String path=Environment.getExternalStorageDirectory().getAbsolutePath()+"/hand.mp4";
try {
mp.setDataSource(path);
mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
mp.setDisplay(holder);
mp.prepare();
sb.setMax(mp.getDuration());
mp.start();
//控制进度条
new Thread(new Runnable() {
@Override
public void run() {
while(mp.getCurrentPosition()<=sb.getMax()){
sb.setProgress(mp.getCurrentPosition());//设置进度条当前进度
SystemClock.sleep(200);
}
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
public void doPause(View view){
if(mp!=null&&mp.isPlaying()){
mp.pause();//暂停
((Button)view).setText("继续播放");
}else if(mp!=null&&mp.isPlaying()==false){
mp.start();//播放
((Button)view).setText("暂停");
}
}
public void doStop(View view){
if(mp!=null){
sb.setProgress(0);
mp.stop();
mp.release();
mp=null;
}
}
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<SeekBar
android:id="@+id/sb"
android:layout_width="match_parent"
android:layout_height="wrap_content"
/>
<LinearLayout android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="播放"
android:onClick="doPlay"
/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="暂停"
android:onClick="doPause"
/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="停止"
android:onClick="doStop"
/>
</LinearLayout>
<SurfaceView
android:id="@+id/sfView"
android:layout_width="match_parent"
android:layout_height="300sp"
/>
</LinearLayout>
3、Android Manifest.xml 权限开启:
<! - 权限开启:增加文件卸载,允许写入SD卡,允许打开摄像头,允许录音 - >
<uses-permission android :name = “android.permission.MOUNT_UNMOUNT_FILESYSTEMS” /> <uses-permission android :name = “android.permission.WRITE_EXTERNAL_STORAGE” /> <uses-permission android :name = “android.permission.CAMERA” / > <uses-permission android :name = “android.permission.RECORD_AUDIO” />
TestVedioActivity :这里的四个 属性,让切换屏幕的时候线程没有死掉!
<activity android:name=".TestVedioActivity" android:configChanges="orientation|screenLayout|keyboardHidden|screenSize"/>
要是有所改进,我会发第二篇 改进的博客的。