Skip to content

3、下载图片或视频的使用说明

FlyJingFish edited this page Nov 28, 2024 · 39 revisions

一、使用前的设置

添加权限

<manifest xmlns:android="http://schemas.android.com/apk/res/android">
    <uses-permission android:name="android.permission.INTERNET" />

    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"
        android:maxSdkVersion="32" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
        android:maxSdkVersion="32" />

    <!-- Android 13版本适配,细化存储权限 -->
    <uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
    <uses-permission android:name="android.permission.READ_MEDIA_AUDIO" />
    <uses-permission android:name="android.permission.READ_MEDIA_VIDEO" />
</manifest>

如果您引用的库是 OpenImageLib 您需要实现 DownloadMediaHelper 接口并设置它,它是下载图片和视频的关键

(如果您使用的是 OpenImageFullLib 或 OpenImageGlideLib(OpenImageCoilLib) 则不需要这一步)

public class MyDownloadMediaHelper implements DownloadMediaHelper {
    @Override
    public void download(FragmentActivity activity, LifecycleOwner lifecycleOwner, OpenImageUrl openImageUrl, OnDownloadMediaListener onDownloadMediaListener) {
        something...
    }

}

//然后通过 OpenImageConfig 来设置

OpenImageConfig.getInstance().setDownloadMediaHelper(new MyDownloadMediaHelper());

OpenImageFullLib 番外介绍

使用 OpenImageFullLib 时,下载视频功能是增强版的哦~

  • 1、下载视频时如果已经存在缓存好的视频则直接使用缓存视频来保存到相册
  • 2、下载视频时如果不存在缓存好的视频,则会开始缓存视频,如果此时正在播放视频,则会使视频播放更加流畅(此功能在2.0.8及之后的版本开始提供)
  • 3、上述功能需要播放器使用 ProxyCacheManager 作为缓存的管理,如果设置为其他则会失去上述功能效果。当然如果你没有特别设置,播放器默认使用的就是 ProxyCacheManager

如果你给视频播放器自定义了缓存目录,请通过以下设置同步你的设置,否则上述增强的功能将失去效果

FullGlideDownloadMediaHelper.getInstance().setVideoCacheDir(new File("新缓存目录"));

如果你不想用上述 功能2 可通过以下设置关闭(false 关闭 ,true 开启,默认true)

FullGlideDownloadMediaHelper.getInstance().setDownloadWithCache(false);

二、再来看下使用方法

首先看下如何使用下载功能,调用 setShowDownload(),如下:

OpenImage.with(context)
        .setShowDownload()
        .show();
//或者如下,可定制下载按钮
OpenImage.with(context)
        .setShowDownload(new DownloadParams()
                .setDownloadSrc(R.drawable.ic_open_image_download)
                .setPercentColor(Color.RED)
                .setTouchingHide(false))
        .show();

三、如果需要显示下载进度

先来看下效果图,注意看右下角下载按钮

show

可以看到上边使用到了 setPercentColor 说明是可以看到下载进度的,但若想要显示进度,需要你先要设置下 Glide ,如下

(通常只有视频才会看到下载进度,另外 m3u8 格式的视频是下载不下来的)

只有使用的是 OpenImageFullLib 或 OpenImageGlideLib 或 OpenImageCoilLib 设置此项才有用

  • 如果你用的是Glide 请按下边设置
@GlideModule
public class MyAppGlideModule extends AppGlideModule {

    @Override
    public void registerComponents(Context context, Glide glide, Registry registry) {
        //Glide 底层默认使用 HttpConnection 进行网络请求,这里替换为 Okhttp 后才能使用本框架,进行 Glide 的加载进度监听
        registry.replace(GlideUrl.class, InputStream.class, new OkHttpUrlLoader.Factory(LoadImageUtils.INSTANCE.getOkHttpClient()));
    }

    @Override
    public boolean isManifestParsingEnabled() {
        return false;
    }
}
  • 如果用的是Coil 请按下边设置
class MyApplication : BaseApplication(), ImageLoaderFactory  {

