使用 Picasso(或 Glide)和改造在 RecyclerView 中显示图像,仅供经过身份验证的用户使用
Displaying images in RecyclerView using Picasso (or Glide) and retrofit, for authenticated users only
我一直在使用recyclerview 来显示我的联系人并显示他们的基本数据,包括用户图像。它可以正常工作,Picasso 很棒,我得到了一个非常酷的列表。
现在我正试图禁止用户在验证之前查看图像 - 即我想禁止任何未经过身份验证的用户查看图像。
我已经在我的服务上完成了此操作,并禁止除我的 laravel 应用程序之外的任何人打开图像 link。现在我面临一个问题 - 当我 return 图像时,它不是 link,而是 byte[]
格式,
我无法使用 Picasso 显示它。我可以尝试将其转换为 Bitmap bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
,然后将位图转换为可绘制对象,例如:
Drawable drawable = new BitmapDrawable(getResources(), bitmap);
,然后将可绘制对象显示为图像 imageView.setImageDrawable(drawable);
,但读到这里我发现了很多缺点。
我的问题是 使用 picasso 或 glide 显示图像的最佳方式是什么,并且仅针对经过身份验证的用户改造为 return 图像。我可以通过 return 从 laravel 服务获取图像的不同方式吗?
有没有办法在 picasso 或 glide 中使用字节格式?或者是否有另一种格式我可以将我的 byte[]
转换为在 recyclerview 中显示,这不会对性能产生负面影响?
当前在我的联系人适配器中显示 Picasso 图像:
@Override
public void onBindViewHolder(ContactsAdapter.ContactsViewHolder holder, int position) {
Contact contact = contactList.get(position);
holder.userName.setText(contact.getUserName());
TextDrawable.IBuilder builder = TextDrawable.builder()
.beginConfig()
.withBorder(0)
.toUpperCase()
.endConfig()
.round();
ColorGenerator generator = ColorGenerator.MATERIAL;
int color = generator.getColor(contact.getUserId());
textDrawable = builder.build(contactList.get(position).getUserName().substring(0, 1), color);
holder.thumbNail.setImageDrawable(textDrawable);
Picasso.with(context)
.load(AppConfig.URL_PROFILE_PHOTO + contact.getThumbnailUrl()) // DISK URL WITH USER IMAGE NAME
.placeholder(textDrawable)
.error(textDrawable)
.transform(new CircleTransform())
.into(holder.thumbNail);
}
Laravel 服务将 link 转换为这样的图像:
return Image::make($storagePath)->response();
我提取了 ProfileImage 方法并尝试修改它以使用我得到的服务:
private void ProfileImage(HashMap<String, String> user, String name, String id) {
TokenManager tokenManager = TokenManager.getInstance(getSharedPreferences("prefs", MODE_PRIVATE));
ApiInterface apiService = ApiClient.createServiceWithAuth(ApiInterface.class, tokenManager);
ColorGenerator generator = ColorGenerator.MATERIAL;
int color = generator.getColor(id);
String firstLetter = name.substring(0, 1);
TextDrawable textDrawable = TextDrawable.builder().buildRect(firstLetter, color);
holder.thumbNail.setImageDrawable(textDrawable);
Call<ResponseBody> call = apiService.getUserImage(id);
call.enqueue(new Callback<ResponseBody>() {
@Override
public void onResponse(Call<ResponseBody> call, retrofit2.Response<ResponseBody> response) {
if (response.isSuccessful()) {
byte[] bytes = new byte[0];
try {
bytes = response.body().bytes();
Picasso.with(getApplicationContext())
.load(/** I CANNOT USE THE URL HERE */)
.placeholder(textDrawable)
.error(textDrawable)
.centerCrop()
.fit()
.into(holder.thumbNail);
} catch (IOException e) {
e.printStackTrace();
}
} else {
if (response.code() == 401) {
finish();
} else {
Log.d(TAG, "There was an error: " + response);
}
}
}
@Override
public void onFailure(Call<ResponseBody> call, Throwable t) {
Log.e(TAG, t.toString());
}
});
}
如果可以切换到Glide
,可以直接使用Glide.with().load(byte[] model)
bytes = response.body().bytes();
Glide.with(getApplicationContext())
.load(bytes)
.placeholder(textDrawable)
.error(textDrawable)
.centerCrop()
.fitCenter()
.into(holder.thumbNail);
我一直在使用recyclerview 来显示我的联系人并显示他们的基本数据,包括用户图像。它可以正常工作,Picasso 很棒,我得到了一个非常酷的列表。
现在我正试图禁止用户在验证之前查看图像 - 即我想禁止任何未经过身份验证的用户查看图像。
我已经在我的服务上完成了此操作,并禁止除我的 laravel 应用程序之外的任何人打开图像 link。现在我面临一个问题 - 当我 return 图像时,它不是 link,而是 byte[]
格式,
我无法使用 Picasso 显示它。我可以尝试将其转换为 Bitmap bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
,然后将位图转换为可绘制对象,例如:
Drawable drawable = new BitmapDrawable(getResources(), bitmap);
,然后将可绘制对象显示为图像 imageView.setImageDrawable(drawable);
,但读到这里我发现了很多缺点。
我的问题是 使用 picasso 或 glide 显示图像的最佳方式是什么,并且仅针对经过身份验证的用户改造为 return 图像。我可以通过 return 从 laravel 服务获取图像的不同方式吗?
有没有办法在 picasso 或 glide 中使用字节格式?或者是否有另一种格式我可以将我的 byte[]
转换为在 recyclerview 中显示,这不会对性能产生负面影响?
当前在我的联系人适配器中显示 Picasso 图像:
@Override
public void onBindViewHolder(ContactsAdapter.ContactsViewHolder holder, int position) {
Contact contact = contactList.get(position);
holder.userName.setText(contact.getUserName());
TextDrawable.IBuilder builder = TextDrawable.builder()
.beginConfig()
.withBorder(0)
.toUpperCase()
.endConfig()
.round();
ColorGenerator generator = ColorGenerator.MATERIAL;
int color = generator.getColor(contact.getUserId());
textDrawable = builder.build(contactList.get(position).getUserName().substring(0, 1), color);
holder.thumbNail.setImageDrawable(textDrawable);
Picasso.with(context)
.load(AppConfig.URL_PROFILE_PHOTO + contact.getThumbnailUrl()) // DISK URL WITH USER IMAGE NAME
.placeholder(textDrawable)
.error(textDrawable)
.transform(new CircleTransform())
.into(holder.thumbNail);
}
Laravel 服务将 link 转换为这样的图像:
return Image::make($storagePath)->response();
我提取了 ProfileImage 方法并尝试修改它以使用我得到的服务:
private void ProfileImage(HashMap<String, String> user, String name, String id) {
TokenManager tokenManager = TokenManager.getInstance(getSharedPreferences("prefs", MODE_PRIVATE));
ApiInterface apiService = ApiClient.createServiceWithAuth(ApiInterface.class, tokenManager);
ColorGenerator generator = ColorGenerator.MATERIAL;
int color = generator.getColor(id);
String firstLetter = name.substring(0, 1);
TextDrawable textDrawable = TextDrawable.builder().buildRect(firstLetter, color);
holder.thumbNail.setImageDrawable(textDrawable);
Call<ResponseBody> call = apiService.getUserImage(id);
call.enqueue(new Callback<ResponseBody>() {
@Override
public void onResponse(Call<ResponseBody> call, retrofit2.Response<ResponseBody> response) {
if (response.isSuccessful()) {
byte[] bytes = new byte[0];
try {
bytes = response.body().bytes();
Picasso.with(getApplicationContext())
.load(/** I CANNOT USE THE URL HERE */)
.placeholder(textDrawable)
.error(textDrawable)
.centerCrop()
.fit()
.into(holder.thumbNail);
} catch (IOException e) {
e.printStackTrace();
}
} else {
if (response.code() == 401) {
finish();
} else {
Log.d(TAG, "There was an error: " + response);
}
}
}
@Override
public void onFailure(Call<ResponseBody> call, Throwable t) {
Log.e(TAG, t.toString());
}
});
}
如果可以切换到Glide
,可以直接使用Glide.with().load(byte[] model)
bytes = response.body().bytes();
Glide.with(getApplicationContext())
.load(bytes)
.placeholder(textDrawable)
.error(textDrawable)
.centerCrop()
.fitCenter()
.into(holder.thumbNail);