Android实现简单图库辅助器

Android实现简单图库辅助器,第1张

概述写在前面实际开发经常会遇到读取相册或者拍照功能,网上也很非常多图库框架,都各有风格,也因此与自己的项目格格不入。再者,框架API太多,需要的配置太多,还要吃力研究。所以,本人摸索大多图库框架,提炼核心,

写在前面

实际开发经常会遇到读取相册或者拍照功能,网上也很非常多图库框架,都各有风格,也因此与自己的项目格格不入。再者,框架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<String> paths = new ArrayList<>();  public int getNum() {    return paths.size();  }  public List<String> 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<Cursor>() {      @OverrIDe      public Loader<Cursor> onCreateLoader(int i,Bundle bundle) {      }      @OverrIDe      public voID onLoadFinished(Loader<Cursor> loader,Cursor cursor) {      }      @OverrIDe      public voID onLoaderreset(Loader<Cursor> loader) {      }    });

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

  public Loader<Cursor> 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<Cursor> loader,Cursor cursor) {     HashMap<String,FolderEntity> folderEntityHashMap = new HashMap<String,FolderEntity>();      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<FolderEntity> map2List(HashMap<String,FolderEntity> mediaBeanMap) {      Iterator<FolderEntity> iterator = mediaBeanMap.values().iterator();      ArrayList<FolderEntity> List = new ArrayList<FolderEntity>();      while (iterator.hasNext()) {        List.add(iterator.next());      }      Collections.sort(List,new Comparator<FolderEntity>() {        @OverrIDe        public int compare(FolderEntity lhs,FolderEntity rhs) {          return lhs.getNum() > rhs.getNum() ? 1 : -1;        }      });      return List;    }

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

  public interface galleryCallback {    voID complete(List<FolderEntity> 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<FolderEntity> 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以上的需要自行加上动态权限。

  <uses-permission androID:name="androID.permission.READ_EXTERNAL_STORAGE" />  <uses-permission androID:name="androID.permission.WRITE_EXTERNAL_STORAGE" />  <uses-permission androID:name="androID.permission.CAMERA" />  <uses-permission androID:name="androID.permission.MOUNT_UNMOUNT_fileSYstemS" />

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

github地址:https://github.com/tanxinye/GalleryHelper

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

总结

以上是内存溢出为你收集整理的Android实现简单图库辅助器全部内容,希望文章能够帮你解决Android实现简单图库辅助器所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1146499.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-31
下一篇 2022-05-31

发表评论

登录后才能评论

评论列表(0条)

保存