Android 手机视频选择器---快速开发系列
2016-09-28 16:47
531 查看
Android 手机视频选择器—快速开发系列
分析别人的代码找到解决问题的关键点
视频选择跟图片选择的区别
如何阅读别人的无注释代码
把图片选择器改编成视频选择器
说在前面的话
本案例是基于开源项目http://p.codekk.com/detail/Android/glassLake/PhotoPicker图片选择器修改而来分析方法
1.先把demo下载下来仔细研究分析一样,如果让自己实现这个功能,大概的业务逻辑是什么样的2.把源码的入口位置找准,分析一样,猜测一下这些参数都有什么作用。
3.大致浏览一下整个工程的代码分包结构,并把跟自己想法不一致的地方着重阅读分析
3.接下来需要思考的问题就是?如何把图片选择器变成视频选择器。
归纳如下:
(1)获取视频地址,cursor,替换掉图片地址的获取
(2)获取视频缩略图显示的图,然后显示、
代码修改:
这段代码就是我们获取图片目录的地方了,PhotoPickerFragment.java
MediaStoreHelper.getPhotoDirs(getActivity(), mediaStoreArgs, new MediaStoreHelper.PhotosResultCallback() { @Override public void onResultCallback(List<PhotoDirectory> dirs) { directories.clear(); directories.addAll(dirs); photoGridAdapter.notifyDataSetChanged(); listAdapter.notifyDataSetChanged(); adjustHeight(); } });
这段代码就是我们获取图片的地方了,我们再跳入MediaStoreHelper.java
import android.content.Context; import android.database.Cursor; import android.os.Bundle; import android.support.v4.app.FragmentActivity; import android.support.v4.app.LoaderManager; import android.support.v4.content.Loader; import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.List; import me.iwf.photopicker.PhotoPicker; import me.iwf.photopicker.R; import me.iwf.photopicker.entity.PhotoDirectory; import static android.provider.BaseColumns._ID; import static android.provider.MediaStore.Images.ImageColumns.BUCKET_DISPLAY_NAME; import static android.provider.MediaStore.Images.ImageColumns.BUCKET_ID; import static android.provider.MediaStore.MediaColumns.DATA; import static android.provider.MediaStore.MediaColumns.DATE_ADDED; /** * Created by donglua on 15/5/31. */ public class MediaStoreHelper { public final static int INDEX_ALL_PHOTOS = 0; public static void getPhotoDirs(FragmentActivity activity, Bundle args, PhotosResultCallback resultCallback) { activity.getSupportLoaderManager().initLoader(0, args, new PhotoDirLoaderCallbacks(activity, resultCallback)); } static class PhotoDirLoaderCallbacks implements LoaderManager.LoaderCallbacks<Cursor> { private WeakReference<Context> context; private PhotosResultCallback resultCallback; public PhotoDirLoaderCallbacks(Context context, PhotosResultCallback resultCallback) { this.context = new WeakReference<>(context); this.resultCallback = resultCallback; } @Override public Loader<Cursor> onCreateLoader(int id, Bundle args) { return new PhotoDirectoryLoader(context.get(), args.getBoolean(PhotoPicker.EXTRA_SHOW_GIF, false));//控制筛选那种资源 } @Override public void onLoadFinished(Loader<Cursor> loader, Cursor data) { if (data == null) return; List<PhotoDirectory> directories = new ArrayList<>(); PhotoDirectory photoDirectoryAll = new PhotoDirectory(); photoDirectoryAll.setName(context.get().getString(R.string.__picker_all_image)); photoDirectoryAll.setId("ALL"); while (data.moveToNext()) { int imageId = data.getInt(data.getColumnIndexOrThrow(_ID)); String bucketId = data.getString(data.getColumnIndexOrThrow(BUCKET_ID)); String name = data.getString(data.getColumnIndexOrThrow(BUCKET_DISPLAY_NAME)); String path = data.getString(data.getColumnIndexOrThrow(DATA)); PhotoDirectory photoDirectory = new PhotoDirectory(); photoDirectory.setId(bucketId); photoDirectory.setName(name); if (!directories.contains(photoDirectory)) { photoDirectory.setCoverPath(path); photoDirectory.addPhoto(imageId, path); photoDirectory.setDateAdded(data.getLong(data.getColumnIndexOrThrow(DATE_ADDED))); directories.add(photoDirectory); } else { directories.get(directories.indexOf(photoDirectory)).addPhoto(imageId, path); } photoDirectoryAll.addPhoto(imageId, path); } if (photoDirectoryAll.getPhotoPaths().size() > 0) { photoDirectoryAll.setCoverPath(photoDirectoryAll.getPhotoPaths().get(0)); } directories.add(INDEX_ALL_PHOTOS, photoDirectoryAll); if (resultCallback != null) { resultCallback.onResultCallback(directories); } } @Override public void onLoaderReset(Loader<Cursor> loader) { } } public interface PhotosResultCallback { void onResultCallback(List<PhotoDirectory> directories); } } 需要替换的文件: package me.iwf.photopicker.utils; import android.content.Context; import android.net.Uri; import android.provider.MediaStore; import android.provider.MediaStore.Images.Media; import android.support.v4.content.CursorLoader; import static android.provider.MediaStore.MediaColumns.MIME_TYPE; /** * Created by 黄东鲁 on 15/6/28. */ public class PhotoDirectoryLoader extends CursorLoader { final String[] IMAGE_PROJECTION = { MediaStore.Video.Media._ID, MediaStore.Video.Media.DATA, MediaStore.Video.Media.BUCKET_ID, MediaStore.Video.Media.BUCKET_DISPLAY_NAME, MediaStore.Video.Media.DATE_ADDED }; public PhotoDirectoryLoader(Context context, boolean showGif) { super(context); setProjection(IMAGE_PROJECTION); //setUri(Media.EXTERNAL_CONTENT_URI);//原来的代码 setUri(MediaStore.Video.Media.EXTERNAL_CONTENT_URI);//修改后的代码 setSortOrder(Media.DATE_ADDED + " DESC"); setSelection( MIME_TYPE + "=? or " + MIME_TYPE + "=? or " + MIME_TYPE + "=? " + (showGif ? ("or " + MIME_TYPE + "=?") : "")); String[] selectionArgs; //原来的代码 // if (showGif) { // selectionArgs = new String[]{"image/jpeg", "image/png", "image/jpg", "image/gif"}; // } else { // selectionArgs = new String[]{"image/jpeg", "image/png", "image/jpg"}; // } //修改后的代码 if (showGif) { selectionArgs = new String[]{"video/mpeg", "video/mp4", "video/3gpp", "video/avi"}; } else { selectionArgs = new String[]{"video/mpeg", "video/mp4", "video/3gpp"}; } setSelectionArgs(selectionArgs); } private PhotoDirectoryLoader(Context context, Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { super(context, uri, projection, selection, selectionArgs, sortOrder); } } 缩略图的显示: PhotoGridAdapter.java // glide.load(new File(photo.getPath())) // .centerCrop() // .dontAnimate() // .thumbnail(0.5f) // .override(imageSize, imageSize) // .placeholder(R.drawable.__picker_default_weixin) // .error(R.drawable.__picker_ic_broken_image_black_48dp) // .into(holder.ivPhoto); glide.load(Uri.fromFile(new File(photo.getPath())))//修改位置 .centerCrop() .dontAnimate() .thumbnail(0.5f) .override(imageSize, imageSize) .placeholder(R.drawable.__picker_default_weixin) .error(R.drawable.__picker_ic_broken_image_black_48dp) .into(holder.ivPhoto);
大功告成
相关文章推荐
- 基于Android的淘宝网手机客户端开发见解(配完整视频教程讲解)
- 基于Android的淘宝网手机客户端开发见解(配完整视频教程讲解)
- 3G手机Android应用开发视频教程_黎活明老师的视频下载地址(总共有八天课程)
- Android移动端音视频的快速开发教程(三)
- Android移动端音视频的快速开发教程(二)
- 手机音视频应用开发(专注于Symbian、iPhone、Android等跨平台音视频应用开发方案)
- 3G手机Android应用开发视频教程_黎活明老师的视频(第六天课程)总共有八天课程
- Android手机开发零基础视频(总共39集)陆续更新_若水
- 3G手机Android应用开发视频教程_黎活明老师的视频(第六天课程)总共有八天课程
- Android移动端音视频的快速开发教程(三)
- Android开发视频教程-深入浅出系列Lesson19-AFF110727_蓝牙编程入门
- 3G手机Android应用开发视频教程_黎活明老师的视频(第四天课程)总共有八天课程
- 3G手机Android应用开发视频教程_黎活明老师的视频(第一天课程)总共有八天课程
- android手机视频应用开发
- 开发人员应该选择什么Android手机?
- Android开发视频教程-深入浅出系列Lesson20-AFF111029学习Android界面开发的基础
- 3G手机Android应用开发视频教程_黎活明老师的视频(第三天课程)总共有八天课程
- 3G手机Android应用开发视频教程_黎活明老师的视频(第三天课程)总共有八天课程
- Android移动端音视频的快速开发教程(一)
- Android移动端音视频的快速开发教程(一)