Android Androidx Glide下载图片到指定文件夹 Glide版本4.+ Glide4.+

2024-01-10 20:18

本文主要是介绍Android Androidx Glide下载图片到指定文件夹 Glide版本4.+ Glide4.+,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Android Androidx Glide下载图片到指定文件夹 Glide版本4.+ Glide4.+

环境:Android Studio 3.6.2 

    api ("com.github.bumptech.glide:glide:4.11.0") {exclude group: 'com.android.support'}annotationProcessor 'com.github.bumptech.glide:compiler:4.11.0'implementation 'com.squareup.retrofit2:2.2.0'implementation 'com.yanzhenjie:permission:2.0.3'

官方文档:http://bumptech.github.io/glide/doc/options.html

1、申请读取权限相关
 


import android.content.Context
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Space
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentActivity
import com.yanzhenjie.permission.AndPermissionobject PermissionHelper {fun hasPermission(context: Context, vararg permissions: String): Boolean {return AndPermission.hasPermissions(context, *permissions)}fun request(activity: FragmentActivity, callback: PermissionCallback, vararg permission: String) {if (hasPermission(activity, *permission)) {callback.onSuccess()return}val manager = activity.supportFragmentManagervar fragment: Fragment? = manager.findFragmentByTag("permission")if (fragment == null) {fragment = PermissionDelegate()}if (!fragment.isAdded) {val finalFragment = fragmentmanager.beginTransaction().add(fragment, "permission").runOnCommit { (finalFragment as PermissionDelegate).request(callback, *permission) }.commit()} else {(fragment as PermissionDelegate).request(callback, *permission)}}class PermissionDelegate : Fragment() {private var callback: PermissionCallback? = nulloverride fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {return Space(activity)}internal fun request(callback: PermissionCallback, vararg permissions: String) {this.callback = callbackif (isAdded && !isDetached) {AndPermission.with(this).runtime().permission(arrayOf(*permissions)).onGranted {callback.onSuccess()}.onDenied {if (AndPermission.hasAlwaysDeniedPermission(this, it)) {this.activity?.let { SettingDialog(it).show() }}}.start()}}}interface PermissionCallback {fun onSuccess()}}

申请权限拒绝弹框


import android.app.Activity;
import android.content.DialogInterface;
import android.content.Intent;
import android.net.Uri;
import android.provider.Settings;import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.StringRes;
import androidx.appcompat.app.AlertDialog;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentActivity;import java.util.Objects;public class SettingDialog {private AlertDialog.Builder mBuilder;private FragmentActivity context;public SettingDialog(@NonNull FragmentActivity context) {mBuilder = new AlertDialog.Builder(Objects.requireNonNull(context)).setCancelable(false).setTitle("权限申请失败").setMessage("我们需要的一些权限被您拒绝或者系统发生错误申请失败,请您到设置页面手动授权,否则功能无法正常使用!").setPositiveButton("去设置", mClickListener).setNegativeButton("取消", mClickListener);this.context = context;}@NonNullpublic SettingDialog setTitle(@NonNull String title) {mBuilder.setTitle(title);return this;}@NonNullpublic SettingDialog setTitle(@StringRes int title) {mBuilder.setTitle(title);return this;}@NonNullpublic SettingDialog setMessage(@NonNull String message) {mBuilder.setMessage(message);return this;}@NonNullpublic SettingDialog setMessage(@StringRes int message) {mBuilder.setMessage(message);return this;}@NonNullpublic SettingDialog setNegativeButton(@NonNull String text, @Nullable DialogInterface.OnClickListenernegativeListener) {mBuilder.setNegativeButton(text, negativeListener);return this;}@NonNullpublic SettingDialog setNegativeButton(@StringRes int text, @Nullable DialogInterface.OnClickListenernegativeListener) {mBuilder.setNegativeButton(text, negativeListener);return this;}@NonNullpublic SettingDialog setPositiveButton(@NonNull String text) {mBuilder.setPositiveButton(text, mClickListener);return this;}@NonNullpublic SettingDialog setPositiveButton(@StringRes int text) {mBuilder.setPositiveButton(text, mClickListener);return this;}public void show() {mBuilder.show();}private DialogInterface.OnClickListener mClickListener = new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {switch (which) {case DialogInterface.BUTTON_NEGATIVE:break;case DialogInterface.BUTTON_POSITIVE:Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);Uri uri = Uri.fromParts("package", context.getPackageName(), null);intent.setData(uri);startForResult(context, intent, 1);break;}}};private static void startForResult(Object object, Intent intent, int requestCode) {if (object instanceof Activity) {((Activity) object).startActivityForResult(intent, requestCode);} else if (object instanceof Fragment) {((Fragment) object).startActivityForResult(intent, requestCode);} else if (object instanceof android.app.Fragment) {((android.app.Fragment) object).startActivityForResult(intent, requestCode);}}
}


2.保存图片核心方法

