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

相关文章

C#实现系统信息监控与获取功能

《C#实现系统信息监控与获取功能》在C#开发的众多应用场景中,获取系统信息以及监控用户操作有着广泛的用途,比如在系统性能优化工具中,需要实时读取CPU、GPU资源信息,本文将详细介绍如何使用C#来实现... 目录前言一、C# 监控键盘1. 原理与实现思路2. 代码实现二、读取 CPU、GPU 资源信息1.

Python调用另一个py文件并传递参数常见的方法及其应用场景

《Python调用另一个py文件并传递参数常见的方法及其应用场景》:本文主要介绍在Python中调用另一个py文件并传递参数的几种常见方法,包括使用import语句、exec函数、subproce... 目录前言1. 使用import语句1.1 基本用法1.2 导入特定函数1.3 处理文件路径2. 使用ex

在C#中获取端口号与系统信息的高效实践

《在C#中获取端口号与系统信息的高效实践》在现代软件开发中,尤其是系统管理、运维、监控和性能优化等场景中,了解计算机硬件和网络的状态至关重要,C#作为一种广泛应用的编程语言,提供了丰富的API来帮助开... 目录引言1. 获取端口号信息1.1 获取活动的 TCP 和 UDP 连接说明:应用场景:2. 获取硬

JAVA系统中Spring Boot应用程序的配置文件application.yml使用详解

《JAVA系统中SpringBoot应用程序的配置文件application.yml使用详解》:本文主要介绍JAVA系统中SpringBoot应用程序的配置文件application.yml的... 目录文件路径文件内容解释1. Server 配置2. Spring 配置3. Logging 配置4. Ma

2.1/5.1和7.1声道系统有什么区别? 音频声道的专业知识科普

《2.1/5.1和7.1声道系统有什么区别?音频声道的专业知识科普》当设置环绕声系统时,会遇到2.1、5.1、7.1、7.1.2、9.1等数字,当一遍又一遍地看到它们时,可能想知道它们是什... 想要把智能电视自带的音响升级成专业级的家庭影院系统吗?那么你将面临一个重要的选择——使用 2.1、5.1 还是

Python MySQL如何通过Binlog获取变更记录恢复数据

《PythonMySQL如何通过Binlog获取变更记录恢复数据》本文介绍了如何使用Python和pymysqlreplication库通过MySQL的二进制日志(Binlog)获取数据库的变更记录... 目录python mysql通过Binlog获取变更记录恢复数据1.安装pymysqlreplicat

在MyBatis的XML映射文件中<trim>元素所有场景下的完整使用示例代码

《在MyBatis的XML映射文件中<trim>元素所有场景下的完整使用示例代码》在MyBatis的XML映射文件中,trim元素用于动态添加SQL语句的一部分,处理前缀、后缀及多余的逗号或连接符,示... 在MyBATis的XML映射文件中,<trim>元素用于动态地添加SQL语句的一部分,例如SET或W

C#实现获得某个枚举的所有名称

《C#实现获得某个枚举的所有名称》这篇文章主要为大家详细介绍了C#如何实现获得某个枚举的所有名称,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以参考一下... C#中获得某个枚举的所有名称using System;using System.Collections.Generic;usi

C#实现获取电脑中的端口号和硬件信息

《C#实现获取电脑中的端口号和硬件信息》这篇文章主要为大家详细介绍了C#实现获取电脑中的端口号和硬件信息的相关方法,文中的示例代码讲解详细,有需要的小伙伴可以参考一下... 我们经常在使用一个串口软件的时候,发现软件中的端口号并不是普通的COM1,而是带有硬件信息的。那么如果我们使用C#编写软件时候,如

高效管理你的Linux系统: Debian操作系统常用命令指南

《高效管理你的Linux系统:Debian操作系统常用命令指南》在Debian操作系统中,了解和掌握常用命令对于提高工作效率和系统管理至关重要,本文将详细介绍Debian的常用命令,帮助读者更好地使... Debian是一个流行的linux发行版,它以其稳定性、强大的软件包管理和丰富的社区资源而闻名。在使用