1:视频播放器
使用VideoView、SurfaceView播放视频,它俩的区别在于:VideoView播放视频我们不需要去写播放按钮控件和进度条控件,你只要写一个VideoView控件就可以了,它自带得有播放控件以及暂停控件还有进度条控件,并且它还自己会计算时间就不需要我们再去计算时间了。SurfaceView播放视频则需要我们去写播放控件以及进度条还需要自己去计算时间。如果你不是专门需要视频播放器的话我建议用VideoView,因为它用起来比较方便,不需要过多复杂的过程,但是如果你是需要去做专门的视频播放器的话还是SurfaceView比较好,因为它可以自己去布置自己需要布局。下面我们就来实践
SurfaceView:
xml布局
<SeekBar
public class MainActivity extends AppCompatActivity { private SurfaceView sv_main_surfaceview; private SeekBar sb_main_seekbar_surfaceview; private ImageButton ib_main_imagebutton_surfaceview; private MediaPlayer mediaPlayer; private File[] files; private File file; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); getControl(); //判断内存卡是否可用 if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){ //获取内存卡路径 String sdpath=Environment.getExternalStorageDirectory().getAbsolutePath(); file = new File(sdpath+"/Movies/"); files = file.listFiles(); } //seecbar滑动事件 sb_main_seekbar_surfaceview.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { @Override public void onProgressChanged(SeekBar seekBar, int i, boolean b) { } @Override public void onStartTrackingTouch(SeekBar seekBar) { } @Override public void onStopTrackingTouch(SeekBar seekBar) { //设置滑动位置 mediaPlayer.seekTo(seekBar.getProgress()); } }); } private void getControl() { //获取surfaceview控件 sv_main_surfaceview = (SurfaceView) findViewById(R.id.sv_main_surfaceview); //获取seekbar控件 sb_main_seekbar_surfaceview = (SeekBar) findViewById(R.id.sb_main_seekbar_surfaceview); //获取imagebutton控件 ib_main_imagebutton_surfaceview = (ImageButton) findViewById(R.id.ib_main_imagebutton_surfaceview); } //imagebutton点击事件 public void videoplay(View view){ if (mediaPlayer==null) { //创建媒体 mediaPlayer = new MediaPlayer(); try { //指定播放源 // mediaPlayer.setDataSource(this, Uri.parse(file.getAbsolutePath())); mediaPlayer.setDataSource(this,Uri.parse("file://mnt/sdcard/Movies/1505736258614.mp4")); //准备 mediaPlayer.prepare(); } catch (IOException e) { e.printStackTrace(); } //开始 mediaPlayer.start(); //将画面放在surfaceview mediaPlayer.setDisplay(sv_main_surfaceview.getHolder()); //改变图片 ib_main_imagebutton_surfaceview.setImageResource(android.R.drawable.ic_media_pause); //获取视频时间 int long_time = mediaPlayer.getDuration(); Toast.makeText(this, ""+long_time, Toast.LENGTH_SHORT).show(); //给seekbar设置时间 sb_main_seekbar_surfaceview.setMax(long_time); //调用线程 new MyThread().start(); }else if (mediaPlayer.isPlaying()){ //暂停 mediaPlayer.pause(); //改变按钮图片 ib_main_imagebutton_surfaceview.setImageResource(android.R.drawable.ic_media_play); }else{ //开始 mediaPlayer.start(); //改变图片 ib_main_imagebutton_surfaceview.setImageResource(android.R.drawable.ic_media_pause); } } //耗时线程 class MyThread extends Thread{ @Override public void run() { super.run(); while(sb_main_seekbar_surfaceview.getProgress()<sb_main_seekbar_surfaceview.getMax()){ //获取当前播放位置 int current_time=mediaPlayer.getCurrentPosition(); sb_main_seekbar_surfaceview.setProgress(current_time); } } }android :layout_width= "match_parent" android :layout_height= "wrap_content" android :id= "@+id/sb_main_seekbar_surfaceview" /> < ImageButton android :layout_width= "wrap_content" android :layout_height= "wrap_content" android :src= "@android:drawable/ic_media_play" android :onClick= "videoplay" android :id= "@+id/ib_main_imagebutton_surfaceview" /> < SurfaceView android :layout_width= "356dp" android :layout_height= "380dp" android :id= "@+id/sv_main_surfaceview" />
activity实现业务方法
public class MainActivity extends AppCompatActivity { private SurfaceView sv_main_surfaceview; private SeekBar sb_main_seekbar_surfaceview; private ImageButton ib_main_imagebutton_surfaceview; private MediaPlayer mediaPlayer; private File[] files; private File file; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); getControl(); //获取控件
//seecbar滑动事件 sb_main_seekbar_surfaceview.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { @Override public void onProgressChanged(SeekBar seekBar, int i, boolean b) { } @Override public void onStartTrackingTouch(SeekBar seekBar) { } @Override public void onStopTrackingTouch(SeekBar seekBar) { //设置滑动位置 mediaPlayer.seekTo(seekBar.getProgress()); } }); } private void getControl() { //获取surfaceview控件 sv_main_surfaceview = (SurfaceView) findViewById(R.id.sv_main_surfaceview); //获取seekbar控件 sb_main_seekbar_surfaceview = (SeekBar) findViewById(R.id.sb_main_seekbar_surfaceview); //获取imagebutton控件 ib_main_imagebutton_surfaceview = (ImageButton) findViewById(R.id.ib_main_imagebutton_surfaceview); } //imagebutton点击事件 public void videoplay(View view){ if (mediaPlayer==null) { //创建媒体 mediaPlayer = new MediaPlayer(); try { //指定播放源 mediaPlayer.setDataSource(this,Uri.parse("file://mnt/sdcard/Movies/1505736258614.mp4")); //准备 mediaPlayer.prepare(); } catch (IOException e) { e.printStackTrace(); } //开始 mediaPlayer.start(); //将画面放在surfaceview mediaPlayer.setDisplay(sv_main_surfaceview.getHolder()); //改变图片 ib_main_imagebutton_surfaceview.setImageResource(android.R.drawable.ic_media_pause); //获取视频时间 int long_time = mediaPlayer.getDuration(); Toast.makeText(this, ""+long_time, Toast.LENGTH_SHORT).show(); //给seekbar设置时间 sb_main_seekbar_surfaceview.setMax(long_time); //调用线程 new MyThread().start(); }else if (mediaPlayer.isPlaying()){ //暂停 mediaPlayer.pause(); //改变按钮图片 ib_main_imagebutton_surfaceview.setImageResource(android.R.drawable.ic_media_play); }else{ //开始 mediaPlayer.start(); //改变图片 ib_main_imagebutton_surfaceview.setImageResource(android.R.drawable.ic_media_pause); } } //耗时线程 class MyThread extends Thread{ @Override public void run() { super.run(); while(sb_main_seekbar_surfaceview.getProgress()<sb_main_seekbar_surfaceview.getMax()){ //获取当前播放位置 int current_time=mediaPlayer.getCurrentPosition(); sb_main_seekbar_surfaceview.setProgress(current_time); } } }
}
权限:<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
VideoView:
xml布局
<VideoView android:layout_width="356dp" android:layout_height="380dp" android:id="@+id/vv_main_videoview" />
activity业务方法
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_viedio); vv_main_videoview = (VideoView) findViewById(R.id.vv_main_videoview); //设置视频来源 vv_main_videoview.setVideoURI(Uri.parse("file://mnt/sdcard/Movies/1505736258614.mp4")); //实例化媒体控制器 MediaController mediaController=new MediaController(this); mediaController.setMediaPlayer(vv_main_videoview); vv_main_videoview.setMediaController(mediaController); }
}
1:拍照
实现拍照技术有几种方法,你可以调用自己手机上的照相机,一点击拍照就让它进入到你的相机里面,还一种就是把拍照画面转入到你的布局页面。
下面我们就来实现将画面出现在布局中。
拍照实现步骤: <1>界面使用SurfaceView控件,显示照相机的画面 <2>SurfaceView接受摄像头界面变化的信息 surfaceView.getHolder().addCallback() <3>重写三个方法 surfaceDestroyed--->当预览界面关闭时,触发 一般在这里执行销毁照相机的操作,释放内存 camera.stopPreview(); camera.release(); camera = null; surfaceCreated----->预览界面被创建时,调用 一般在这里打开照相机和设置照相机的一些参数 // 打开摄像头 camera = Camera.open(); // 给摄像头设置参数 Parameters parameters = camera.getParameters(); // 设置每秒3栈 parameters.setPreviewFrameRate(3); // 设置照片的输出格式 parameters.setPictureFormat(PixelFormat.JPEG); // 设置照片的质量 parameters.set("jpeg-quality", 85); // 给照相机设置参数 camera.setParameters(parameters); //将摄像头的画面显示到SurfaceView控件上 camera.setPreviewDisplay(sv_main_camera.getHolder()); // 开始预览 camera.startPreview(); surfaceChanged----->当预览界面的格式和大小发生改变时,触发 <4>保存 camera.takePicture 将照片保存到内存卡(压缩)
布局:
<SurfaceView android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/sv_mian_view" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="camera" android:text="拍照" />
activity:
public class CameraActivity extends AppCompatActivity { private SurfaceView sv_mian_view; private Camera camera; private FileOutputStream fileOutputStream; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_camera); sv_mian_view = (SurfaceView) findViewById(R.id.sv_mian_view); sv_mian_view.getHolder().addCallback(new SurfaceHolder.Callback() { @Override public void surfaceCreated(SurfaceHolder surfaceHolder) { //打开摄像头 camera = Camera.open(); //给摄像头设置参数 Camera.Parameters parameters = camera.getParameters(); //设置图片格式 parameters.setPictureFormat(PixelFormat.JPEG); //设置图片质量 parameters.set("jpeg-quality",85); camera.setParameters(parameters); //将摄像头画面转到surfaceview try { camera.setPreviewDisplay(sv_mian_view.getHolder()); camera.startPreview(); } catch (IOException e) { e.printStackTrace(); } } @Override public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i1, int i2) { } @Override public void surfaceDestroyed(SurfaceHolder surfaceHolder) { if(camera!=null){ camera.stopPreview(); camera.release(); camera=null; } } }); } public void camera(View view){ camera.takePicture(null, null, new Camera.PictureCallback() { @Override public void onPictureTaken(byte[] bytes, Camera camera) { Bitmap bitmap=BitmapFactory.decodeByteArray(bytes,0,bytes.length); try { fileOutputStream = new FileOutputStream("/mnt/sdcard/Pictures/Screenshots/G160828"+System.currentTimeMillis()+".jpg"); //压缩技术 bitmap.compress(Bitmap.CompressFormat.JPEG,85,fileOutputStream); camera.stopPreview(); camera.startPreview(); } catch (FileNotFoundException e) { e.printStackTrace(); } } }); }}
权限:<uses-permission android:name="android.permission.CAMERA" />
3:视频录像
实现步骤: <1>将视频动画显示到SurfaceView控件上 <2>使用MediaRecorder类进行视频的录制 常用的方法: mediaRecorder.reset(); mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); //从照相机采集视频 mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); mediaRecorder.setVideoFrameRate(3); //每秒3帧 mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H263); //设置视频编码方式 mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); File videoFile = new File(Environment.getExternalStorageDirectory(), System.currentTimeMillis()+".3gp"); mediaRecorder.setOutputFile(videoFile.getAbsolutePath()); mediaRecorder.setPreviewDisplay(surfaceView.getHolder().getSurface()); mediaRecorder.prepare();//预期准备 mediaRecorder.start();//开始刻录 mediaRecorder.stop();//停止刻录
权限 <uses-permission android:name="android.permission.RECORD_AUDIO"/>
本文详细介绍如何在Android应用中实现视频播放与录制功能,包括使用VideoView和SurfaceView播放视频的具体实现方法,以及通过Camera和MediaRecorder进行拍照与录像的技术要点。
1143

被折叠的 条评论
为什么被折叠?



