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

相关文章

Python使用PIL库将PNG图片转换为ICO图标的示例代码

《Python使用PIL库将PNG图片转换为ICO图标的示例代码》在软件开发和网站设计中,ICO图标是一种常用的图像格式,特别适用于应用程序图标、网页收藏夹图标等场景,本文将介绍如何使用Python的... 目录引言准备工作代码解析实践操作结果展示结语引言在软件开发和网站设计中,ICO图标是一种常用的图像

Python如何快速下载依赖

《Python如何快速下载依赖》本文介绍了四种在Python中快速下载依赖的方法,包括使用国内镜像源、开启pip并发下载功能、使用pipreqs批量下载项目依赖以及使用conda管理依赖,通过这些方法... 目录python快速下载依赖1. 使用国内镜像源临时使用镜像源永久配置镜像源2. 使用 pip 的并

jdk21下载、安装详细教程(Windows、Linux、macOS)

《jdk21下载、安装详细教程(Windows、Linux、macOS)》本文介绍了OpenJDK21的下载地址和安装步骤,包括Windows、Linux和macOS平台,下载后解压并设置环境变量,最... 目录1、官网2、下载openjdk3、安装4、验证1、官网官网地址:OpenJDK下载地址:Ar

SpringBoot集成图片验证码框架easy-captcha的详细过程

《SpringBoot集成图片验证码框架easy-captcha的详细过程》本文介绍了如何将Easy-Captcha框架集成到SpringBoot项目中,实现图片验证码功能,Easy-Captcha是... 目录SpringBoot集成图片验证码框架easy-captcha一、引言二、依赖三、代码1. Ea

springboot3.4和mybatis plus的版本问题的解决

《springboot3.4和mybatisplus的版本问题的解决》本文主要介绍了springboot3.4和mybatisplus的版本问题的解决,主要由于SpringBoot3.4与MyBat... 报错1:spring-boot-starter/3.4.0/spring-boot-starter-

mac安装nvm(node.js)多版本管理实践步骤

《mac安装nvm(node.js)多版本管理实践步骤》:本文主要介绍mac安装nvm(node.js)多版本管理的相关资料,NVM是一个用于管理多个Node.js版本的命令行工具,它允许开发者在... 目录NVM功能简介MAC安装实践一、下载nvm二、安装nvm三、安装node.js总结NVM功能简介N

Android开发中gradle下载缓慢的问题级解决方法

《Android开发中gradle下载缓慢的问题级解决方法》本文介绍了解决Android开发中Gradle下载缓慢问题的几种方法,本文给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录一、网络环境优化二、Gradle版本与配置优化三、其他优化措施针对android开发中Gradle下载缓慢的问

linux如何复制文件夹并重命名

《linux如何复制文件夹并重命名》在Linux系统中,复制文件夹并重命名可以通过使用“cp”和“mv”命令来实现,使用“cp-r”命令可以递归复制整个文件夹及其子文件夹和文件,而使用“mv”命令可以... 目录linux复制文件夹并重命名我们需要使用“cp”命令来复制文件夹我们还可以结合使用“mv”命令总

python 3.8 的anaconda下载方法

《python3.8的anaconda下载方法》本文详细介绍了如何下载和安装带有Python3.8的Anaconda发行版,包括Anaconda简介、下载步骤、安装指南以及验证安装结果,此外,还介... 目录python3.8 版本的 Anaconda 下载与安装指南一、Anaconda 简介二、下载 An

如何使用CSS3实现波浪式图片墙

《如何使用CSS3实现波浪式图片墙》:本文主要介绍了如何使用CSS3的transform属性和动画技巧实现波浪式图片墙,通过设置图片的垂直偏移量,并使用动画使其周期性地改变位置,可以创建出动态且具有波浪效果的图片墙,同时,还强调了响应式设计的重要性,以确保图片墙在不同设备上都能良好显示,详细内容请阅读本文,希望能对你有所帮助...