您的位置:首页 > 移动开发 > Android开发

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

2016-07-23 16:15 549 查看
本文将引导大家做一个本地视频播放器,希望能帮到有需要的朋友。

直接上代码:

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

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;

}

}


源码还没来得及上传,如有需要请留言,上传后我会发地址给你
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息