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

相关文章

Golang如何对cron进行二次封装实现指定时间执行定时任务

《Golang如何对cron进行二次封装实现指定时间执行定时任务》:本文主要介绍Golang如何对cron进行二次封装实现指定时间执行定时任务问题,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录背景cron库下载代码示例【1】结构体定义【2】定时任务开启【3】使用示例【4】控制台输出总结背景

springboot项目打jar制作成镜像并指定配置文件位置方式

《springboot项目打jar制作成镜像并指定配置文件位置方式》:本文主要介绍springboot项目打jar制作成镜像并指定配置文件位置方式,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录一、上传jar到服务器二、编写dockerfile三、新建对应配置文件所存放的数据卷目录四、将配置文

利用Python脚本实现批量将图片转换为WebP格式

《利用Python脚本实现批量将图片转换为WebP格式》Python语言的简洁语法和库支持使其成为图像处理的理想选择,本文将介绍如何利用Python实现批量将图片转换为WebP格式的脚本,WebP作为... 目录简介1. python在图像处理中的应用2. WebP格式的原理和优势2.1 WebP格式与传统

python3如何找到字典的下标index、获取list中指定元素的位置索引

《python3如何找到字典的下标index、获取list中指定元素的位置索引》:本文主要介绍python3如何找到字典的下标index、获取list中指定元素的位置索引问题,具有很好的参考价值,... 目录enumerate()找到字典的下标 index获取list中指定元素的位置索引总结enumerat

Android DataBinding 与 MVVM使用详解

《AndroidDataBinding与MVVM使用详解》本文介绍AndroidDataBinding库,其通过绑定UI组件与数据源实现自动更新,支持双向绑定和逻辑运算,减少模板代码,结合MV... 目录一、DataBinding 核心概念二、配置与基础使用1. 启用 DataBinding 2. 基础布局

Android ViewBinding使用流程

《AndroidViewBinding使用流程》AndroidViewBinding是Jetpack组件,替代findViewById,提供类型安全、空安全和编译时检查,代码简洁且性能优化,相比Da... 目录一、核心概念二、ViewBinding优点三、使用流程1. 启用 ViewBinding (模块级

基于 HTML5 Canvas 实现图片旋转与下载功能(完整代码展示)

《基于HTML5Canvas实现图片旋转与下载功能(完整代码展示)》本文将深入剖析一段基于HTML5Canvas的代码,该代码实现了图片的旋转(90度和180度)以及旋转后图片的下载... 目录一、引言二、html 结构分析三、css 样式分析四、JavaScript 功能实现一、引言在 Web 开发中,

Python如何去除图片干扰代码示例

《Python如何去除图片干扰代码示例》图片降噪是一个广泛应用于图像处理的技术,可以提高图像质量和相关应用的效果,:本文主要介绍Python如何去除图片干扰的相关资料,文中通过代码介绍的非常详细,... 目录一、噪声去除1. 高斯噪声(像素值正态分布扰动)2. 椒盐噪声(随机黑白像素点)3. 复杂噪声(如伪

springboot下载接口限速功能实现

《springboot下载接口限速功能实现》通过Redis统计并发数动态调整每个用户带宽,核心逻辑为每秒读取并发送限定数据量,防止单用户占用过多资源,确保整体下载均衡且高效,本文给大家介绍spring... 目录 一、整体目标 二、涉及的主要类/方法✅ 三、核心流程图解(简化) 四、关键代码详解1️⃣ 设置

Python中图片与PDF识别文本(OCR)的全面指南

《Python中图片与PDF识别文本(OCR)的全面指南》在数据爆炸时代,80%的企业数据以非结构化形式存在,其中PDF和图像是最主要的载体,本文将深入探索Python中OCR技术如何将这些数字纸张转... 目录一、OCR技术核心原理二、python图像识别四大工具库1. Pytesseract - 经典O