安卓开发本地视频播放器——扫描本地视频文件显示在gridview上,然后点击播放。
生活随笔
收集整理的這篇文章主要介紹了
安卓开发本地视频播放器——扫描本地视频文件显示在gridview上,然后点击播放。
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
本文將引導(dǎo)大家做一個(gè)本地視頻播放器,希望能幫到有需要的朋友。
直接上代碼:
下面這是獲取掃描視頻的代碼。
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; /*** 獲取視頻的各種信息 ,標(biāo)題、 地址等等* @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)); //視頻文件的標(biāo)題內(nèi)容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;/*** 記住了一定要實(shí)現(xiàn)Serializable 這個(gè)接口,MainActivity中傳遞對(duì)象時(shí)要用到* @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(){// 自定義彈出框,框內(nèi)放入圖片,圖片設(shè)置旋轉(zhuǎn)動(dòng)畫alert_progress = new AlertDialog.Builder(MainActivity.this).create();alert_progress.show(); alert_progress.setCancelable(false); // 點(diǎn)擊背景時(shí)對(duì)話框不會(huì)消失// alert_progress.dismiss(); // 取消對(duì)話框Window window = alert_progress.getWindow();window.setContentView(R.layout.alert_dialog_progress_view); //加載自定義的布局文件WindowManager.LayoutParams wm = window.getAttributes();wm.width = 250; // 設(shè)置對(duì)話框的寬wm.height = 200; // 設(shè)置對(duì)話框的高wm.alpha = 0.5f; // 對(duì)話框背景透明度wm.dimAmount = 0.6f; // 遮罩層亮度window.setAttributes(wm); ImageView img = (ImageView)window.findViewById(R.id.progress_bar); // 獲取布局文件中的ImageView控件img.setBackgroundResource(R.drawable.progressbar_circle1); // 設(shè)置圖片,也可在布局文件中設(shè)置// 設(shè)置旋轉(zhuǎn)動(dòng)畫Animation tranfrom = new RotateAnimation(0,359,Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF,0.5f);//(359:旋轉(zhuǎn)角度(可自調(diào)),若為360會(huì)有卡頓,正數(shù)為順勢(shì)針旋轉(zhuǎn),負(fù)數(shù)為逆時(shí)針)tranfrom.setDuration(2000); // 旋轉(zhuǎn)速度tranfrom.setFillAfter(true); tranfrom.setRepeatCount(-1); // -1為一只旋轉(zhuǎn),若10,則旋轉(zhuǎn)10次設(shè)定的角度后停止// tranfrom.cancel(); // 取消動(dòng)畫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 ,視頻播放相關(guān)的代碼都在這個(gè)里面實(shí)現(xiàn) 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); //設(shè)置全屏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;}}
源碼還沒來得及上傳,如有需要請(qǐng)留言,上傳后我會(huì)發(fā)地址給你
總結(jié)
以上是生活随笔為你收集整理的安卓开发本地视频播放器——扫描本地视频文件显示在gridview上,然后点击播放。的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 详解 502 Bad Gateway n
- 下一篇: 全网最全面工作流引擎Flowable完整