iis服务器助手广告广告
返回顶部
首页 > 资讯 > 移动开发 >Android实现简单图库辅助器
  • 782
分享到

Android实现简单图库辅助器

Android 2022-06-06 01:06:06 782人浏览 独家记忆
摘要

写在前面 实际开发经常会遇到读取相册或者拍照功能,网上也很非常多图库框架,都各有风格,也因此与自己的项目格格不入。再者,框架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编程实现调用系统图库与裁剪图片功能android图库竖屏不显示status bar的解决方法android图库播放幻灯片时按power键灭屏再亮屏显示keyguard


--结束END--

本文标题: Android实现简单图库辅助器

本文链接: https://www.lsjlt.com/news/21882.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 如何在Android应用中实现一个图库辅助器功能
    如何在Android应用中实现一个图库辅助器功能?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。实现步骤第一步,创建辅助类,使用弱引用持有Activity,防止内存溢出。 ...
    99+
    2023-05-31
    android roi
  • android辅助功能怎么实现
    Android系统提供了一些辅助功能的API,可以帮助开发者实现辅助功能的功能。 使用辅助功能服务:开发者可以创建一个辅助功能服...
    99+
    2023-10-23
    android
  • Android Studio实现简单绘图板
    本文实例为大家分享了Android Studio实现简单绘图板的具体代码,供大家参考,具体内容如下 目的 设计一个手绘图形的画板 工具及环境 使用java语言,在Android st...
    99+
    2024-04-02
  • android实现简单拼图游戏
    本文实例为大家分享了android实现简单拼图游戏的具体代码,供大家参考,具体内容如下 1. 2. //使用回调接口,首先初始化pintuview并绑定,实现回调接口的方法    ...
    99+
    2024-04-02
  • Android辅助功如何实现自动抢红包
    这篇文章主要介绍Android辅助功如何实现自动抢红包,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一、描述最近看到同事有用抢红包的软件,就想看看抢红包的具体实现是如何的,所以了解了一下,有用辅助功能实现的,所以在下...
    99+
    2023-05-30
    android
  • Android实现简单的banner轮播图
    本文实例为大家分享了Android实现简单banner轮播图的具体代码,供大家参考,具体内容如下 说明:想玩一个简单的轮播图效果  用的第三方的框架玩一下,支持设置轮播图多...
    99+
    2024-04-02
  • Android 实现圆角图片的简单实例
    Android 实现圆角图片的简单实例实现效果图:本来想在网上找个圆角的例子看一看,不尽人意啊,基本都是官方的Demo的那张原理图,稍后会贴出。于是自己自定义了个View,实现图片的圆角以及圆形效果。效果图:Android 圆角图片的实现形...
    99+
    2023-05-31
    android 圆角图片 roi
  • Android实现简单计算器
    本文实例为大家分享了Android实现简单计算器的具体代码,供大家参考,具体内容如下 功能 1、加减乘除四则运算 2、归0 3、回退 4、即时运算 配置 在build.gradle...
    99+
    2024-04-02
  • Android Studio怎么实现简单绘图板
    这篇“Android Studio怎么实现简单绘图板”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Android&...
    99+
    2023-06-30
  • android如何实现简单拼图游戏
    小编给大家分享一下android如何实现简单拼图游戏,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!具体内容如下//使用回调接口,首先初始化pintuview并绑定,实现回调接口的方法   &n...
    99+
    2023-06-29
  • android网络图片查看器简单实现代码
    本文实例为大家分享了android网络图片查看器的具体代码,供大家参考,具体内容如下效果图:输入一个图片url转换成bitmap位图展示到ImageView上xml:<?xml version="1.0" encoding="...
    99+
    2023-05-31
    android 图片查看器 roi
  • C语言实现数独辅助器(附源码)
    目录数独游戏介绍数独辅助器编写思路效果图源码数独游戏介绍 数独是源自瑞士的一种数学游戏。是一种运用纸、笔进行演算的逻辑游戏。玩家需要根据 9×9 盘面上的已知数字,推理出...
    99+
    2023-01-11
    C语言实现数独辅助器 C语言数独辅助器 C语言数独
  • android控件Banner实现简单轮播图效果
    本文实例为大家分享了android控件Banner实现简单轮播图效果的具体代码,供大家参考,具体内容如下 实现这个轮播图是在Fragment里实现的,所以要想实现,首先要创建Frag...
    99+
    2024-04-02
  • Android简单实现引导页
    本文实例为大家分享了Android简单实现引导页的具体代码,供大家参考,具体内容如下 一.思路 我们选择ViewPager + View + ImageView 来实现引导页效果,V...
    99+
    2024-04-02
  • Android实现简单购物车
    本文实例为大家分享了Android实现简单购物车的具体代码,供大家参考,具体内容如下 这里我用到的都是Android自带SDK中的资源,做了一个极其简单的购物车实现,总结购物车难点包...
    99+
    2024-04-02
  • Android实现简单的音乐播放器
    本文实例为大家分享了Android实现简单音乐播放器的具体代码,供大家参考,具体内容如下 1.制作一个简易的音乐播放器 使用软件:Android studio + jdk1.8 + ...
    99+
    2024-04-02
  • Android Studio实现简单计算器开发
    本文实例为大家分享了Android Studio实现简单计算器开的具体代码,供大家参考,具体内容如下 效果展示: 路径和文件: AndroidManifest.xml <...
    99+
    2024-04-02
  • Android实现一个简单的单词本
    目录布局设计代码AddDanciActivity.javaDBOpenHelper.java效果图总结本文基于Java实现了一个简单的单词本安卓app,用的是SQLite数据库,包括...
    99+
    2024-04-02
  • Android实现简单点赞动画
    本文实例为大家分享了Android实现简单点赞动画的具体代码,供大家参考,具体内容如下 思路 1、找到Activity中DecorView的RootView 2、确定点赞控件位于屏幕...
    99+
    2024-04-02
  • Android简单实现文件下载
    本文实例为大家分享了Android简单实现文件下载的具体代码,供大家参考,具体内容如下 权限 <!-- 文件读写权限 --> <uses-permissio...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作