本文将引导大家做一个本地视频播放器,希望能帮到有需要的朋友。

直接上代码:

下面这是获取扫描视频的代码。

package com.mediaplayer.utils;import java.util.ArrayList;
import java.util.List;import com.mediaplayer.domain.VideoInfo;import android.content.Context;
import android.database.Cursor;
import android.provider.MediaStore;
/*** 获取视频的各种信息 ,标题、 地址等等* @author chao**/
public class GetVideoInfoUtils {private Context mContext;public GetVideoInfoUtils(Context context) {this.mContext = context;}public List<VideoInfo> getList() {List<VideoInfo> list = null;if (mContext != null) {Cursor cursor = mContext.getContentResolver().query(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, null, null,null, null);if (cursor != null) {list = new ArrayList<VideoInfo>();while (cursor.moveToNext()) {int id = cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Video.Media._ID));  String title = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.TITLE));  //视频文件的标题内容String album = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.ALBUM));  String artist = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.ARTIST));  String displayName = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DISPLAY_NAME));  String mimeType = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.MIME_TYPE));  String path = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DATA));  //long duration = cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DURATION));  long size = cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.SIZE));  VideoInfo videoinfo = new VideoInfo(id, title, album, artist, displayName, mimeType, path, size, duration);  list.add(videoinfo);  }cursor.close();      }}  return list;}}
package com.mediaplayer.domain;import java.io.Serializable;/*** 记住了一定要实现Serializable 这个接口,MainActivity中传递对象时要用到* @author chao**/
public class VideoInfo implements Serializable {private static final long serialVersionUID = -7920222595800367956L;  private int id;  private String title;  private String album;  private String artist;  private String displayName;  private String mimeType;  private String path;  private long size;  private long duration;public VideoInfo(int id, String title, String album, String artist, String displayName, String mimeType,String path, long size, long duration) {super();this.id = id;this.title = title;this.album = album;this.artist = artist;this.displayName = displayName;this.mimeType = mimeType;this.path = path;this.size = size;this.duration = duration;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getTitle() {return title;}public void setTitle(String title) {this.title = title;}public String getAlbum() {return album;}public void setAlbum(String album) {this.album = album;}public String getArtist() {return artist;}public void setArtist(String artist) {this.artist = artist;}public String getDisplayName() {return displayName;}public void setDisplayName(String displayName) {this.displayName = displayName;}public String getMimeType() {return mimeType;}public void setMimeType(String mimeType) {this.mimeType = mimeType;}public String getPath() {return path;}public void setPath(String path) {this.path = path;}public long getSize() {return size;}public void setSize(long size) {this.size = size;}public long getDuration() {return duration;}public void setDuration(long duration) {this.duration = duration;}public static long getSerialversionuid() {return serialVersionUID;}  }

下面是MainActivity 代码

package com.mediaplayer;import java.util.List;import com.mediaplayer.adapter.VideoAdapter;
import com.mediaplayer.domain.VideoInfo;
import com.mediaplayer.utils.GetVideoInfoUtils;import android.app.Activity;
import android.app.AlertDialog;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.drawable.BitmapDrawable;
import android.media.ThumbnailUtils;
import android.os.AsyncTask;
import android.os.Bundle;
import android.provider.MediaStore.Video.Thumbnails;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.view.animation.Animation;
import android.view.animation.RotateAnimation;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.GridView;
import android.widget.ImageView;public class MainActivity extends Activity {private GridView gridview;VideoAdapter mAdapter;  List<VideoInfo> listVideos;  int videoSize;  AlertDialog alert_progress;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);GetVideoInfoUtils provider = new GetVideoInfoUtils(this);  listVideos = provider.getList();  videoSize = listVideos.size(); gridview = (GridView) findViewById(R.id.gridview);mAdapter = new VideoAdapter(this, listVideos);gridview.setAdapter(mAdapter);gridview.setOnItemClickListener(new OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> parent, View view, int position, long id) {Intent intent = new Intent();  intent.setClass(MainActivity.this, JieVideoPlayerActivity.class);  Bundle bundle = new Bundle();  bundle.putSerializable("videoInfo", listVideos.get(position));  intent.putExtras(bundle);  startActivity(intent); }});loadImages();showDialog();}private void showDialog(){// 自定义弹出框,框内放入图片,图片设置旋转动画alert_progress = new AlertDialog.Builder(MainActivity.this).create();alert_progress.show(); alert_progress.setCancelable(false); // 点击背景时对话框不会消失// alert_progress.dismiss(); // 取消对话框Window window = alert_progress.getWindow();window.setContentView(R.layout.alert_dialog_progress_view); //加载自定义的布局文件WindowManager.LayoutParams wm = window.getAttributes();wm.width = 250; // 设置对话框的宽wm.height = 200; // 设置对话框的高wm.alpha = 0.5f;   // 对话框背景透明度wm.dimAmount = 0.6f; // 遮罩层亮度window.setAttributes(wm); ImageView img = (ImageView)window.findViewById(R.id.progress_bar);  // 获取布局文件中的ImageView控件img.setBackgroundResource(R.drawable.progressbar_circle1); // 设置图片,也可在布局文件中设置// 设置旋转动画Animation tranfrom = new RotateAnimation(0,359,Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF,0.5f);//(359:旋转角度(可自调),若为360会有卡顿,正数为顺势针旋转,负数为逆时针)tranfrom.setDuration(2000); // 旋转速度tranfrom.setFillAfter(true); tranfrom.setRepeatCount(-1); // -1为一只旋转,若10,则旋转10次设定的角度后停止// tranfrom.cancel();  // 取消动画img.setAnimation(tranfrom);}/** * Load images. */  private void loadImages() {  final Object data = getLastNonConfigurationInstance();  if (data == null) {  new LoadImagesFromSDCard().execute();  } else {  final LoadedImage[] photos = (LoadedImage[]) data;  if (photos.length == 0) {  new LoadImagesFromSDCard().execute();  }  for (LoadedImage photo : photos) {  addImage(photo);  }  }  }  private void addImage(LoadedImage... value) {  for (LoadedImage image : value) {  mAdapter.addPhoto(image);  mAdapter.notifyDataSetChanged();  }  }  @Override  public Object onRetainNonConfigurationInstance() {  final GridView  grid = gridview;  final int count = grid.getChildCount();  final LoadedImage[] list = new LoadedImage[count];  for (int i = 0; i < count; i++) {  final ImageView v = (ImageView) grid.getChildAt(i);  list[i] = new LoadedImage(  ((BitmapDrawable) v.getDrawable()).getBitmap());  }  return list;  }  /**  *   * @param videoPath  * @param width  * @param height  * @param kind  * @return  */    private Bitmap getVideoThumbnail(String videoPath, int width , int height, int kind){    Bitmap bitmap = null;    bitmap = ThumbnailUtils.createVideoThumbnail(videoPath, kind);    bitmap = ThumbnailUtils.extractThumbnail(bitmap, width, height, ThumbnailUtils.OPTIONS_RECYCLE_INPUT);    return bitmap;    }    class LoadImagesFromSDCard extends AsyncTask<Object, LoadedImage, Object> {  @Overrideprotected void onPreExecute() {
//             alert_progress.show();}@Override  protected Object doInBackground(Object... params) {  Bitmap bitmap = null;  for (int i = 0; i < videoSize; i++) {  bitmap = getVideoThumbnail(listVideos.get(i).getPath(), 120, 120, Thumbnails.MINI_KIND);  if (bitmap != null) {  publishProgress(new LoadedImage(bitmap));  }  }  return null;  }  @Override  public void onProgressUpdate(LoadedImage... value) {  addImage(value);  }  @Overrideprotected void onPostExecute(Object result) {alert_progress.cancel();}}  public class LoadedImage {  Bitmap mBitmap;  public LoadedImage(Bitmap bitmap) {  mBitmap = bitmap;  }  public Bitmap getBitmap() {  return mBitmap;  }  }
}

