Android学习日志2020-1-22

获取手机相册图片,Android10.0通用

    Android10.0仅仅通过申请读取外部存储和写外部存储权限已经不能获取媒体文件。具体可自行查看Android文档,网上查阅所有人都在说,Android10.0三个新的媒体权限:READ_MEDIA_IMAGES,READ_MEDIA_VIDEO,READ_MEDIA_AUDIO。但是我查找了文档没发现这几个权限如何使用,无从下手。对于Android10.0和老版本通用的方法是使用uri加载所需内容。
示例

//获取一个图片,代码下面还有用
    private Bitmap getOnePhoto(Cursor cursor)
    {
        //获取图片保存位置数据,获取图片的id
        int id = cursor.getInt(cursor.getColumnIndex(MediaStore.MediaColumns._ID));
        //基础外部存储uri
        Uri base = Uri.parse("content://media/external/images/media");
        //每一个uri=基础uri+id,使用函数组合
        Uri nowUri = Uri.withAppendedPath(base, "" + id);
        try
        {
        //利用filedescriptor来打开为bitmap
            ParcelFileDescriptor parcelFileDescriptor =  context.getContentResolver().openFileDescriptor(nowUri, "r");
            Bitmap bitmap = BitmapFactory.decodeFileDescriptor(parcelFileDescriptor.getFileDescriptor());			//将bitmap压缩,提高性能,多种方法可自行选择
            bitmap = Bitmap.createScaledBitmap(bitmap, 120, 100, true);
            return bitmap;
        }
        catch ( Exception e)
        {
            Log.d("bitmap获取异常", e.toString());
        }
        return null;
    }

Android10.0以前可通过MediaStore.Images.Media.DATA属性配合其它方法并将其直接转为图片路径打开对应图片,但是10.0以后的新权限申请导致其无法使用,并且该属性已被标记为过时。一般获取bitmap都会压缩,否则将占用大量资源导致手机卡顿甚至因加载内容过多崩溃。

利用timer异步加载recycview的数据

    耗时操作不要放在主线程中,可以使用timer来定时的加载数据,尽可能减小性能影响。
示例:

//重写TimerTask的run方法
@Override
    public void run()
    {
        //每次获取10个
        for(int j = 0; j < 10; j++)
        {
            if(cursor != null && cursor.moveToNext())
            {
            	//map对象存储bitmap,getOnePhoto即为上面的方法
                photosMap.put(allPhotos, getOnePhoto(cursor));
                //刷新总长度,用于其它需求判断
                allPhotos = photosMap.size();
            }
        }
    }

    recycview中内容按照一般写法即可。

 //设置图片
    private void setPhoto(int position, ImageView imageView)
    {
        if(photosMap.get(position) != null)
        {
            imageView.setImageBitmap(photosMap.get(position));
        }
    }

    启动timer。

		//计时器
 		timer = new Timer();
        timeTask = new TimeTask();
        //刷新,延迟0,间隔0.1秒
        timer.schedule(timeTask, 0, 100);

    动态加载recycleview时可能速度跟不上手指的滑动速度,可以来回滑动确保加载。
    recycleview一次性加载完不太好,可以添加滚动监听动态加载。

//添加滚动监听
showPictures.addOnScrollListener(new RecyclerView.OnScrollListener() {
			//滚动状态改变
            @Override
            public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {
                super.onScrollStateChanged(recyclerView, newState);
                //滚动到底状态监听
                if(newState == RecyclerView.SCROLL_STATE_IDLE)
                {
                	//边界值判断
                    if(manager.findLastCompletelyVisibleItemPosition() > getItemCount() - 2  && getItemCount() <= photosMap.size() / 3)
                    {
                    	//扩充当前
                        int a = itemCounts += 3;
                        //更新一定行数
                   notifyItemRangeChanged(getItemCount(), a);
                    }
                }
            }
        });
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嘻嘻哈哈笑呵呵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值