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.AndPermission

object 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.supportFragmentManager
        var fragment: Fragment? = manager.findFragmentByTag("permission")
        if (fragment == null) {
            fragment = PermissionDelegate()
        }
        if (!fragment.isAdded) {
            val finalFragment = fragment
            manager.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? = null
        override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
            return Space(activity)
        }

        internal fun request(callback: PermissionCallback, vararg permissions: String) {
            this.callback = callback
            if (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;
    }

    @NonNull
    public SettingDialog setTitle(@NonNull String title) {
        mBuilder.setTitle(title);
        return this;
    }

    @NonNull
    public SettingDialog setTitle(@StringRes int title) {
        mBuilder.setTitle(title);
        return this;
    }

    @NonNull
    public SettingDialog setMessage(@NonNull String message) {
        mBuilder.setMessage(message);
        return this;
    }

    @NonNull
    public SettingDialog setMessage(@StringRes int message) {
        mBuilder.setMessage(message);
        return this;
    }

    @NonNull
    public SettingDialog setNegativeButton(@NonNull String text, @Nullable DialogInterface.OnClickListener
            negativeListener) {
        mBuilder.setNegativeButton(text, negativeListener);
        return this;
    }

    @NonNull
    public SettingDialog setNegativeButton(@StringRes int text, @Nullable DialogInterface.OnClickListener
            negativeListener) {
        mBuilder.setNegativeButton(text, negativeListener);
        return this;
    }

    @NonNull
    public SettingDialog setPositiveButton(@NonNull String text) {
        mBuilder.setPositiveButton(text, mClickListener);
        return this;
    }

    @NonNull
    public SettingDialog setPositiveButton(@StringRes int text) {
        mBuilder.setPositiveButton(text, mClickListener);
        return this;
    }

    public void show() {
        mBuilder.show();
    }

    private DialogInterface.OnClickListener mClickListener = new DialogInterface.OnClickListener() {
        @Override
        public 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 ,避免泄漏。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值