# PagerGallerySaveDemo **Repository Path**: jack_of_disco/pager-gallery-save-demo ## Basic Information - **Project Name**: PagerGallerySaveDemo - **Description**: B站学习,包括java和kt两个源码,https://www.bilibili.com/video/BV1hJ411e7PV - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2021-02-26 - **Last Updated**: 2021-10-08 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # PagerCallerySave - 结合PagerCallery项目笔记 - 与PagerCallery一样,多一个动态申请写的权限,因为要保存 - 提前占好宽高比,添加用户信息,点赞数,收藏数 - pojo添加图片高度,用户,点赞数,收藏数字段 ```kotlin @Parcelize data class PhotoItem( @SerializedName("id") val photoId: Int, @SerializedName("webformatURL") val previewUrl: String, @SerializedName("largeImageURL") val fullUrl: String, @SerializedName("webformatHeight") val photoHeight: Int, @SerializedName("user") val photoUser: String, @SerializedName("likes") val photoLikes: Int, @SerializedName("favorites") val photoFavorites: Int ) : Parcelable ``` - 在cell_gallery布局上添加用户TextView,添加点赞数,添加收藏数 ![输入图片说明](https://images.gitee.com/uploads/images/2021/0226/144930_5b14b0a5_5475989.png "image-20210226094353476.png") - 既然修改了cell_gallery,那么gallery也要修改,来显示用户名字,点赞数,收藏数 ```kotlin override fun onBindViewHolder(holder: GalleryViewHolder, position: Int) { val photoItem = getItem(position) holder.itemView.apply { shimmerLayout.apply { setShimmerAngle(30) setShimmerColor(0x55FFFFFF) startShimmerAnimation() } imageViewGallery.layoutParams.height = photoItem.photoHeight textViewUser.text = photoItem.photoUser textViewFavorites.text = photoItem.photoFavorites.toString() textViewLike.text = photoItem.photoLikes.toString() } Glide.with(holder.itemView) .load(getItem(position).previewUrl) .placeholder(R.drawable.ic_baseline_photo_24) .listener(object : RequestListener { override fun onLoadFailed(e: GlideException?, model: Any?, target: Target?, isFirstResource: Boolean): Boolean { Log.d("myTAG", "onLoadFailed: 图片加载失败") return false } override fun onResourceReady(resource: Drawable?, model: Any?, target: Target?, dataSource: DataSource?, isFirstResource: Boolean): Boolean { return false.also { holder.itemView.shimmerLayout.stopShimmerAnimation() } } }) .into(holder.itemView.imageViewGallery) } ``` - 在fragment_photo上添加一个下载的图片按钮 ![输入图片说明](https://images.gitee.com/uploads/images/2021/0226/145040_b48d9c65_5475989.png "image-20210226094727085.png") - 在PhotoFragment类中编写下载点击事件 - 点击事件 ```kotlin const val REQUEST_WRITE_EXTERNAL_STORAGE = 1//常量 saveButton.setOnClickListener { if (Build.VERSION.SDK_INT < 29 && ContextCompat.checkSelfPermission(requireContext(), Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { requestPermissions(arrayOf(Manifest.permission.WRITE_EXTERNAL_STORAGE), REQUEST_WRITE_EXTERNAL_STORAGE) } else { viewLifecycleOwner.lifecycleScope.launch { savePhoto() } } Log.e("myTAG", "onActivityCreated: 下载图片点击") } ``` - 保存事件savePhoto ```kotlin private suspend fun savePhoto() { withContext(Dispatchers.IO) { val holder = (viewPager2[0] as RecyclerView).findViewHolderForAdapterPosition(viewPager2.currentItem) as PhotoViewHolder val bitmap = holder.itemView.imageViewPhoto.drawable.toBitmap() val saveUri = requireContext().contentResolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, ContentValues()) ?: kotlin.run { Toast.makeText(requireContext(), "存储失败", Toast.LENGTH_LONG).show() return@withContext } requireContext().contentResolver.openOutputStream(saveUri).use { if (bitmap.compress(Bitmap.CompressFormat.JPEG, 90, it)) { MainScope().launch { Toast.makeText(requireContext(), "存储成功", Toast.LENGTH_LONG).show() } } else { Toast.makeText(requireContext(), "存储失败", Toast.LENGTH_LONG).show() } } } } ``` - 重写onRequestPermissionsResult ```kotlin override fun onRequestPermissionsResult(requestCode: Int, permissions: Array, grantResults: IntArray) { super.onRequestPermissionsResult(requestCode, permissions, grantResults) when (requestCode) { REQUEST_WRITE_EXTERNAL_STORAGE -> { if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) { viewLifecycleOwner.lifecycleScope.launch { savePhoto() } } else { Toast.makeText(requireContext(), "存储失败", Toast.LENGTH_LONG).show() } } } } ``` ## JAVA版本 因为java版本没有找到协程,所以就直接进行了存储 ```java package com.zyl.pagergallerysave_java.fragment; import android.Manifest; import android.content.ContentValues; import android.content.Context; import android.content.pm.PackageManager; import android.graphics.Bitmap; import android.graphics.drawable.BitmapDrawable; import android.net.Uri; import android.os.Build; import android.os.Bundle; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.core.content.ContextCompat; import androidx.fragment.app.Fragment; import androidx.lifecycle.Lifecycle; import androidx.lifecycle.LifecycleEventObserver; import androidx.lifecycle.LifecycleOwner; import androidx.recyclerview.widget.RecyclerView; import androidx.viewpager2.widget.ViewPager2; import android.os.Parcelable; import android.provider.MediaStore; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView; import android.widget.Toast; import com.zyl.pagergallerysave_java.R; import com.zyl.pagergallerysave_java.adapter.GalleryAdapter; import com.zyl.pagergallerysave_java.adapter.PhotoAdapter; import java.io.FileNotFoundException; import java.io.OutputStream; import java.util.ArrayList; import java.util.Arrays; public class PhotoFragment extends Fragment { private ViewPager2 viewPager2; private TextView textViewNumber; private ImageView imageViewDownload; public static final int REQUEST_WRITE_EXTERNAL_STORAGE = 1; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflate the layout for this fragment View view = inflater.inflate(R.layout.fragment_photo, container, false); viewPager2 = view.findViewById(R.id.viewPager2); textViewNumber = view.findViewById(R.id.textViewNumber); imageViewDownload = view.findViewById(R.id.imageViewDownload); return view; } @Override public void onActivityCreated(@Nullable Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); PhotoAdapter photoAdapter = new PhotoAdapter(); final ArrayList photoList = getArguments().getParcelableArrayList(GalleryAdapter.PHOTO_LIST); photoAdapter.submitList(photoList); viewPager2.setAdapter(photoAdapter); viewPager2.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() { @Override public void onPageSelected(int position) { super.onPageSelected(position); textViewNumber.setText(position + 1 + " / " + photoList.size()); } }); viewPager2.setCurrentItem(getArguments().getInt(GalleryAdapter.PHOTO_POSITION), false); viewPager2.setOrientation(ViewPager2.ORIENTATION_VERTICAL); imageViewDownload.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (Build.VERSION.SDK_INT < 29 && ContextCompat.checkSelfPermission(requireContext(), Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { //本地方法,需要重写 requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_WRITE_EXTERNAL_STORAGE); } else { savePhoto(); } } }); } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == REQUEST_WRITE_EXTERNAL_STORAGE) { savePhoto(); } else { Toast.makeText(requireContext(), "存储失败", Toast.LENGTH_SHORT).show(); } } private void savePhoto() { // bitmap.compress(Bitmap.CompressFormat.PNG, 100, openFileOutput("picture", Context.MODE_PRIVATE)); // new Thread(new Runnable() { // @Override // public void run() { RecyclerView recyclerView = (RecyclerView) viewPager2.getChildAt(0); PhotoAdapter.PhotoViewHolder holder = (PhotoAdapter.PhotoViewHolder) recyclerView.findViewHolderForAdapterPosition(viewPager2.getCurrentItem()); Bitmap bitmap = ((BitmapDrawable) holder.photoView.getDrawable()).getBitmap(); try { Uri saveUri = requireContext().getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, new ContentValues()); OutputStream outputStream = requireContext().getContentResolver().openOutputStream(saveUri); if (bitmap.compress(Bitmap.CompressFormat.JPEG, 90, outputStream)) { Log.d("myTAG", "run: 存储成功"); Toast.makeText(requireContext(), "存储成功", Toast.LENGTH_SHORT).show(); } else { Toast.makeText(requireContext(), "存储失败", Toast.LENGTH_SHORT).show(); } } catch (Exception e) { Toast.makeText(requireContext(), "存储失败", Toast.LENGTH_SHORT).show(); e.printStackTrace(); } // } // }).start(); } } ```