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

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


大功告成
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