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

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

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

  • 爬坑姿势:

edittext.setOnKeyListener(new View.OnKeyListener(){
    @Override
    public 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,//图片所在文件夹Id
                MediaStore.Images.ImageColumns.BUCKET_DISPLAY_NAME,//图片所在文件夹文件名
                MediaStore.Images.ImageColumns.SIZE,//图片大小
                MediaStore.Images.ImageColumns.MIME_TYPE,//图片格式
                MediaStore.Images.ImageColumns.MINI_THUMB_MAGIC,//缩略图Id
                MediaStore.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;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值