Android视频播放
来源:互联网 发布:网络检测插件 编辑:程序博客网 时间:2024/05/22 17:03
先看效果图
做这个项目遗留有不少问题,视频全屏播放无法改变视频的大小,没有办法只好跳转界面,有大牛可指点一下,另一个就是,我桌面的Appwidget已实现播放视频
但问题来咯!切换界面时视频还在界面呆着移不走了,而且桌面背景全黑了,额!效果很差,没办法了。
嗯,上代码吧。首先进来去取视频文件数据
sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED,Uri.parse("file://" + Environment.getExternalStorageDirectory())));这句话的意思是扫描全盘的视频文件
private void getMediaData() {ContentResolver contentResolver = getContentResolver();Cursor cursor = contentResolver.query(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, null, null, null,null);data = new ArrayList<VideoInfo>();for (cursor.moveToFirst(); !(cursor.isAfterLast()); cursor.moveToNext()) {VideoInfo info = new VideoInfo();int id = cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Video.Media._ID));info.setId(id);// 名称 :MediaStore.Audio.Media.TITLEString title = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.TITLE));info.setTitle(title);// 专辑名:MediaStore.Audio.Media.ALBUM// String album = cursor.getString(cursor// .getColumnIndexOrThrow(MediaStore.Video.Media.ALBUM));// 歌手名: MediaStore.Audio.Media.ARTIST// String artist = cursor.getString(cursor// .getColumnIndexOrThrow(MediaStore.Video.Media.ARTIST));// 路径 :MediaStore.Audio.Media.DATAString path = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DATA));info.setPath(path);// 总播放时长 :MediaStore.Audio.Media.DURATIONint duration = cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DURATION));info.setDuration(duration);// 大小 :MediaStore.Audio.Media.SIZEint size = (int) cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.SIZE));info.setSize(size);String displayname = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DISPLAY_NAME));info.setDisplayname(displayname);// 拍摄时间// int dateTaken = cursor.getInt(cursor// .getColumnIndexOrThrow(MediaStore.Video.Media.DATE_TAKEN));// Bitmap bm =// android.media.ThumbnailUtils.createVideoThumbnail(path,// Images.Thumbnails.MICRO_KIND);data.add(info);}cursor.close();}这是查询Contentprovider里视频文件的信息,得到数据就好办了,放到listview里显示出来就行,下面的核心就是播放出视频文件了。
先贴出code
private void playoneVideo(String path) {filePath = path;curindex=getindex();videoview.setVideoPath(path);videoview.setMySizeChangeLinstener(new MySizeChangeLinstener() {public void doMyThings() {setVideoScale(SCREEN_DEFAULT);}});videoview.setOnPreparedListener(new OnPreparedListener() {public void onPrepared(MediaPlayer mp) {progress.setMax(videoview.getDuration());totalTime.setText(toTime(videoview.getDuration()));setVideoScale(SCREEN_FULL);videoview.seekTo(currentPosition);handler.post(updateRun);setVideoScale(SCREEN_DEFAULT);videoview.start();}});videoview.setOnCompletionListener(new OnCompletionListener() {public void onCompletion(MediaPlayer mp) {if(curindex==-1||curindex==-2){playoneVideo(filePath);}else{curindex=0;playVideo();}}});}传进来播放文件的路径,给videoview就行了,这个Videoview系统也有,我是自己写了个,因为我还要把它加到Widget里去,需要修改一下它的代码。说白了Videoview也是继承SurfaceView的,进行一了封装而已。直接看核心代码:
private void openVideo() { if (mUri == null || mSurfaceHolder == null) { // not ready for playback just yet, will try again later return; } // Tell the music playback service to pause // TODO: these constants need to be published somewhere in the framework. Intent i = new Intent("com.android.music.musicservicecommand"); i.putExtra("command", "pause"); mContext.sendBroadcast(i); if (mMediaPlayer != null) { mMediaPlayer.reset(); mMediaPlayer.release(); mMediaPlayer = null; } try { mMediaPlayer = new MediaPlayer(); mMediaPlayer.setOnPreparedListener(mPreparedListener); mMediaPlayer.setOnVideoSizeChangedListener(mSizeChangedListener); mIsPrepared = false; Log.v(TAG, "reset duration to -1 in openVideo"); mDuration = -1; mMediaPlayer.setOnCompletionListener(mCompletionListener); mMediaPlayer.setOnErrorListener(mErrorListener); mMediaPlayer.setOnBufferingUpdateListener(mBufferingUpdateListener); mCurrentBufferPercentage = 0; mMediaPlayer.setDataSource(mContext, mUri); mMediaPlayer.setDisplay(mSurfaceHolder); mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); mMediaPlayer.setScreenOnWhilePlaying(true); mMediaPlayer.prepareAsync(); attachMediaController(); } catch (IOException ex) { Log.w(TAG, "Unable to open content: " + mUri, ex); return; } catch (IllegalArgumentException ex) { Log.w(TAG, "Unable to open content: " + mUri, ex); return; } }注意在新建MediaPlayer之前一定要释放资源,其他的没什么好说的,就是从外部传值(mUri),传对象(Listener,mSurfaceHolder)等数据过来。你如果外面要对MediaPlayer操作的话全写在这里面,在外面直接调就行了。例如
public int getCurrentPosition() { if (mMediaPlayer != null && mIsPrepared) { return mMediaPlayer.getCurrentPosition(); } return 0; }怎么调
int currentPosition = videoview.getCurrentPosition();就这样ok了。
全屏那个功能点实现的不好,也说说我的思路,双击视频或点击全屏按钮时
currentPosition = videoview.getCurrentPosition();Intent intent = new Intent();Bundle bd = new Bundle();bd.putString("path", filePath);bd.putInt("curposition", currentPosition);intent.putExtras(bd);intent.setClass(getBaseContext(), PlayVideoFullScreenAct.class);startActivityForResult(intent, 1);我也说过当我直接把videoview放大到全屏时,视频还是以前的大小,只好搞这中笨方法了。把播放的视频路径,和当前播放的进度传过去,在那个Activity里接一下就ok了,就能继续播放了
intent = getIntent();filepath = intent.getExtras().getString("path");curposition = intent.getExtras().getInt("curposition");有了路径和进度就可以直接播放了
private void playVideo() {curindex = getindex();videoview.setVideoPath(filepath);videoview.setOnPreparedListener(new OnPreparedListener() {public void onPrepared(MediaPlayer mp) {seekbar.setMax(videoview.getDuration());fulltotaltext.setText(toTime(videoview.getDuration()));videoview.setVideoScale(screenWidth, screenHeight);videoview.seekTo(curposition);handler.post(updateRun);videoview.start();}});videoview.setOnCompletionListener(new OnCompletionListener() {public void onCompletion(MediaPlayer mp) {if(curindex==-1||curindex==-2){PlayVideoFullScreenAct.this.finish();}curindex++;if (curindex > data.size() - 1) {curindex = 0;}curposition = 0;handler.removeCallbacks(updateRun);videoview.reset();playVideo();}});}当退出全屏时再把路径和进度传回去就ok了,嗯!差不多了。
视频播放项目源码
- Android视频播放: VideoView播放视频(三)
- android视频播放
- Android 视频播放
- android 视频播放
- android 视频播放
- Android VideoView播放视频
- Android视频播放
- Android之视频播放
- Android 视频播放器
- android 视频播放
- android 播放视频示例
- android 视频播放器
- Android VideoView播放视频
- ANDROID 视频播放代码
- Android 视频播放 MediaPlayer
- Android视频播放
- Android 播放视频示例
- Android播放视频(四)
- IBM MQ Monitor
- LINUX查看硬件配置命令
- MySQL数据类型简介
- Android仿系统Menu的代码
- [Java] 从图片URL中读取字节数组
- Android视频播放
- ulimit
- 【Web Trick 4】CSS 实现footer固定页面底部
- C#完整的通信代码(点对点,点对多,同步,异步,UDP,TCP)
- sso原理
- MySQL帐户管理
- icon各种尺寸
- 常见mime type
- MySQL服务器的启动与退出