Blog of CodeJELLOW’S ENGINEERING NOTES
← 返回文章

Android JetPack学习总结(二十二)

Android JetPack学习总结(二十二) 完善PhotoGallery,保存图片

完善PhotoGallery,保存图片

根据欲加载的图片高度设置ImageView的高度:

TEXT
imageView.getLayoutParams().height=getItem(position).getPhotoHeight();

增加显示了一些新的数据。

图片暂不可用。
图片保存

首先创建一个Drawable资源,为一个按压之后状态会发生改变的按钮。

TEXT
<?xml version="1.0" encoding="utf-8"?><selector xmlns:android="http://schemas.android.com/apk/res/android">    <item android:state_pressed="true" android:drawable="@drawable/ic_baseline_saved_24"/>    <item android:drawable="@drawable/ic_baseline_save_24"/></selector>

申请写存储器权限:

首先要先在manifests中声明权限

TEXT
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

在点击保存按钮时动态申请权限

TEXT
saveButton.setOnClickListener(new View.OnClickListener() {    @Override    public void onClick(View view) {        if (Build.VERSION.SDK_INT<29&& ContextCompat.checkSelfPermission(requireContext(),                Manifest.permission.WRITE_EXTERNAL_STORAGE)!= PackageManager.PERMISSION_GRANTED){            Toast.makeText(getContext(),"onclick",Toast.LENGTH_LONG).show();            requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},REQUEST_WRITE);        }    }});

API 29以上的不需要动态申请权限了。

保存图片:

TEXT
    private void savePhoto(){        PagerPhotoViewHolder holder=(PagerPhotoViewHolder) ((RecyclerView)viewPager2.getChildAt(0)).findViewHolderForAdapterPosition(viewPager2.getCurrentItem());        Bitmap bitmap=((BitmapDrawable)((ImageView)holder.itemView.findViewById(R.id.pagerPhoto)).getDrawable()).getBitmap();        Uri saveUri=requireContext().getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,new ContentValues());        if (saveUri == null) {            Toast.makeText(requireContext(),"存储失败",Toast.LENGTH_LONG).show();            return;        }else {            OutputStream outputStream = null;            try {                outputStream=requireContext().getContentResolver().openOutputStream(saveUri);                bitmap.compress(Bitmap.CompressFormat.JPEG,90,outputStream);                Toast.makeText(requireContext(),"存储成功",Toast.LENGTH_LONG).show();            } catch (FileNotFoundException e) {                Toast.makeText(requireContext(),"存储失败",Toast.LENGTH_LONG).show();                e.printStackTrace();            }finally {                try {                    outputStream.close();                } catch (IOException e) {                    e.printStackTrace();                }            }        }        //低版本//        if (MediaStore.Images.Media.insertImage(requireContext().getContentResolver(),bitmap,"","")==null){//            Toast.makeText(requireContext(),"存储失败",Toast.LENGTH_LONG).show();//        }else {//            Toast.makeText(requireContext(),"存储成功",Toast.LENGTH_LONG).show();//        }    }

首先得获取保存图片的imageView,然后将其图片内容(drawable)转化为BItmap。注意这里有一个bug,当图片没加载出来时,点击保存按钮会将展位图保存,会报错:vectorDrawable can not cast to Bitmap。

通过 RSS 订阅更新 →