Android辅助编写教程,Android实现简单图库辅助器

写在前面

实际开发经常会遇到读取相册或者拍照功能,网上也很非常多图库框架,都各有风格,也因此与自己的项目格格不入。再者,框架API太多,需要的配置太多,还要吃力研究。所以,本人摸索大多图库框架,提炼核心,写一个只提供核心的辅助类,剩下的就可以自行玩耍。

实现步骤

第一步,创建辅助类,使用弱引用持有Activity,防止内存溢出。

public class GalleryHelper{

private Activity mActivity;

public GalleryHelper(Activity activity) {

mActivity = new WeakReference<>(activity).get();

}

}

第二步,创建文件夹实体类,代表文件夹数据。paths集合是文件夹下的所有路径。

public final class FolderEntity {

private int num;

private String name;

private List paths = new ArrayList<>();

public int getNum() {

return paths.size();

}

public List getPaths() {

return paths;

}

public void setName(String name) {

this.name = name;

}

}

第三步,首先获取手机所有的图片,在Activity里有getLoaderManager方法获取一个LoaderManager实例,该类用于异步加载手机内数据监测,这里不做多分析。我们调用它的initLoader方法,前两个参数这里不需要,只要实现LoaderCallbacks接口,并且指定Cursor类型。LoaderCallbacks接口有三个覆盖方法,我们需要用到的是onCreateLoader方法和onLoadFinished方法,前者是初始化Loader,后者是加载完成后的回调。

mActivity.getLoaderManager().initLoader(0, null, new LoaderManager.LoaderCallbacks() {

@Override

public Loader onCreateLoader(int i, Bundle bundle) {

}

@Override

public void onLoadFinished(Loader loader, Cursor cursor) {

}

@Override

public void onLoaderReset(Loader loader) {

}

});

在onCreateLoader方法里,初始化CursorLoader,参数跟Cursor类下的query一样,第一个参数指定外部村粗多媒体URI;第二个参数是查找结果字段,这里只要了路径;第三个参数和第四个参数是搜索条件,条件为搜索jpeg格式和png格式,最后一个是按时间倒序搜索。

public Loader onCreateLoader(int i, Bundle bundle) {

return new CursorLoader(mActivity,

MediaStore.Images.Media.EXTERNAL_CONTENT_URI,

new String[]{MediaStore.Images.Media.DATA},

MediaStore.Images.Media.MIME_TYPE + "=? or "

+ MediaStore.Images.Media.MIME_TYPE + "=?",

new String[]{"image/jpeg", "image/png"},

MediaStore.Images.Media.DATE_ADDED + " DESC");

}

CursorLoader初始化完成之后,搜索的结果会回调在onLoadFinished方法。这时就可以处理搜索出来的图片路径。因为图片路径是没有分类,这里采用HashMap分类,以文件夹路径为key,具体文件夹FolderEntity类为value,如果当前图片路径的文件夹不存在则创建FolderEntity并且放入HashMap,存在则获取FolderEntity。

public void onLoadFinished(Loader loader, Cursor cursor) {

HashMap folderEntityHashMap = new HashMap();

if (cursor != null) {

while (cursor.moveToNext()) {

//图片路径

String path = cursor.getString(

cursor.getColumnIndex(MediaStore.Images.Media.DATA));

// 路径不存在或者文件不存在就跳过

File file = new File(path);

if (TextUtils.isEmpty(path) || !file.exists()) {

continue;

}

String folerPath = file.getParent();

FolderEntity folderEntity;

if (folderEntityHashMap.containsKey(folerPath)) {

folderEntity = folderEntityHashMap.get(folerPath);

} else {

folderEntity = new FolderEntity();

folderEntityHashMap.put(file.getParentFile().getName(), folderEntity);

}

folderEntity.getPaths().add(path);

}

cursor.close();

}

}

但是数据是要提供给外部的,HashMap就显得很麻烦,所以要转换ArrayList,并且按数量大小进行顺序。

private ArrayList map2List(HashMap mediaBeanMap) {

Iterator iterator = mediaBeanMap.values().iterator();

ArrayList list = new ArrayList();

while (iterator.hasNext()) {

list.add(iterator.next());

}

Collections.sort(list, new Comparator() {

@Override

public int compare(FolderEntity lhs, FolderEntity rhs) {

return lhs.getNum() > rhs.getNum() ? 1 : -1;

}

});

return list;

}

使用接口将数据提供给外部。

public interface GalleryCallback {

void complete(List list);

}

callback.complete(map2List(folderEntityHashMap));

第四步是实现拍照功能,这里实现是创建文件再启动拍照功能。

File imageStoreDir = new File(Environment.getExternalStorageDirectory(),

"/DCIM/" + mActivity.getResources().getString(R.string.app_name));

if (!imageStoreDir.exists()) {

imageStoreDir.mkdir();

}

Intent captureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

if (captureIntent.resolveActivity(mActivity.getPackageManager()) != null) {

SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHmmss", Locale.CHINA);

String filename = String.format("IMG%s", dateFormat.format(new Date()));

imagePath = new File(imageStoreDir, filename).getAbsolutePath();

captureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(imagePath)));

mActivity.startActivityForResult(new Intent(

MediaStore.ACTION_IMAGE_CAPTURE), REQUEST_CODE);

}

定义回调接口,接收Activit的onActivityResult方法,表示回调成功把上面创建好的文件路径提供外部。

public interface CameraCallback {

void complete(String path);

}

public void onActivityResult(int requestCode, int resultCode) {

if (Activity.RESULT_OK == resultCode && REQUEST_CODE == requestCode) {

if (cameraCallback != null) {

cameraCallback.complete(imagePath);

}

}

}

外部调用

galleryHelper = new GalleryHelper(this);

galleryHelper.loadImages(new GalleryHelper.GalleryCallback() {

@Override

public void complete(List list) {

//加载本地图片返回结果

}

});

findViewById(R.id.btn_camera).setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

galleryHelper.openCamera(new GalleryHelper.CameraCallback() {

@Override

public void complete(String path) {

//拍照返回结果

}

});

}

});

@Override

protected void onActivityResult(int requestCode, int resultCode, Intent data) {

super.onActivityResult(requestCode, resultCode, data);

//使用拍照,必须接收Activity的onActivityResult方法

galleryHelper.onActivityResult(requestCode, resultCode);

}

别忘了加权限,这里为了简单实现,我把targetSdkVersion设置23以下,23和23以上的需要自行加上动态权限。

整体就完成了,使用非常方便,有了这图库辅助器就可以自定义风格,再也不用受约束。网上大多开源图片选择器的搜索图片都是如此,但这例子难免有bug,不足之处望指教。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值