最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android開(kāi)發(fā)之保存圖片到相冊(cè)的三種方法詳解

 更新時(shí)間:2022年04月13日 08:10:21   作者:xiayiye5  
這篇文章主要介紹了Android開(kāi)發(fā)實(shí)現(xiàn)的保存圖片到相冊(cè)功能的三種方法,文中的示例代碼講解詳細(xì),有一定的參考價(jià)值,感興趣的可以了解一下

有三種方法如下:三個(gè)方法都需要?jiǎng)討B(tài)申請(qǐng)讀寫(xiě)權(quán)限否則保存圖片到相冊(cè)也會(huì)失敗

方法一

 /**
     * 保存bitmap到本地
     *
     * @param bitmap Bitmap
     */
    public static void saveBitmap(Bitmap bitmap, String path) {
        String savePath;
        File filePic;
        if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
            savePath = path;
        } else {
            Log.e("tag", "saveBitmap failure : sdcard not mounted");
            return;
        }
        try {
            filePic = new File(savePath);
            if (!filePic.exists()) {
                filePic.getParentFile().mkdirs();
                filePic.createNewFile();
            }
            FileOutputStream fos = new FileOutputStream(filePic);
            bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos);
            fos.flush();
            fos.close();
        } catch (IOException e) {
            Log.e("tag", "saveBitmap: " + e.getMessage());
            return;
        }
        Log.i("tag", "saveBitmap success: " + filePic.getAbsolutePath());
    }

方法二

針對(duì)小于API29以下方法,此方法會(huì)通知圖庫(kù)更新

 
    /**
     * API 29及以下保存圖片到相冊(cè)的方法
     *
     * @param toBitmap 要保存的圖片
     */
    private void saveImage(Bitmap toBitmap) {
        String insertImage = MediaStore.Images.Media.insertImage(getContentResolver(), toBitmap, "壁紙", "搜索貓相關(guān)圖片后保存的圖片");
        if (!TextUtils.isEmpty(insertImage)) {
            Toast.makeText(this, "圖片保存成功!" + insertImage, Toast.LENGTH_SHORT).show();
            Log.e("打印保存路徑", insertImage + "-");
        }
    }

方法三