    override fun newImageLoader(): ImageLoader {
        val builder = ComponentRegistry.Builder()
        if (VERSION.SDK_INT >= 28) {
            builder.add(ImageDecoderDecoder.Factory());
        } else {
            builder.add(GifDecoder.Factory());
        }
        return ImageLoader.Builder(this).logger(DebugLogger())
            .okHttpClient(CoilLoadImageUtils.getOkHttpClient())
            .components(builder.build())
            .build()
    }

}
  • 如果用的是Coil3 请按下边设置
class MyApplication : BaseApplication(), SingletonImageLoader.Factory  {

    override fun newImageLoader(context: Context): coil3.ImageLoader {
        val builder = coil3.ComponentRegistry.Builder()
        if (VERSION.SDK_INT >= 28) {
            builder.add(AnimatedImageDecoder.Factory())
        } else {
            builder.add(coil3.gif.GifDecoder.Factory())
        }
        builder.add(
            OkHttpNetworkFetcherFactory(
                callFactory = {
                    Coil3LoadImageUtils.getOkHttpClient()
                }
            )
        )
        return coil3.ImageLoader.Builder(this)
            .components(builder.build())
            .build();
    }

}

重要的是:

  • Glide 要使用 LoadImageUtils.INSTANCE.getOkHttpClient()
  • Coil 要使用 CoilLoadImageUtils.getOkHttpClient()
  • Coil3 要使用 Coil3LoadImageUtils.getOkHttpClient()

四、如果需要更改下载时相关的 Toast

1、全局设置

app 的 module 下覆盖现有的字符串

<resources>
    <string name="download_start_toast">开始下载</string>
    <string name="download_end_toast">成功保存到: %1$s</string>
    <string name="download_error_toast">下载失败</string>
    <string name="request_WRITE_EXTERNAL_STORAGE_permissions_fail">请打开存储权限</string>
</resources>

2、局部设置

<style name="MyPhotosTheme" >
    <!--下载时是否显示 Toast 的总开关-->
    <item name="openImage.download.toast">true</item>
    <!--下载开始时 Toast 的文案,文案为空时不显示-->
    <item name="openImage.download.startToast">开始下载</item>
    <!--下载结束时 Toast 的文案,文案为空时不显示-->
    <item name="openImage.download.successToast">成功保存到%1$s</item>
    <!--下载失败时 Toast 的文案,文案为空时不显示-->
    <item name="openImage.download.errorToast">下载失败</item>
    <!--请求读取外部存储权限失败时的文案,文案为空时不显示-->
    <item name="openImage.requestWriteExternalStoragePermissionsFail">请打开存储权限</item>
</style>

然后在打开大图的位置设置上

OpenImage.with(context).setOpenImageStyle(R.style.MyPhotosTheme)

特别说明一下,openImage.download.successToast 如果想要显示下载的路径 ,则给字符串上加入 %1$s 即可

例如: “ 成功保存到 %1$s ”,如果不需要去掉即可

3、如果不想要默认的 Toast 这种提示,或者其他想要更改下载相关的逻辑,也可以用以下方法

新建 MyBigImageActivity 继承自 OpenImageActivity

public class MyBigImageActivity extends OpenImageActivity {
    
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        addOnSelectMediaListener((openImageUrl, position) -> {
            
        });
    }
    /**
    * 点击下载按钮的方法
    */
    @Override
    protected void checkPermissionAndDownload() {
        //重写这个方法可自己检测权限并调用downloadMedia下载
    }

    /**
    * 下载当前图片或视频的方法
    */
    @Override
    protected void downloadMedia() {
        //重写这个方法更改下载相关逻辑,例如:
        ....
        final OpenImageUrl openImageUrl = openImageAdapter.getData().get(getViewPager2().getCurrentItem());
        ....
    }
}

然后调用显示即可,点此查看详细说明

OpenImage.with(context).setOpenImageActivityCls(MyBigImageActivity.class)

五、如果想要使用 Picasso 或其他图片引擎