Android Q的权限机制只能获取到Uri类型的文件,看了几个图片选择器关于AndroidQ的适配,都是在选择图片后拷贝到沙盒内再返回File类型的文件,导致用户选择多张图片后会好多才能返回上传界面,被产品经理批了一顿,所以把图片选择器的AndroidQ适配修改为只获取Uri的path 路径,然后在上传前判断是否为Uri类型的path.
在百度上找了一下,没有关于Okhttp上传Uri类型文件的相关方法,只能自己添加Okhttp的RequestBody方法来上传Uri类型文件
public static RequestBodycreate(final Uri uri, final @Nullable MediaType contentType) {
if (uri ==null) {
return null;
}
return new RequestBody() {
@Override
public @Nullable MediaTypecontentType() {
return contentType;
}
@Override
public long contentLength() {
return UriUtils.getUriLenght(uri);
}
@Override
public void writeTo(BufferedSink sink)throws IOException {
Source source =null;
try {
source = Okio.source(UriUtils.openInputStream(uri));
sink.writeAll(source);
}finally {
Util.closeQuietly(source);
}
}
};
}