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

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

直接上代码:

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

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;
	@Override
	protected 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() {
			@Override
			public 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> {  
		   
		   @Override
		protected 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);  
	       }  
	       @Override
	    protected 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" >

    <GridView
        android: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" >
    <ImageView
        android:id="@+id/progress_bar"
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:layout_gravity="center"
        android:layout_marginTop="10dp"
        android:layout_marginBottom="10dp"/>

    <TextView
        android: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;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.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{
		@Override
		public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
			// TODO Auto-generated method stub
		}
		@Override
		public void surfaceCreated(SurfaceHolder holder) {
			if (postion == 0) {
				try {
					play();
				} catch (IllegalArgumentException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				} catch (SecurityException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				} catch (IllegalStateException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
		@Override
		public 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);
		
	}
	
	@Override
	public int getCount() {
		// TODO Auto-generated method stub
		return photos.size();
	}
	
	 public void addPhoto(LoadedImage image){  
	        photos.add(image);  
	    }
	@Override
	public Object getItem(int position) {
		// TODO Auto-generated method stub
		return list.get(position);
	}

	@Override
	public long getItemId(int position) {
		// TODO Auto-generated method stub
		return position;
	}

	@Override
	public 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;
		
	}

}

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

评论 46
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值