Android踩坑日记:监听软键盘多次调用和刷新系统相册和获取所有相片

本文主要是介绍Android踩坑日记:监听软键盘多次调用和刷新系统相册和获取所有相片,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

EditText设置监听软键盘删除键(或enter)

  • 一般使用方法
edittext.setOnKeyListener(new View.OnKeyListener(){@Overridepublic boolean onKey(View v, int keyCode, KeyEvent event) {if (keyCode == KeyEvent.KEYCODE_DEL ){//处理操作}}
});
  • 问题:
    当点击软键盘的删除键时,处理操作会只执行两次或多次

  • 爬坑姿势:

edittext.setOnKeyListener(new View.OnKeyListener(){@Overridepublic boolean onKey(View v, int keyCode, KeyEvent event) {/*必须是这两个条件,否则会执行多次*/if (keyCode == KeyEvent.KEYCODE_DEL && event.getAction()==KeyEvent.ACTION_DOWN){//处理操作}}
});

刷新系统相册

当我们在系统的相册中增加或者删除图片,需要再次获取系统相册的所有图片时,需要通知系统刷新一下系统相册

/*通知系统刷新相册*/public static void noticeSystemRefreshAlbum(Context context,String path){Intent mediaScanIntent=new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);Uri uri=null;if (path!=null){uri= Uri.fromFile(new File(path));}mediaScanIntent.setData(uri);mediaScanIntent = PermissionUtil.getUriAuthority(mediaScanIntent);context.sendBroadcast(mediaScanIntent);}public static Intent getUriAuthority(Intent intent) {//对于android M及更高版本,intent需要提供URI相关权限以操作文件//文件uri需要通过FileProvider获取if (Build.VERSION.SDK_INT > Build.VERSION_CODES.M) {intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);}return intent;}

获取系统所有图片和按相册名分类

/*本地相片文件描述类*/
public class LocalPhotoBean implements Serializable{/** 系统数据库中的id */public long mediaId;/*文件名*/public String fileName;/*文件路径*/public String path;/*缩略图路径*/public String thumbNailPath;/*文件大小*/public long fileSize;/*所属文件夹名称*/public String albumName;/*文件夹识别id*/public String albumId;/*缓存用于显示的路径*/private String showPicPath;
}
/*相册文件夹描述类*/
public class PhotoAlbumBean  implements Serializable{/*文件夹识别Id*/public String albumId;/*文件夹名称*/public String albumName;/*文件夹封面路径*/public String albumCoverPath;/*文件夹封面缩略图路径*/public String albumCoverThumbNailPath;/*文件夹包含的图片*/public ArrayList<LocalPhotoBean> imageList;/*缓存的用于显示的路径*/private String showPicPath;}/*查询返回结果集*/public static class LocalPhotoDataList{//所有图片列表public ArrayList<LocalPhotoBean> photoList;//相册文件夹列表public ArrayList<PhotoAlbumBean> albumList;public LocalPhotoDataList(ArrayList<LocalPhotoBean> photoList, ArrayList<PhotoAlbumBean> albumList) {this.photoList = photoList;this.albumList = albumList;}}/***  通过ContentResolver ,查询本地图片信息* @param resolver* @return*/public static LocalPhotoDataList getLocalPhotos(ContentResolver resolver, int minImageSize){ArrayList<LocalPhotoBean> photoList=new ArrayList<>();HashMap<String ,PhotoAlbumBean> albumMap=new HashMap<>();ArrayList<PhotoAlbumBean> albumList=new ArrayList<>();Cursor cursor=null;try {//需要查询的数据'String[] queryColumns={MediaStore.Images.ImageColumns.DISPLAY_NAME,//图片名MediaStore.Images.ImageColumns.DATA,//图片路径MediaStore.Images.ImageColumns._ID,//图片数据库MediaStore.Images.ImageColumns.BUCKET_ID,//图片所在文件夹IdMediaStore.Images.ImageColumns.BUCKET_DISPLAY_NAME,//图片所在文件夹文件名MediaStore.Images.ImageColumns.SIZE,//图片大小MediaStore.Images.ImageColumns.MIME_TYPE,//图片格式MediaStore.Images.ImageColumns.MINI_THUMB_MAGIC,//缩略图IdMediaStore.Images.ImageColumns.DATE_MODIFIED//修改时间};//查询的条件String selection=MediaStore.Images.ImageColumns.SIZE +" >= ? AND "+MediaStore.Images.ImageColumns.MIME_TYPE + " != ? ";//排序规则 修改时间降序排列String orderBy=MediaStore.Images.ImageColumns.DATE_MODIFIED+" DESC";String[] args=new String[]{String.valueOf(minImageSize),"image/gif"};//查询资源数据cursor=resolver.query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,queryColumns,selection,args,orderBy);if (cursor!=null&&cursor.moveToFirst()){int IndexName=cursor.getColumnIndex(MediaStore.Images.ImageColumns.DISPLAY_NAME);int IndexPath=cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA);int IndexId=cursor.getColumnIndex(MediaStore.Images.ImageColumns._ID);int IndexBucket=cursor.getColumnIndex(MediaStore.Images.ImageColumns.BUCKET_ID);int IndexBucketName=cursor.getColumnIndex(MediaStore.Images.ImageColumns.BUCKET_DISPLAY_NAME);int IndexSize=cursor.getColumnIndex(MediaStore.Images.ImageColumns.SIZE);int IndexThumbId=cursor.getColumnIndex(MediaStore.Images.ImageColumns.MINI_THUMB_MAGIC);do{LocalPhotoBean photoItem=new LocalPhotoBean().setMediaId(cursor.getLong(IndexId)).setFileName(cursor.getString(IndexName)).setPath(cursor.getString(IndexPath)).setAlbumName(cursor.getString(IndexBucketName)).setAlbumId(cursor.getString(IndexBucket)).setFileSize(cursor.getLong(IndexSize))/*暂时缩略图*/;photoList.add(photoItem);//刷新文件夹集合数据PhotoAlbumBean photoAlbum=albumMap.get(photoItem.albumId);if (photoAlbum==null){photoAlbum=PhotoAlbumBean.getInstance(photoItem.albumName,photoItem.albumId);albumMap.put(photoItem.albumId,photoAlbum);}photoAlbum.addItem(photoItem);}while (cursor.moveToNext());}/*相册文件夹列表*/albumList.addAll(albumMap.values());/*排序*/Collections.sort(albumList);return new LocalPhotoDataList(photoList, albumList);}catch (SecurityException se) {} catch (Exception e) {e.printStackTrace();LogUtils.d(ApiConstants.MEDIA_LOG_TAG, "Error getLocalPhotos");} finally {if (cursor != null) {cursor.close();}}return null;}

这篇关于Android踩坑日记:监听软键盘多次调用和刷新系统相册和获取所有相片的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/937526

相关文章

Python跨文件实例化、跨文件调用及导入库示例代码

《Python跨文件实例化、跨文件调用及导入库示例代码》在Python开发过程中,经常会遇到需要在一个工程中调用另一个工程的Python文件的情况,:本文主要介绍Python跨文件实例化、跨文件调... 目录1. 核心对比表格(完整汇总)1.1 自定义模块跨文件调用汇总表1.2 第三方库使用汇总表1.3 导

使用Python的requests库调用API接口的详细步骤

《使用Python的requests库调用API接口的详细步骤》使用Python的requests库调用API接口是开发中最常用的方式之一,它简化了HTTP请求的处理流程,以下是详细步骤和实战示例,涵... 目录一、准备工作:安装 requests 库二、基本调用流程(以 RESTful API 为例)1.

Python调用LibreOffice处理自动化文档的完整指南

《Python调用LibreOffice处理自动化文档的完整指南》在数字化转型的浪潮中,文档处理自动化已成为提升效率的关键,LibreOffice作为开源办公软件的佼佼者,其命令行功能结合Python... 目录引言一、环境搭建:三步构建自动化基石1. 安装LibreOffice与python2. 验证安装

在Linux系统上连接GitHub的方法步骤(适用2025年)

《在Linux系统上连接GitHub的方法步骤(适用2025年)》在2025年,使用Linux系统连接GitHub的推荐方式是通过SSH(SecureShell)协议进行身份验证,这种方式不仅安全,还... 目录步骤一:检查并安装 Git步骤二:生成 SSH 密钥步骤三:将 SSH 公钥添加到 github

Go语言使用select监听多个channel的示例详解

《Go语言使用select监听多个channel的示例详解》本文将聚焦Go并发中的一个强力工具,select,这篇文章将通过实际案例学习如何优雅地监听多个Channel,实现多任务处理、超时控制和非阻... 目录一、前言:为什么要使用select二、实战目标三、案例代码:监听两个任务结果和超时四、运行示例五

Android Paging 分页加载库使用实践

《AndroidPaging分页加载库使用实践》AndroidPaging库是Jetpack组件的一部分,它提供了一套完整的解决方案来处理大型数据集的分页加载,本文将深入探讨Paging库... 目录前言一、Paging 库概述二、Paging 3 核心组件1. PagingSource2. Pager3.

Python获取浏览器Cookies的四种方式小结

《Python获取浏览器Cookies的四种方式小结》在进行Web应用程序测试和开发时,获取浏览器Cookies是一项重要任务,本文我们介绍四种用Python获取浏览器Cookies的方式,具有一定的... 目录什么是 Cookie?1.使用Selenium库获取浏览器Cookies2.使用浏览器开发者工具

Linux系统中查询JDK安装目录的几种常用方法

《Linux系统中查询JDK安装目录的几种常用方法》:本文主要介绍Linux系统中查询JDK安装目录的几种常用方法,方法分别是通过update-alternatives、Java命令、环境变量及目... 目录方法 1:通过update-alternatives查询(推荐)方法 2:检查所有已安装的 JDK方

Linux系统之lvcreate命令使用解读

《Linux系统之lvcreate命令使用解读》lvcreate是LVM中创建逻辑卷的核心命令,支持线性、条带化、RAID、镜像、快照、瘦池和缓存池等多种类型,实现灵活存储资源管理,需注意空间分配、R... 目录lvcreate命令详解一、命令概述二、语法格式三、核心功能四、选项详解五、使用示例1. 创建逻

Java获取当前时间String类型和Date类型方式

《Java获取当前时间String类型和Date类型方式》:本文主要介绍Java获取当前时间String类型和Date类型方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录Java获取当前时间String和Date类型String类型和Date类型输出结果总结Java获取