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

论坛 期权论坛 脚本     
匿名网站用户   2020-12-21 11:12   175   0

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

直接上代码:

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

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;
  
 }

}

源码还没来得及上传,如有需要请留言,上传后我会发地址给你
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:1136255
帖子:227251
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP