如何在Android应用中实现一个图库辅助器功能?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

杭锦后网站制作公司哪家好,找创新互联!从网页设计、网站建设、微信开发、APP开发、响应式网站开发等网站项目制作,到程序开发,运营维护。创新互联自2013年起到现在10年的时间,我们拥有了丰富的建站经验和运维经验,来保证我们的工作的顺利进行。专注于网站建设就选创新互联。
实现步骤
第一步,创建辅助类,使用弱引用持有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 LoaderonCreateLoader(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(Loaderloader, 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 ArrayListmap2List(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以上的需要自行加上动态权限。
关于如何在Android应用中实现一个图库辅助器功能问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注创新互联行业资讯频道了解更多相关知识。
分享题目:如何在Android应用中实现一个图库辅助器功能
当前地址:http://www.cqwzjz.cn/article/ggpdhe.html

 建站
建站
 咨询
咨询 售后
售后
 建站咨询
建站咨询 
 