我正在尝试从经过身份验证的网站下载图片。该站点返回base64版本的映像。这是改造的正确方法吗?如何获取图像并设置为我的图像视图。
@GET("/img/avatars/{id}")
public void getProfilePic(@Path("id") int id,
Callback<TypedByteArray> result);
我将我的restadapter日志记录设置为完整,响应值看起来像这样
���V�3��Ωw���Tw�5�vT��>8u�`�j�S�������#���%�A���"Xw��Oq������G@]éG���f�~A#lD�)<���•
不是base64字符串。
我尝试了什么
customResAdapter(ImageService.class).getProfilePic(id, new Callback<TypedByteArray>() {
@Override
public void success(TypedByteArray result, Response response) {
try {
byte[] decodedString = Base64.decode(result.getBytes(), Base64.DEFAULT);
mProfilePic.setImageBitmap(BitmapFactory.decodeByteArray(decodedString, 0, decodedString.length));
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void failure(RetrofitError error) {
}
});
我不知道以下代码是否正确,但目前我收到此错误消息
com.google.gson.JsonSyntaxException: java.lang.IllegalStateException:预期为BEGIN_OBJECT但是为STRING 在第1行第1列路径
答案 0 :(得分:0)
如果您正在使用GsonConverter
,则总是会以JsonParseException
结尾。您需要继承GsonConverter并避免使用JsonParseExceptions
并继续处理Response
本身。
验证子类Converter
中的Json响应将为您提供如何处理反序列化的提示。
换句话说,如果json有效,则将其传递给GsonConverter
,否则从Base64解码。
public class TypedByteArrayConverter extends GsonConverter {
public TypedByteArrayConverter(Gson gson) {
super(gson);
}
public TypedByteArrayConverter(Gson gson, String charset) {
super(gson, charset);
}
@Override
public Object fromBody(TypedInput body, Type type) throws ConversionException {
//if you are trying to deserialize POJO from json, make a supercall, otherwise convert to TypedByteArray
if(!type.getClass().isAssignableFrom(TypedByteArray.class)) {
return super.fromBody(body, type);
}else {
try {
long length = body.length();
ByteString base64 = ByteString.read(body.in(), (int) length);
return new TypedByteArray(body.mimeType(), base64.toByteArray());
} catch (IOException e) {
e.printStackTrace();
}
}
return null;
}
}
ByteString
来自Okio包
然而,使用Retrofit加载图像是一个相当奇怪的想法。