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

相关文章

Android Studio 配置国内镜像源的实现步骤

《AndroidStudio配置国内镜像源的实现步骤》本文主要介绍了AndroidStudio配置国内镜像源的实现步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,... 目录一、修改 hosts,解决 SDK 下载失败的问题二、修改 gradle 地址,解决 gradle

基于Python实现高效PPT转图片工具

《基于Python实现高效PPT转图片工具》在日常工作中,PPT是我们常用的演示工具,但有时候我们需要将PPT的内容提取为图片格式以便于展示或保存,所以本文将用Python实现PPT转PNG工具,希望... 目录1. 概述2. 功能使用2.1 安装依赖2.2 使用步骤2.3 代码实现2.4 GUI界面3.效

在Android平台上实现消息推送功能

《在Android平台上实现消息推送功能》随着移动互联网应用的飞速发展,消息推送已成为移动应用中不可或缺的功能,在Android平台上,实现消息推送涉及到服务端的消息发送、客户端的消息接收、通知渠道(... 目录一、项目概述二、相关知识介绍2.1 消息推送的基本原理2.2 Firebase Cloud Me

浅谈配置MMCV环境,解决报错,版本不匹配问题

《浅谈配置MMCV环境,解决报错,版本不匹配问题》:本文主要介绍浅谈配置MMCV环境,解决报错,版本不匹配问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录配置MMCV环境,解决报错,版本不匹配错误示例正确示例总结配置MMCV环境,解决报错,版本不匹配在col

Python实现AVIF图片与其他图片格式间的批量转换

《Python实现AVIF图片与其他图片格式间的批量转换》这篇文章主要为大家详细介绍了如何使用Pillow库实现AVIF与其他格式的相互转换,即将AVIF转换为常见的格式,比如JPG或PNG,需要的小... 目录环境配置1.将单个 AVIF 图片转换为 JPG 和 PNG2.批量转换目录下所有 AVIF 图

详解如何通过Python批量转换图片为PDF

《详解如何通过Python批量转换图片为PDF》:本文主要介绍如何基于Python+Tkinter开发的图片批量转PDF工具,可以支持批量添加图片,拖拽等操作,感兴趣的小伙伴可以参考一下... 目录1. 概述2. 功能亮点2.1 主要功能2.2 界面设计3. 使用指南3.1 运行环境3.2 使用步骤4. 核

Java图片压缩三种高效压缩方案详细解析

《Java图片压缩三种高效压缩方案详细解析》图片压缩通常涉及减少图片的尺寸缩放、调整图片的质量(针对JPEG、PNG等)、使用特定的算法来减少图片的数据量等,:本文主要介绍Java图片压缩三种高效... 目录一、基于OpenCV的智能尺寸压缩技术亮点:适用场景:二、JPEG质量参数压缩关键技术:压缩效果对比

使用Python开发一个简单的本地图片服务器

《使用Python开发一个简单的本地图片服务器》本文介绍了如何结合wxPython构建的图形用户界面GUI和Python内建的Web服务器功能,在本地网络中搭建一个私人的,即开即用的网页相册,文中的示... 目录项目目标核心技术栈代码深度解析完整代码工作流程主要功能与优势潜在改进与思考运行结果总结你是否曾经

Python FastAPI+Celery+RabbitMQ实现分布式图片水印处理系统

《PythonFastAPI+Celery+RabbitMQ实现分布式图片水印处理系统》这篇文章主要为大家详细介绍了PythonFastAPI如何结合Celery以及RabbitMQ实现简单的分布式... 实现思路FastAPI 服务器Celery 任务队列RabbitMQ 作为消息代理定时任务处理完整

使用C#代码在PDF文档中添加、删除和替换图片

《使用C#代码在PDF文档中添加、删除和替换图片》在当今数字化文档处理场景中,动态操作PDF文档中的图像已成为企业级应用开发的核心需求之一,本文将介绍如何在.NET平台使用C#代码在PDF文档中添加、... 目录引言用C#添加图片到PDF文档用C#删除PDF文档中的图片用C#替换PDF文档中的图片引言在当