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

Posted tuke_tuke

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;
    

以上是关于Android踩坑日记:监听软键盘多次调用和刷新系统相册和获取所有相片的主要内容,如果未能解决你的问题,请参考以下文章

Android之监听手机软键盘弹起与关闭

android设置软键盘搜索键以及监听搜索键点击时发生两次事件的问题解决

android设置软键盘搜索键以及监听搜索键点击时发生两次事件的问题解决

H5如何对android和ios手机软键盘的监听

Android 手机软键盘的弹起和关闭的监听

Android软键盘弹出和收回监听