Skip to content

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

FlyJingFish edited this page Jun 2, 2023 · 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 则不需要这一步)

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

}

然后通过 OpenImageConfig 来设置

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

二、再来看下使用方法

首先看下如何使用下载功能,调用 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 设置此项才有用

@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;
    }
}

重要的是要使用 LoadImageUtils.INSTANCE.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 或其他图片引擎

前往查看代码 下载器对应着步骤一 PicassoDownloader

如果是想要下载进度对应着步骤三 点此查看MyApplication.initPicasso()

Clone this wiki locally