【问题标题】:Get NullPointerException when trying load image with Glide尝试使用 Glide 加载图像时获取 NullPointerException
【发布时间】:2021-09-23 22:06:29
【问题描述】:

我正在尝试使用 Uri 的 Glide 从 RoomDB 加载图像,但我得到了 NPE。我做错了什么?这条 Uri 路径看起来是否正确? [/storage/emulated/0/Pictures/Title (19).jpg]

更新

错误代码

2021-09-24 01:21:07.048 24013-24013/com.example.rempractice W/Glide: Load failed for [content://media/external/images/media/71] with size [316x294]
    class com.bumptech.glide.load.engine.GlideException: Failed to load resource
      Cause (1 of 1): class com.bumptech.glide.load.engine.GlideException: Failed LoadPath{StringUri->Object->Drawable}, LOCAL
        Cause (1 of 2): class com.bumptech.glide.load.engine.GlideException: Failed DecodePath{StringUri->Drawable->Drawable}
        Cause (2 of 2): class com.bumptech.glide.load.engine.GlideException: Failed DecodePath{StringUri->Bitmap->Drawable}

在这段代码中,我将数据检索到 RoomDB 中

        ARB.contRem.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(ARB.remText.getText().toString().equals("")){
                    ARB.err.setText("errCode");
                }
                else if(ARB.dateFromCalendar.getText().toString().equals("")){
                    ARB.err.setText("errCode");
                }
                else {
                    Bitmap bitmap = ((BitmapDrawable)ARB.addImageRem.getDrawable()).getBitmap();

                    Uri uri = getImageUri(getContext(), bitmap);
                    list.add(uri.toString());

                    ARVM.addReminder(ARB.remText.getText().toString(),
                            ARB.dateFromCalendar.getText().toString(),
                            false,
                            list);

                    Navigation.findNavController(v).popBackStack();
                }
            }

这就是我采取 Uri 路径的方式

     public Uri getImageUri(Context inContext, Bitmap inImage) {
        ByteArrayOutputStream bytes = new ByteArrayOutputStream();
        inImage.compress(Bitmap.CompressFormat.JPEG, 100, bytes);
        String path = MediaStore.Images.Media.insertImage(inContext.getContentResolver(), inImage, "Title", null);
        return Uri.parse(path);
    }

DTO 类

    @Override
    public List<String> getImages() {
        if (super.getImages() == null || super.getImages().isEmpty()) {
            super.setImages(new Gson().fromJson(this.images, List.class));
        }
        return super.getImages();
    }
    @Override
    public void setImages(List<String> images) {
        super.setImages(images);
        this.images = new Gson().toJson(images);
    }

适配器类,我认为我的 Glide 表达式有问题

    @Override
    public void onBindViewHolder(@NonNull reminderViewHolder holder, int position) {


        List<String> photos = rems.get(position).getImages();
        Uri uri = Uri.parse(Arrays.toString(photos.toArray()));

        GlideApp.with(hostFragment)
                .load(uri)
                .apply(new RequestOptions().diskCacheStrategy(DiskCacheStrategy.NONE))
                .into(holder.binding.imageView);


        holder.binding.textrow.setText(rems.get(position).getTextRem());
        holder.binding.daterow.setText(rems.get(position).getDateRem());
        holder.binding.isdone.setChecked(rems.get(position).isDone());

    }

【问题讨论】:

  • 删除getRealPathFromURI()Uri 不是文件。使用Uri 本身。例如,您可以将Uri 传递给load() 以供Glide 使用。并且,删除DrawableImageViewTarget——只需将ImageView 传递给into()
  • 更新了我的问题@CommonsWare

标签: java android android-room android-glide


【解决方案1】:

它在Glide documentation 中提到了权限

要从本地文件夹(如 DCIM 或图片)加载图像,您需要添加 READ_EXTERNAL_STORAGE 权限

那么可能是您没有在您的 android Manifest 中声明此权限吗?

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="your.package.name"

    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

    <application>
      ...
    </application>
</manifest>

这只是我想到的一个建议。

【讨论】:

    【解决方案2】:

    确保您在清单中有&lt;uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /&gt;

    改变

    GlideApp.with(hostFragment)
                    .load(uri)
                    .apply(new RequestOptions().diskCacheStrategy(DiskCacheStrategy.NONE))
                    .into(holder.binding.imageView);
    

    Glide.with(context).load(uri).into(holder.imageView);
    

    就是这样。

    【讨论】:

      【解决方案3】:

      答案很简单,我试图将所有 Array 加载到 uri 中

      之前

      Uri uri = Uri.parse(Arrays.toString(photos.toArray()));
      

      之后

      Uri uri = Uri.parse(photos.get(0));
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-19
        • 1970-01-01
        • 1970-01-01
        • 2017-10-01
        • 1970-01-01
        • 2016-05-20
        相关资源
        最近更新 更多