針對(duì)大于API29以下方法,此方法也會(huì)通知圖庫(kù)更新

  /**
     * API29 中的最新保存圖片到相冊(cè)的方法
     */
    private void saveImage29(Bitmap toBitmap) {
        //開(kāi)始一個(gè)新的進(jìn)程執(zhí)行保存圖片的操作
        Uri insertUri = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, new ContentValues());
        //使用use可以自動(dòng)關(guān)閉流
        try {
            OutputStream outputStream = getContentResolver().openOutputStream(insertUri, "rw");
            if (toBitmap.compress(Bitmap.CompressFormat.JPEG, 90, outputStream)) {
                Log.e("保存成功", "success");
            } else {
                Log.e("保存失敗", "fail");
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }

上面方法二和方法三是java的寫(xiě)法,kotlin寫(xiě)法如下

package com.xiayiye.jetpackstudy.gallery


import android.Manifest
import android.content.ContentValues
import android.content.pm.PackageManager
import android.graphics.Bitmap
import android.os.Build
import android.os.Bundle
import android.provider.MediaStore
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Toast
import androidx.core.content.ContextCompat
import androidx.core.graphics.drawable.toBitmap
import androidx.core.view.get
import androidx.fragment.app.Fragment
import androidx.lifecycle.lifecycleScope
import androidx.recyclerview.widget.RecyclerView
import androidx.viewpager2.widget.ViewPager2
import com.xiayiye.jetpackstudy.R
import kotlinx.android.synthetic.main.fragment_view_pager2_image.*
import kotlinx.android.synthetic.main.pager_photo_view.view.*
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.MainScope
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext

/**
 * 顯示輪播大圖和保存圖片的頁(yè)面
 */

class ViewPager2ImageFragment : Fragment() {
    companion object {
        const val REQUEST_WRITE_EXTERNAL_STORAGE_CODE = 1000
    }

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        return inflater.inflate(R.layout.fragment_view_pager2_image, container, false)
    }

    override fun onActivityCreated(savedInstanceState: Bundle?) {
        super.onActivityCreated(savedInstanceState)
        val photoList = arguments?.getParcelableArrayList<PhotoItem>("photo_list")
        val currentPosition = arguments?.getInt("photo_position", 0)
        PagerPhotoListAdapter().apply {
            vp2Banner.adapter = this
            submitList(photoList)
        }
        //設(shè)置輪播圖片后的滑動(dòng)當(dāng)前頁(yè)
        vp2Banner.registerOnPageChangeCallback(object : ViewPager2.OnPageChangeCallback() {
            override fun onPageSelected(position: Int) {
                super.onPageSelected(position)
                tvShowImagePage.text =
                    StringBuffer().append(position + 1).append("/").append(photoList?.size)
            }
        })
        //設(shè)置 ViewPager2 的當(dāng)前頁(yè)要在設(shè)置 ViewPager2 的數(shù)據(jù)后在設(shè)置當(dāng)前頁(yè)面,否則不生效
        vp2Banner.setCurrentItem(currentPosition ?: 0, false)
        //設(shè)置縱向滾動(dòng)的方法
        vp2Banner.orientation = ViewPager2.ORIENTATION_VERTICAL
        //保存圖片的方法
        ivSaveImg.setOnClickListener {
            if (Build.VERSION.SDK_INT < 29 && ContextCompat.checkSelfPermission(
                    requireContext(), Manifest.permission.WRITE_EXTERNAL_STORAGE
                ) != PackageManager.PERMISSION_GRANTED
            ) {
                requestPermissions(
                    arrayOf<String>(Manifest.permission.WRITE_EXTERNAL_STORAGE),
                    REQUEST_WRITE_EXTERNAL_STORAGE_CODE
                )
            } else {
                viewLifecycleOwner.lifecycleScope.launch { saveImage29() }
            }
        }
    }

    override fun onRequestPermissionsResult(
        requestCode: Int,
        permissions: Array<out String>,
        grantResults: IntArray
    ) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults)
        if (requestCode == REQUEST_WRITE_EXTERNAL_STORAGE_CODE && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            //權(quán)限申請(qǐng)成功可以保存圖片
            viewLifecycleOwner.lifecycleScope.launch { saveImage29() }
        }
    }

    /**
     * 保存圖片到相冊(cè)的方法
     *  API29 后此方法已廢棄
     */
    private fun saveImage() {
        val holder =
            (vp2Banner[0] as RecyclerView).findViewHolderForAdapterPosition(vp2Banner.currentItem) as PagerPhotoListAdapter.PagerPhotoViewHolder
        val toBitmap = holder.itemView.ivPagerView.drawable.toBitmap()
        val insertImage = MediaStore.Images.Media.insertImage(
            requireActivity().contentResolver, toBitmap, "壁紙", "搜索貓相關(guān)圖片后保存的圖片"
        )
        if (insertImage.isNotEmpty()) {
            Toast.makeText(requireActivity(), "圖片保存成功!-${insertImage}", Toast.LENGTH_SHORT).show()
        } else {
            Toast.makeText(requireActivity(), "圖片保存失??!}", Toast.LENGTH_SHORT).show()
        }
    }

    /**
     * API29 中的最新保存圖片到相冊(cè)的方法
     */
    private suspend fun saveImage29() {
        //開(kāi)始一個(gè)新的進(jìn)程執(zhí)行保存圖片的操作
        withContext(Dispatchers.IO) {
            val holder =
                (vp2Banner[0] as RecyclerView).findViewHolderForAdapterPosition(vp2Banner.currentItem) as PagerPhotoListAdapter.PagerPhotoViewHolder
            val toBitmap = holder.itemView.ivPagerView.drawable.toBitmap()
            val insertUri = requireActivity().contentResolver.insert(
                MediaStore.Images.Media.EXTERNAL_CONTENT_URI, ContentValues()
            ) ?: kotlin.run {
                showSaveToast("保存失敗!")
                return@withContext
            }
            //使用use可以自動(dòng)關(guān)閉流
            requireActivity().contentResolver.openOutputStream(insertUri).use {
                if (toBitmap.compress(Bitmap.CompressFormat.JPEG, 90, it)) {
                    showSaveToast("保存成功!")
                } else {
                    showSaveToast("保存失?。?)
                }
            }
        }
    }

    /**
     * 顯示保存圖片結(jié)果的方法
     */
    private fun showSaveToast(showMsg: String) =
        MainScope().launch {
            Toast.makeText(requireActivity(), showMsg, Toast.LENGTH_SHORT).show()
        }
}