这是MainActivity的布局文件

<RelativeLayout 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: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.mediaplayer.MainActivity" ><GridViewandroid:id="@+id/gridview"android:layout_width="match_parent"android:layout_height="wrap_content"android:numColumns="3" /></RelativeLayout>

下面是 dialog的布局文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical" ><ImageViewandroid:id="@+id/progress_bar"android:layout_width="100dp"android:layout_height="100dp"android:layout_gravity="center"android:layout_marginTop="10dp"android:layout_marginBottom="10dp"/><TextViewandroid:text="正在加载..."android:layout_width="match_parent"android:layout_height="wrap_content"android:textColor="#000000"android:layout_gravity="center"android:textSize="22sp"android:gravity="center"/></LinearLayout>

下面是视频播放的activity ,视频播放相关的代码都在这个里面实现

package com.mediaplayer;import java.io.IOException;import com.mediaplayer.domain.VideoInfo;import android.app.Activity;
import android.content.Intent;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.view.SurfaceHolder;
import android.view.SurfaceView;public class JieVideoPlayerActivity extends Activity {private SurfaceView surface;private MediaPlayer mediaplay;private String urlPath ;private Intent intent;private int postion = 0;@Overrideprotected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.onCreate(savedInstanceState);setContentView(R.layout.play);surface = (SurfaceView) findViewById(R.id.surface);mediaplay = new MediaPlayer();surface.getHolder().setKeepScreenOn(true); //设置全屏surface.getHolder().addCallback(new SurfaceViewLis());intent = this.getIntent();Bundle bundle = intent.getExtras();VideoInfo video = (VideoInfo) bundle.getSerializable("videoInfo");urlPath = video.getPath();}public void play() throws IllegalArgumentException, SecurityException, IllegalStateException, IOException {mediaplay.reset();mediaplay.setAudioStreamType(AudioManager.STREAM_MUSIC);mediaplay.setDataSource(urlPath);// 把视频输出到SurfaceView上mediaplay.setDisplay(surface.getHolder());mediaplay.prepare();mediaplay.start();}private class SurfaceViewLis implements SurfaceHolder.Callback{@Overridepublic void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {// TODO Auto-generated method stub}@Overridepublic void surfaceCreated(SurfaceHolder holder) {if (postion == 0) {try {play();} catch (IllegalArgumentException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (SecurityException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IllegalStateException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}@Overridepublic void surfaceDestroyed(SurfaceHolder holder) {}}}

这是JieVideoPlayerActivity布局文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical" ><SurfaceView android:id="@+id/surface"android:layout_height="wrap_content"android:layout_width="wrap_content"/></LinearLayout>

这是适配器代码

package com.mediaplayer.adapter;import java.util.ArrayList;
import java.util.List;import com.mediaplayer.MainActivity.LoadedImage;
import com.mediaplayer.R;
import com.mediaplayer.domain.VideoInfo;import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;public class VideoAdapter extends BaseAdapter {private List<VideoInfo> list;private Context context;private LayoutInflater mInflater;private ArrayList<LoadedImage> photos = new ArrayList<LoadedImage>();public VideoAdapter(Context context ,List<VideoInfo> list) {this.context = context;this.list = list;mInflater = LayoutInflater.from(context);}@Overridepublic int getCount() {// TODO Auto-generated method stubreturn photos.size();}public void addPhoto(LoadedImage image){  photos.add(image);  }@Overridepublic Object getItem(int position) {// TODO Auto-generated method stubreturn list.get(position);}@Overridepublic long getItemId(int position) {// TODO Auto-generated method stubreturn position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {ViewHolder hold = null;if (convertView==null) {hold = new ViewHolder();convertView = mInflater.inflate(R.layout.video_item, null);hold.img = (ImageView) convertView.findViewById(R.id.iv_img);hold.tv_title = (TextView) convertView.findViewById(R.id.title);hold.tv_time = (TextView) convertView.findViewById(R.id.time);convertView.setTag(hold);}else{hold = (ViewHolder) convertView.getTag();}hold.tv_title.setText(list.get(position).getTitle());long min = list.get(position).getDuration() /1000 / 60;  long sec = list.get(position).getDuration() /1000 % 60;hold.tv_time.setText(min+":"+sec);hold.img.setImageBitmap(photos.get(position).getBitmap());  return convertView;}private final class ViewHolder{private ImageView img;private TextView tv_title;private TextView tv_time;}}

源码还没来得及上传,如有需要请留言,上传后我会发地址给你

安卓开发本地视频播放器——扫描本地视频文件显示在gridview上,然后点击播放。相关推荐

  1. 安卓开发之视频播放器

    首先送各位有缘看到这篇文章的朋友们一句话:努力,总会有收获! 下面开始正题: 视频播放器,谷歌提供了布局控件和api. 布局控件的名字叫做VideoView,该控件也有自己的类,实例化一个该控件对象后 ...

  2. 嵌入式Qt 开发一个视频播放器

    上篇文章:嵌入式 Qt开发一个音乐播放器,使用Qt制作了一个音乐播放器,并在OK3568开发板上进行了运行测试,实际测试效果还不错. 本篇继续来实现一个Qt视频播放器软件,可以实现视频列表的显示与选择 ...

  3. Android本地视频播放器开发 - 搜索本地视频(1)

    这一章的主要内容是搜索手机本地视频,添加到ListView列表里,每一个表项含有这个视频的缩略图,视频的播放时间,视频的标题,在搜索本地视频(1)中我们先制作搜索功能.   Video.java--视 ...

  4. 实现在Android本地视频播放器开发

    在Android本地视频播放器开发中的搜索本地视频章节中,我们能够搜索本地视频并且显示每个视频的图片.标题.时间长度,当然如果需要添加其他的例如视频的长度和宽度可以使用Video类中的方法,既然我们获 ...

  5. Android本地视频播放器开发--视频解码

    在上一章Android本地视频播放器开发--SDL编译编译中编译出sdl的支持库,当时我们使用的2.0,但是有些api被更改了,所以在以下的使用者中我们使用SDL1.3的库,这个库我会传上源码以及编译 ...

  6. android 编译 sdl,SDL编译 - Android本地视频播放器开发_Linux编程_Linux公社-Linux系统门户网站...

    在上一章  Android本地视频播放器开发--ffmpeg解码视频文件中的音频(2)[http://www.linuxidc.com/Linux/2013-06/85955p5.htm]中使用Ope ...

  7. Android本地视频播放器开发--NDK编译FFmpeg

    在Android本地视频播放器开发中的搜索本地视频章节中,我们能够搜索本地视频并且显示每个视频的图片.标题.时间长度,当然如果需要添加其他的例如视频的长度和宽度可以使用Video类中的方法,既然我们获 ...

  8. Android本地视频播放器开发--SDL编译

    在上一章 Android本地视频播放器开发--ffmpeg解码视频文件中的音频(2)中使用OpenSL ES来播放视频的声音,遗留的问题是声音的不同步,由于视频实现部分也要同步,而且音视频也要同步,所 ...

  9. linux下qt实现vlc视频播放器,Qt封装本地视频播放器(VLC二次开发)

    Qt本地视频播放器 1.使用vlc官方sdk封装,并在QLabel上面播放 2.首先到vlc官网下载vlc的sdk环境,下载地址:http://download.videolan.org/pub/vi ...

最新文章

  1. android 自定义扫地机器人地图,扫地机如何正确操作进行APP建图?
  2. php5ts.dll 注册码,修复php5ts.dll
  3. 在Flash中调用xml文档
  4. 哨兵模式原理_Redis哨兵、复制、集群的设计原理,以及区别
  5. mysql anyvalue函数_Mysql 的ANY_VALUE()函数和 ONLY_FULL_GROUP_BY 模式
  6. 汇编语言:汇编程序的hello world程序(实验9根据材料编程)
  7. 小练习-----银行提款机系统
  8. 网易有道词典--关闭自动发音
  9. Android屏幕元素层次结构
  10. 算法笔记-------快速排序
  11. 计算机操作系统详细学习笔记(二):处理器管理
  12. 手把手学习企业型网站之三firework做顶部的banner+nav
  13. 网站挂马检测 php,Python实现的检测网站挂马程序
  14. 语音数字信号处理系统设计(含matlab程序)
  15. Python实现问卷星调查问卷自动填写
  16. 解决The valid characters are defined in RFC 7230 and RFC 3986
  17. 数据分析 面经(已拿到offer)
  18. MySQL 中 不等于 会过滤掉 Null 的问题
  19. Linux服务器搭建--NTP服务器的搭建与配置
  20. 安装坑——rational rose

热门文章

  1. 微信支付url未注册问题解决方案
  2. 功放前级的左右_Altitude32前级功放题 - 什么是全景声功放_全景声功放有哪些
  3. vue 仿B站下拉刷新上拉加载
  4. ubuntu启动spyder黑屏问题解决办法:QOpenGLShaderProgram::uniformLocation(qt_Matrix): shader program is not linke
  5. aria2c 下载命令
  6. 论不良贷款拨备覆盖率的局限性和建议
  7. linux+rel+安装教程,pika安装教程
  8. python 使用pika对接rabbitMQ
  9. 第28届计算机命题搜索赛试题,第28届计算机表演赛命题搜索赛.docx
  10. maven 打包将依赖打进jar包