获取手机相册图片,Android10.0通用
Android10.0不能仅仅通过申请读写外存的权限来获取媒体文件。可以自己去查安卓文档。网上大家都在说Android10.0有三个新的媒体权:read _ media _ images,read _ media _ video,read _ media _ audio。但是我查了文档,没有查到这些权限的使用方法,所以无从下手。Android10.0及更早版本的常用方法是使用uri加载所需内容。
示例:
//获取一张图片,在代码下面使用私有位图Get one Photo(cursor cursor){//获取图片的存储位置的数据,得到图片的id int id=cursor . getint(cursor . getcolumn Index(mediastore . media columns . _ id));//底层外部存储uri uri base=uri . parse(' content 3360//media/external/images/media ');//每个uri=base uri id,使用函数组合URI NOW URI=uri . with appendpath(base,' ' ID);尝试{//使用filedescriptor将其作为位图parcel file descriptor parcel file descriptor=context . getcontentresolver()打开。openfiledescriptor (nowuri,' r ');bitmap bitmap=bitmap factory . decoverladescriptor(parcel file descriptor . getfile descriptor());//压缩位图以提高性能。可以选择位图=位图。通过各种方法创建Scaledbitmap(位图,120,100,true);返回位图;} catch (Exception E) {log.d('位图获取异常',E . tostring());}返回null}在}Android10.0之前,可以使用MediaStore。Images.Media.DATA属性来配合其他方法直接把它变成图片路径打开对应的图片,但是10.0以后新的权限申请让它无法使用,这个属性已经被标记为作废。一般获取位图都会进行压缩,否则会占用大量资源,导致手机因加载内容过多而卡顿甚至死机。
利用timer异步加载recycview的数据
耗时的操作不应该放在主线程中。计时器可用于定期加载数据,以最大限度地降低性能影响。
示例:
//覆盖TimerTask @ Override public void run(){//每次获取10(int j=0;j 10j ) { if(cursor!=null cursor.move to next () {//map对象存储位图,getOnePhoto是上面的方法photosmap.put (all photos,getone photo(cursor));//刷新总长度,用于判断其他要求all photos=photos map . size();} } } Recycview里的内容一般都能写。
//Set private void Set photo(int position,imageview imageview){ if(photos map . get(position)!=null){ imageview . set image bitmap(photos map . get(position));}}启动计时器:
//Timer Timer=new Timer();time task=new time task();//刷新,延迟0,间隔0.1秒timer.schedule(timeTask,0,100);动态加载recycleview时,速度可能跟不上手指的滑动速度,可以来回滑动保证加载。
Recycleview不好一次性加载,可以添加滚动监控和动态加载。
//添加滚动监视器show pictures . addonscrolllistener(newrecyclerview . onscrolllistener(){//滚动状态更改@ override public void onscrollstatechanged(@ nonnull recycler view recycler view,int new state){ super . onscrollstatechanged(recycler view,new state);//滚动到状态底部监听if(new state==recycle view . Scroll _ state _ idle){//边界值判断if(manager . findlastcompletelyvisibleitemposition()getitemcount()-2 getitemcount()=photos map . size()/3){//扩展当前int a=item counts=3;//更新一定数量的行notifyitemrangechanged(getitemcount(),a);} } }});