Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

在setAddBitmapWatermarkListener内异步处理水印导致的某些机型 图片异常或者丢失 #2854

Open
LittleRobotRoad opened this issue Mar 6, 2024 · 0 comments

Comments

@LittleRobotRoad
Copy link

LittleRobotRoad commented Mar 6, 2024

Current use version?

当前使用的版本是多少?

v3.11.2

Will this problem occur in demo?

Demo能否复现这问题?

可以在某些配置低或者平板上可以复现

Describe the problem or provide an error log?

描述问题或提供错误log?

setAddBitmapWatermarkListener api 如果使用异步处理并使用onCallback回调的时候,
虽然从日志来看是按顺序处理并最后调用dispatchWatermarkResult的,但是保存的水印图片会存在保存不完整或者丢失。
如果在直接写水印代码,不使用异步处理,是正常的,但是会导致loading dialog 被卡住。

使用了kotlin协程的普通的线程工具类都会出现

调用代码 1

.setAddBitmapWatermarkListener { context, srcPath, _, call ->
                val path = if (srcPath.startsWith("content://")) {
                    NovaFile.getPathByUri(context, Uri.parse(srcPath))
                } else {
                    srcPath
                }
                GlobalIOScope.launch {
                    val copyUrl = copyFileToNova(albumKey, path)
                    val dateTime = path2Date(path)
                    signWatermark(copyUrl, location, nickName, dateTime)
                    withContext(Dispatchers.Main){
                        call.onCallback(srcPath, copyUrl)
                    }
                }
            }

调用代码2

.setAddBitmapWatermarkListener { context, srcPath, _, call ->
                ThreadUtils.executeByIo(object : SimpleTask<String>() {
                    override fun doInBackground(): String {
                        val path = if (srcPath.startsWith("content://")) {
                            NovaFile.getPathByUri(context, Uri.parse(srcPath))
                        } else {
                            srcPath
                        }
                        val copyUrl = copyFileToNova(albumKey, path)
                        val dateTime = path2Date(path)
                        signWatermark(copyUrl, location, nickName, dateTime)
                    }

                    override fun onSuccess(copyUrl: String?) {
                        call.onCallback(srcPath, copyUrl)
                    }
                })
}

尝试修改addBitmapWatermark的代码,直接让这部分运行在 PictureThreadUtils 的线程里可以正常工作,但是估计违背api涉及初衷。

PictureThreadUtils.executeByIo(new PictureThreadUtils.SimpleTask<ArrayList<LocalMedia>>() {
            @Override
            public ArrayList<LocalMedia> doInBackground() {
                for (LocalMedia localMedia : result) {
                    selectorConfig.onBitmapWatermarkListener.onAddBitmapWatermark(
                            getAppContext(),
                            localMedia.getAvailablePath(),
                            localMedia.getMimeType(),
                            (srcPath, resultPath) -> {
                                if (TextUtils.isEmpty(srcPath)) {
                                    dispatchWatermarkResult(result);
                                } else {
                                    localMedia.setWatermarkPath(resultPath);
                                }
                            }
                    );
                }
                return result;
            }

            @Override
            public void onSuccess(ArrayList<LocalMedia> result) {
                PictureThreadUtils.cancel(this);
                dispatchWatermarkResult(result);
            }
        });

视频内有两张图片的颜色是不对的,其他更严重的情况是有时候图片只有一半或者直接丢失。

9a681e6df4c85240385070b858dce0a0.mp4
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant