使用Picasso(或Glide)和retrofit在RecyclerView中显示图像,仅供经过身份验证的用户使用

问题描述 投票:0回答:1

我一直在使用recyclerview来显示我的联系人并显示他们的基本数据,包括用户图像。它的工作原理应该是,毕加索很棒,而且我看起来非常酷。

现在我试图禁止用户查看图像直到验证 - 即我想禁止查看图像给任何不是经过身份验证的用户。我已经在我的服务上做了这个,除了我的laravel应用程序以外的任何人都打开图片链接。现在我面临一个问题 - 当我返回图像时,它不是一个链接,但它是byte[]格式,我无法使用毕加索显示它。我可以尝试将其转换为Bitmap bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);,然后将位图转换为drawable,如:Drawable drawable = new BitmapDrawable(getResources(), bitmap);,然后显示drawable作为图像imageView.setImageDrawable(drawable);但读到这里我发现了相当多的缺点。

我的问题是使用毕加索或滑行显示图像的最佳方式是什么,并且仅为经过身份验证的用户进行改造以返回图像。是否有不同的方式我可以从laravel服务返回图像?有没有办法将字节格式与毕加索或滑翔一起使用?或者是否有另一种格式我可以将我的byte[]转换为在recyclerview中显示,这不会对性能产生负面影响?

目前在我的ContactsAdapter中使用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服务将链接转换为图像,如下所示:

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());
        }
    });
}
android laravel android-recyclerview picasso android-glide
1个回答
© www.soinside.com 2019 - 2024. All rights reserved.