背景
Android移动端需要接入阿里云视频点播模块下的一个客户端上传的SDK。需要将移动端本地文件上传至阿里云服务器。
问题描述
调用方法及业务逻辑不赘述,贴张官方图,选择了上传地址和凭证的方法进行上传,并且是后台集成点播服务端SDK并调用相关接口获取或刷新上传地址和凭证,就是移动端调用接口直接从后端获取凭证,后端再通过服务器端SDK去获取凭证,后端获取凭证的同时也返回了视频ID和ImageUrl。这是重点,视频ID和ImageUrl是开始获取凭证的时候就获取了。
调用顺序及逻辑均正常,但是上传方法调用后报错。
2022-12-08 15:24:33.774 31765-1185/com.xxxx.xxxx W/System.err: java.lang.IllegalArgumentException: couldn't open /storage/emulated/0/Pictures/Screenshots/Screenshot_20221206_110619_com.android.permissioncontroller.jpg
2022-12-08 15:24:33.774 31765-1185/com.xxxx.xxxx W/System.err: at android.media.MediaMetadataRetriever.setDataSource(MediaMetadataRetriever.java:259)
2022-12-08 15:24:33.774 31765-1185/com.xxxx.xxxx W/System.err: at com.aliyun.vod.common.utils.FileUtils.getVideoSize(FileUtils.java:2665)
2022-12-08 15:24:33.774 31765-1185/com.xxxx.xxxx W/System.err: at com.alibaba.sdk.android.vod.upload.internal.ResumableUploaderImpl$5.run(ResumableUploaderImpl.java:380)
2022-12-08 15:24:33.774 31765-1185/com.xxxx.xxxx W/System.err: at android.os.Handler.handleCallback(Handler.java:966)
2022-12-08 15:24:33.774 31765-1185/com.xxxx.xxxx W/System.err: at android.os.Handler.dispatchMessage(Handler.java:110)
2022-12-08 15:24:33.774 31765-1185/com.xxxx.xxxx W/System.err: at android.os.Looper.loopOnce(Looper.java:205)
2022-12-08 15:24:33.774 31765-1185/com.xxxx.xxxx W/System.err: at android.os.Looper.loop(Looper.java:293)
2022-12-08 15:24:33.774 31765-1185/com.xxxx.xxxx W/System.err: at android.os.HandlerThread.run(HandlerThread.java:67)
从权限入手查了很久,始终会报这个错,因此后续上传回调接口回调的上传失败全部理所当然的归结为此权限问题引起。一直在反复尝试权限获取的方法优化,最终结果是这个错误压根没有影响到文件上传,因为前期怀疑权限问题就是参考了SDK的demo代码,但是奇怪的是demo代码并未报这个错误。最后才发现demo里直接屏蔽了这个报错信息,大大的无语。。上demo代码
uploader = new VODUploadClientImpl(getApplicationContext());
((VODUploadClientImpl)uploader).setReportEnabled(false); //就这里屏蔽了报错
uploader.setRegion(VodUploadApplication.VOD_REGION);
uploader.setRecordUploadProgressEnabled(VodUploadApplication.VOD_RECORD_UPLOAD_PROGRESS_ENABLED);
因为demo一直正常所以坚定了是权限问题的想法,因此在错误的道路上渐行渐远。。最终也证明了确实是被官方误导了。。上图
官方文档里说明了,上传成功后会在回调里拿到
VodUploadResult
这里可以拿到视频ID和ImageUrl,但是实际并不会。起码通过上传地址和凭证方式去上传的方法是不会拿到回调的。只是回调到了成功接口,
UploadFileInfo
这个对象里可以拿到上传文件的文件类型等信息,根本没有视频ID什么。这些都是在获取上传凭证和上传地址的时候就拿到了的。所以那个文件读取的错误根本对上传结果没任何影响,完全可以忽略。
忽略了这个错误,那么剩下就是专注去调试上传回调了,遇到的问题是上传后会先回调成功然后又回调失败
onUploadSucceed
onUploadFailed
这里通过排查,主要需要确认的就是
onUploadStarted
这里需要设置上传凭证和上传地址,同时要关注
UploadClient
是否有做实例化或者是否为空了,正常参数正常那么肯定只会回调到成功,但是成功的回调里切记是获取不到视频ID和ImageUrl的。只回调成功实际说明已经是上传成功了,再用直接获取到的视频ID去获取下播放地址,或者直接根据ImageUrl就可以直接访问看到上传的图片了。
最后
因为一个不相关的错误耗费了诸多时间,好在也是车到山前必有路,最后及时发现并很快调通。记录下,后续遇到类似问题要多思考。