到此這篇關(guān)于Android開(kāi)發(fā)之保存圖片到相冊(cè)的三種方法詳解的文章就介紹到這了,更多相關(guān)Android保存圖片到相冊(cè)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Android學(xué)習(xí)筆記45之gson解析json

    Android學(xué)習(xí)筆記45之gson解析json

    JSON即JavaScript Object Natation,是一種輕量級(jí)的數(shù)據(jù)交換格式,采用完全獨(dú)立于語(yǔ)言的文本格式,為Web開(kāi)發(fā)提供了一種理想的數(shù)據(jù)交換格式。通過(guò)本篇文章給大家介紹Android學(xué)習(xí)筆記45之gson解析json的相關(guān)內(nèi)容,對(duì)android gson解析json相關(guān)知識(shí)感興趣的朋友一起學(xué)習(xí)吧
    2015-12-12
  • Flutter?DateTime日期轉(zhuǎn)換的詳細(xì)使用

    Flutter?DateTime日期轉(zhuǎn)換的詳細(xì)使用

    本文主要介紹了Flutter?DateTime日期轉(zhuǎn)換的詳細(xì)使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05
  • Android實(shí)現(xiàn)強(qiáng)制下線功能的示例代碼

    Android實(shí)現(xiàn)強(qiáng)制下線功能的示例代碼

    這篇文章主要介紹了Android實(shí)現(xiàn)強(qiáng)制下線功能的示例代碼,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-07-07
  • Android編程添加快捷方式(Short)到手機(jī)桌面的方法(含添加,刪除及查詢)

    Android編程添加快捷方式(Short)到手機(jī)桌面的方法(含添加,刪除及查詢)

    這篇文章主要介紹了Android編程添加快捷方式(Short)到手機(jī)桌面的方法,含有針對(duì)桌面快捷方式的添加,刪除及查詢的操作實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2016-01-01
  • android實(shí)現(xiàn)常駐通知欄遇到的問(wèn)題及解決辦法

    android實(shí)現(xiàn)常駐通知欄遇到的問(wèn)題及解決辦法

    這篇文章主要介紹了android實(shí)現(xiàn)常駐通知欄遇到的問(wèn)題及解決辦法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-06-06
  • Android打造炫酷進(jìn)度條效果

    Android打造炫酷進(jìn)度條效果

    這篇文章主要為大家詳細(xì)介紹了Android打造炫酷進(jìn)度條效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-10-10
  • 詳解adb工具的基本使用

    詳解adb工具的基本使用

    adb全稱Android Debug Bridge,是Android SDK中的一個(gè)工具, 使用adb可以直接操作管理Android模擬器或者真實(shí)的Andriod設(shè)備,就是起到調(diào)試橋的作用,這篇文章主要介紹了adb工具的基本使用,需要的朋友可以參考下
    2022-08-08
  • Android視圖控件架構(gòu)分析之View、ViewGroup

    Android視圖控件架構(gòu)分析之View、ViewGroup

    這篇文章主要為大家詳細(xì)介紹了Android視圖控件架構(gòu)分析之View、ViewGroup,感興趣的朋友可以參考一下
    2016-05-05
  • Android實(shí)現(xiàn)View滑動(dòng)效果的6種方法

    Android實(shí)現(xiàn)View滑動(dòng)效果的6種方法

    這篇文章主要介紹了Android實(shí)現(xiàn)View滑動(dòng)的6種方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-03-03
  • Android Flutter實(shí)現(xiàn)淘寶App的搜索推薦

    Android Flutter實(shí)現(xiàn)淘寶App的搜索推薦

    這篇文章主要為大家詳細(xì)介紹了Android?Flutter如何模擬實(shí)現(xiàn)淘寶App的搜索推薦,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,感興趣的可以了解一下
    2023-07-07

最新評(píng)論

磴口县| 青铜峡市| 江城| 阿克苏市| 陆河县| 云霄县| 炉霍县| 土默特左旗| 阳山县| 永宁县| 翼城县| 吉水县| 会同县| 从化市| 清新县| 德昌县| 上林县| 莲花县| 广德县| 盐城市| 清徐县| 迭部县| 永登县| 托克逊县| 六枝特区| 泸州市| 闽侯县| 门头沟区| 大邑县| 都昌县| 滦南县| 蒙自县| 彭州市| 二连浩特市| 孝昌县| 新密市| 乌什县| 西平县| 罗城| 长沙县| 和龙市|