fun (val activity:Activity){PermissionHelper.request(activity as FragmentActivity, object : PermissionHelper.PermissionCallback {override fun onSuccess() {val urlImage = "https://static.veer.com/veer/static/resources/keyword/2020-02-19/b94a42fb11d64052ae5a9baa25f5370c.jpg"val file = File(Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "图片文件夹1024", "我是保存下来的图片1024.png")val load = Glide.with(activity).asFile().load(urlImage).submit()val observable = Observable.just{}.subscribeOn(Schedulers.io()).observeOn(Schedulers.io()).map {load.get()}.observeOn(AndroidSchedulers.mainThread()).doOnError {val alarmToast = if (it is FileNotFoundException) "文件地址错误"else "图片加载失败"ToastUtils.showToast(alarmToast)}.subscribe {try {if (it.exists()) {if (it.copyTo(file).exists()) {ToastUtils.showToast("图片保存成功")}}} catch (e: Exception) {e.printStackTrace()}}}}, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE)
}

PS: 合适的地方(onDestroy)结束observable ,避免泄漏。

这篇关于Android Androidx Glide下载图片到指定文件夹 Glide版本4.+ Glide4.+的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/591945

相关文章

Oracle Expdp按条件导出指定表数据的方法实例

《OracleExpdp按条件导出指定表数据的方法实例》:本文主要介绍Oracle的expdp数据泵方式导出特定机构和时间范围的数据,并通过parfile文件进行条件限制和配置,文中通过代码介绍... 目录1.场景描述 2.方案分析3.实验验证 3.1 parfile文件3.2 expdp命令导出4.总结

Android数据库Room的实际使用过程总结

《Android数据库Room的实际使用过程总结》这篇文章主要给大家介绍了关于Android数据库Room的实际使用过程,详细介绍了如何创建实体类、数据访问对象(DAO)和数据库抽象类,需要的朋友可以... 目录前言一、Room的基本使用1.项目配置2.创建实体类(Entity)3.创建数据访问对象(DAO

你的华为手机升级了吗? 鸿蒙NEXT多连推5.0.123版本变化颇多

《你的华为手机升级了吗?鸿蒙NEXT多连推5.0.123版本变化颇多》现在的手机系统更新可不仅仅是修修补补那么简单了,华为手机的鸿蒙系统最近可是动作频频,给用户们带来了不少惊喜... 为了让用户的使用体验变得很好,华为手机不仅发布了一系列给力的新机,还在操作系统方面进行了疯狂的发力。尤其是近期,不仅鸿蒙O

什么是 Ubuntu LTS?Ubuntu LTS和普通版本区别对比

《什么是UbuntuLTS?UbuntuLTS和普通版本区别对比》UbuntuLTS是Ubuntu操作系统的一个特殊版本,旨在提供更长时间的支持和稳定性,与常规的Ubuntu版本相比,LTS版... 如果你正打算安装 Ubuntu 系统,可能会被「LTS 版本」和「普通版本」给搞得一头雾水吧?尤其是对于刚入

windows端python版本管理工具pyenv-win安装使用

《windows端python版本管理工具pyenv-win安装使用》:本文主要介绍如何通过git方式下载和配置pyenv-win,包括下载、克隆仓库、配置环境变量等步骤,同时还详细介绍了如何使用... 目录pyenv-win 下载配置环境变量使用 pyenv-win 管理 python 版本一、安装 和

使用 Python 和 LabelMe 实现图片验证码的自动标注功能

《使用Python和LabelMe实现图片验证码的自动标注功能》文章介绍了如何使用Python和LabelMe自动标注图片验证码,主要步骤包括图像预处理、OCR识别和生成标注文件,通过结合Pa... 目录使用 python 和 LabelMe 实现图片验证码的自动标注环境准备必备工具安装依赖实现自动标注核心

Java操作xls替换文本或图片的功能实现

《Java操作xls替换文本或图片的功能实现》这篇文章主要给大家介绍了关于Java操作xls替换文本或图片功能实现的相关资料,文中通过示例代码讲解了文件上传、文件处理和Excel文件生成,需要的朋友可... 目录准备xls模板文件:template.xls准备需要替换的图片和数据功能实现包声明与导入类声明与

Python使用pysmb库访问Windows共享文件夹的详细教程

《Python使用pysmb库访问Windows共享文件夹的详细教程》本教程旨在帮助您使用pysmb库,通过SMB(ServerMessageBlock)协议,轻松连接到Windows共享文件夹,并列... 目录前置条件步骤一:导入必要的模块步骤二:配置连接参数步骤三:实例化SMB连接对象并尝试连接步骤四:

Android WebView的加载超时处理方案

《AndroidWebView的加载超时处理方案》在Android开发中,WebView是一个常用的组件,用于在应用中嵌入网页,然而,当网络状况不佳或页面加载过慢时,用户可能会遇到加载超时的问题,本... 目录引言一、WebView加载超时的原因二、加载超时处理方案1. 使用Handler和Timer进行超

基于C#实现将图片转换为PDF文档

《基于C#实现将图片转换为PDF文档》将图片(JPG、PNG)转换为PDF文件可以帮助我们更好地保存和分享图片,所以本文将介绍如何使用C#将JPG/PNG图片转换为PDF文档,需要的可以参考下... 目录介绍C# 将单张图片转换为PDF文档C# 将多张图片转换到一个PDF文档介绍将图片(JPG、PNG)转