Android 通过VideoView+MediaPlayer实现视频播放
2017-02-16 11:23
1201 查看
现实视频播放有两种方法,第一种是利用了VideoView来实现的,第二种是MediaPlayer和SurfaceView实现。
第一种方法
运行效果如下:
在清单文件(AndroidManifest.xml)要加入读取内存卡的权限
布局文件 action_local_video.xml
Java代码(LocalVideoActivity)
第二种方法
运行效果如下:
Java代码(SurefaceViewActivity)
布局文件(activity_sureface_view.xml)
清单文件配置读取内存卡权限即可:
第一种方法
运行效果如下:
在清单文件(AndroidManifest.xml)要加入读取内存卡的权限
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.g150825_android11_zuoye"> <!--添加使用内存卡的权限--> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"></uses-permission> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".VodeoPlayActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
布局文件 action_local_video.xml
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_local_video" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="com.example.g150825_android11_zuoye.LocalVideoActivity"> <RelativeLayout android:layout_width="match_parent" android:layout_height="300dp"> <VideoView android:id="@+id/videoView" android:layout_width="match_parent" android:layout_height="match_parent" /> </RelativeLayout> </RelativeLayout>
Java代码(LocalVideoActivity)
public class LocalVideoActivity extends AppCompatActivity { private VideoView videoView ; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_local_video); getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); //全屏 //本地的视频 需要在手机SD卡根目录添加一个 fl1234.mp4 视频 // String sdPath=Environment.getExternalStorageDirectory().getAbsolutePath(); String videoUrl1 = Environment.getExternalStorageDirectory().getAbsolutePath()+"/storage/emulated/0/f11234.mp4" ; Log.i("test","ddddddddddddd"+Environment.getExternalStorageDirectory().getPath()); Log.i("test",""+Environment.getExternalStorageDirectory().getPath()); //网络视频 // String videoUrl2 = Utils.videoUrl ; Uri uri = Uri.parse( videoUrl1 ); videoView = (VideoView)this.findViewById(R.id.videoView ); //设置视频控制器 videoView.setMediaController(new MediaController(this)); //播放完成回调 videoView.setOnCompletionListener( new MyPlayerOnCompletionListener()); //设置视频路径 videoView.setVideoURI(uri); // /开始播放视频 videoView.start(); } class MyPlayerOnCompletionListener implements MediaPlayer.OnCompletionListener { @Override public void onCompletion(MediaPlayer mp) { Toast.makeText( LocalVideoActivity.this, "播放完成了", Toast.LENGTH_SHORT).show(); } } public class Utils { public static final String videoUrl = "http://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4" ; } }
第二种方法
运行效果如下:
Java代码(SurefaceViewActivity)
package com.example.g150825_android27; import android.media.AudioAttributes; import android.media.AudioManager; import android.media.MediaPlayer; import android.net.Uri; import android.os.Environment; import android.os.SystemClock; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.view.SurfaceHolder; import android.view.SurfaceView; import android.view.View; import android.widget.ImageButton; import android.widget.SeekBar; import java.io.IOException; public class SurefaceViewActivity extends AppCompatActivity { private ImageButton ib_main_imagebutton; private MediaPlayer mediaPlayer; private SeekBar sb_main_bar; private boolean isPlay=false; private MyThread myThread; private SurfaceView sv_sureface; private SurfaceHolder surfaceHolder; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_sureface_view); ib_main_imagebutton = (ImageButton) findViewById(R.id.ib_main_imagebutton); sb_main_bar = (SeekBar) findViewById(R.id.sb_main_bar); sv_sureface = (SurfaceView) findViewById(R.id.sv_sureface); surfaceHolder = sv_sureface.getHolder(); //给进度条设置监听 sb_main_bar.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) { //获取SeekBar拖动之后的进度 int progress=seekBar.getProgress(); //跳转到某个位置播放 mediaPlayer.seekTo(progress); } }); } public void isPlayPause(View view){ //1.开始播放 if(mediaPlayer==null) { isPlay=true; //播放应用内(raw文件) // mediaPlayer = MediaPlayer.create(this, R.raw.sqbm); //播放手机内存卡 //判断是否有无内存卡 // if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){ //得到内存卡的根目录 // String saPath=Environment.getExternalStorageDirectory().getAbsolutePath(); // String musicPath=saPath+"/Music/薛之谦 - 丑八怪.mp3"; //实例化 mediaPlayer=new MediaPlayer(); //设置音频流的类型 mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); //设置音源 try { mediaPlayer.setDataSource(this, Uri.parse("file://mnt/sdcard/啊啊/aaa.mp4")); //播放网络音乐 // mediaPlayer.setDataSource(this, Uri.parse("http://192.168.0116:8080/music.mp3")); //设置显卡 mediaPlayer.setDisplay(surfaceHolder); //准备(内存卡) mediaPlayer.prepare(); // //异步准备(播放网络音乐) // mediaPlayer.prepareAsync(); } catch (IOException e) { e.printStackTrace(); } //准备完成的监听 mediaPlayer.start(); //2.改变图标(暂停) ib_main_imagebutton.setImageResource(android.R.drawable.ic_media_pause); //4.获取到音乐播放总时长 int lengthOfTime=mediaPlayer.getDuration(); sb_main_bar.setMax(lengthOfTime); //6.开启线程 myThread = new MyThread(); myThread.start(); //设置媒体播放器的监听 mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { @Override public void onCompletion(MediaPlayer mediaPlayer) { //音乐播放完成 isPlay=false; myThread=null; ib_main_imagebutton.setImageResource(android.R.drawable.ic_media_play); sb_main_bar.setProgress(0); } }); // } }else if (mediaPlayer.isPlaying()){ isPlay=false; mediaPlayer.pause(); //3.改变图标(播放) ib_main_imagebutton.setImageResource(android.R.drawable.ic_media_play); myThread=null; }else { isPlay=true; mediaPlayer.start(); //2.改变图标(暂停) ib_main_imagebutton.setImageResource(android.R.drawable.ic_media_pause); myThread = new MyThread(); myThread.start(); } } //5.线程 class MyThread extends Thread{ @Override public void run() { super.run(); while(sb_main_bar.getProgress()<=sb_main_bar.getMax()){ //得到音乐当前播放的位置 int currentPosition=mediaPlayer.getCurrentPosition(); Log.i("test","currentPosition="+currentPosition); //设置进度条的进度 sb_main_bar.setProgress(currentPosition); //一秒走一次 SystemClock.sleep(1000); if (!isPlay){ break; } } } } }
布局文件(activity_sureface_view.xml)
<?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" android:weightSum="1" tools:context="com.example.g150825_android27.SurefaceViewActivity"> <SurfaceView android:layout_width="360dp" android:layout_height="300dp" android:id="@+id/sv_sureface" />< a089 /span> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <SeekBar android:layout_width="300dp" android:layout_height="wrap_content" android:id="@+id/sb_main_bar" android:layout_gravity="center_vertical" /> <ImageButton android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@android:drawable/ic_media_play" android:id="@+id/ib_main_imagebutton" android:onClick="isPlayPause" /> </LinearLayout> </LinearLayout>
清单文件配置读取内存卡权限即可:
<!-- 读取内存卡的权限 --> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
相关文章推荐
- android中解决出现“Installation error: INSTALL_PARSE_FAILED_MANIFEST_MALFORMED”错误
- Android Volley完全解析
- Android学习笔记之ListView复用机制详解
- [置顶] Android Camera手动对焦到点击区域(manual focus)
- Android 官方推荐 : DialogFragment 创建对话框
- Android之gradle。
- Android 使用DialogFragment创建对话框
- Android studio Debug 源码
- Android Studio工具Logcat
- Android实现基于ViewPager的无限循环自动播放带指示器的轮播图CarouselFigureView控件
- Android实现带指示器的自动轮播式ViewPager
- 5个Android开发中比较常见的内存泄漏问题及解决办法
- 关于发布版SHA1和调试版SHA1那些事
- 【多媒体开发】Android视频全屏录制遇到的一些问题
- Android中Handler简介
- Android 内存泄露原理和检测
- android时间工具--多久之前
- Android中Activity及条目点击事件
- 《Android Fragment生命周期》
- (Android)不用下载,在线加载pdf文件