1

I am using ROOM DB for storing inforations about some products.Part of it is an Image.Storing image path in ROOM.Everything works fine apart from images are not showing in recycleview.Other informations in form String and int are showing normally but images not.I do not get any errors but this is showing in my logcat logcat:

W/Glide: Load failed for content:/com.android.providers.media.documents/document/image%3A665917 with size [159x1920] class com.bumptech.glide.load.engine.GlideException: Failed to load resource There were 3 causes: java.io.FileNotFoundException(No content provider: content:/com.android.providers.media.documents/document/image%3A665917) java.io.FileNotFoundException(No content provider: content:/com.android.providers.media.documents/document/image%3A665917) java.io.FileNotFoundException(No content provider: content:/com.android.providers.media.documents/document/image%3A665917) call GlideException#logRootCauses(String) for more detail Cause (1 of 3): class com.bumptech.glide.load.engine.GlideException: Fetching data failed, class java.io.InputStream, LOCAL There was 1 cause: java.io.FileNotFoundException(No content provider: content:/com.android.providers.media.documents/document/image%3A665917) call GlideException#logRootCauses(String) for more detail Cause (1 of 1): class com.bumptech.glide.load.engine.GlideException: Fetch failed There was 1 cause: java.io.FileNotFoundException(No content provider: content:/com.android.providers.media.documents/document/image%3A665917) call GlideException#logRootCauses(String) for more detail Cause (1 of 1): class java.io.FileNotFoundException: No content provider: content:/com.android.providers.media.documents/document/image%3A665917 Cause (2 of 3): class com.bumptech.glide.load.engine.GlideException: Fetching data failed, class android.os.ParcelFileDescriptor, LOCAL There was 1 cause: java.io.FileNotFoundException(No content provider: content:/com.android.providers.media.documents/document/image%3A665917) call GlideException#logRootCauses(String) for more detail Cause (1 of 1): class com.bumptech.glide.load.engine.GlideException: Fetch failed There was 1 cause: java.io.FileNotFoundException(No content provider: content:/com.android.providers.media.documents/document/image%3A665917) call GlideException#logRootCauses(String) for more detail Cause (1 of 1): class java.io.FileNotFoundException: No content provider: content:/com.android.providers.media.documents/document/image%3A665917 Cause (3 of 3): class com.bumptech.glide.load.engine.GlideException: Fetching data failed, class android.content.res.AssetFileDescriptor, LOCAL There was 1 cause: java.io.FileNotFoundException(No content provider: content:/com.android.providers.media.documents/document/image%3A665917) call GlideException#logRootCauses(String) for more detail Cause (1 of 1): class java.io.FileNotFoundException: No content provider: content:/com.android.providers.media.documents/document/image%3A665917

My MainActivity:

 public class MainActivity extends AppCompatActivity {
    private FloatingActionButton floatingActionButton;
    private RecyclerView recyclerView;
    private List<Deo> listaSvihDelova;
    private DeoAdapter adapter;
    public static final int ZAHTEV_ZA_DODAVANJE_DELA = 1;
    private DeoViewModel deoViewModel;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        listaSvihDelova = new ArrayList<>();
        recyclerView = findViewById(R.id.recycle_view);
        adapter = new DeoAdapter(listaSvihDelova, this);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        recyclerView.setAdapter(adapter);

        deoViewModel = ViewModelProviders.of(this).get(DeoViewModel.class);
        deoViewModel.dohvatiSveDelove().observe(this, new Observer<List<Deo>>() {
            @Override
            public void onChanged(List<Deo> deos) {
                adapter.setujDelove(deos);
            }
        });

        floatingActionButton = findViewById(R.id.fab);
        floatingActionButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(MainActivity.this, AddEditDeo.class);
                startActivityForResult(intent,ZAHTEV_ZA_DODAVANJE_DELA);
                Toast.makeText(MainActivity.this, "Unesi nov deo", Toast.LENGTH_SHORT).show();
            }
        });

    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        if (requestCode == ZAHTEV_ZA_DODAVANJE_DELA && resultCode==RESULT_OK){
            String imeDela = data.getStringExtra(IME_EXTRA);
            int cenaDela = data.getIntExtra(CENA_EXTRA,0);
            String komentar = data.getStringExtra(KOMENTAR_EXTRA);
            String putanjaSlike = data.getStringExtra(PUTANJA_SLIKE_EXTRA);
            Deo deo = new Deo(imeDela,cenaDela,putanjaSlike,komentar);
            deoViewModel.insert(deo);

        }
    }

My AddEditACtivity:

  public class AddEditDeo extends AppCompatActivity {
    public static final String IME_EXTRA = "IME_EXTRA";
    public static final String CENA_EXTRA ="CENA_EXTRA";
    public static final String PUTANJA_SLIKE_EXTRA = "PUTANJA_SLIKE_EXTRA";
    public static final String KOMENTAR_EXTRA = "KOMENTAR_EXTRA";
    public static final int ZAHTEV_ZA_BIRANE_SLIKE = 3;

    private EditText unosImenaDela;
    private EditText unosCeneDela;
    private ImageView slikaDela;
    private EditText unosKomentara;
    private String imageUriString;
    private Uri selectedImageUri;

    private Button saveButton;
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.add_edit_view);

        unosImenaDela = findViewById(R.id.imedela_edit_text);
        unosCeneDela = findViewById(R.id.cena_dela_text_view);
        slikaDela = findViewById(R.id.slika);
        unosKomentara = findViewById(R.id.komentar_text_view);

        slikaDela.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent();
                intent.setType("image/*");
                intent.setAction(Intent.ACTION_OPEN_DOCUMENT );
                startActivityForResult(Intent.createChooser(intent, "select a picture"), ZAHTEV_ZA_BIRANE_SLIKE);
                Toast.makeText(AddEditDeo.this, "izaberi jednu sliku", Toast.LENGTH_SHORT).show();
            }
        });

        saveButton = findViewById(R.id.save_button);
        saveButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                sacuvajDeo();
                Toast.makeText(AddEditDeo.this, "Dugme je kliknuto", Toast.LENGTH_SHORT).show();
            }
        });
    }
    private void sacuvajDeo(){

        String imeDelaString = unosImenaDela.getText().toString();
        String ceneDelaString = unosCeneDela.getText().toString();
        int cenaDelaInt = Integer.parseInt(ceneDelaString);
        String komentarString = unosKomentara.getText().toString();
        String slikaString = imageUriString;

        Intent intent = new Intent();
        intent.putExtra(IME_EXTRA,imeDelaString);
        intent.putExtra(CENA_EXTRA,cenaDelaInt);
        intent.putExtra(KOMENTAR_EXTRA,komentarString);
        intent.putExtra(PUTANJA_SLIKE_EXTRA,slikaString);
        setResult(RESULT_OK,intent);
        finish();

    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == ZAHTEV_ZA_BIRANE_SLIKE && resultCode == RESULT_OK) {
            selectedImageUri = data.getData();
            imageUriString = selectedImageUri.toString();
            slikaDela.setImageURI(selectedImageUri);

        }
    }
}

My Adapter:

    public class DeoAdapter extends RecyclerView.Adapter<DeoAdapter.DeoViewHolder> {
    private List<Deo> listaDelova;
    private Context context;

    public DeoAdapter(List<Deo> listaDelova, Context context) {
        this.listaDelova = listaDelova;
        this.context = context;
    }

    @NonNull
    @Override
    public DeoViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        Context context = parent.getContext();
        LayoutInflater inflater = LayoutInflater.from(context);

        // Inflate the custom layout
        View deoView = inflater.inflate(R.layout.single_item, parent, false);

        // Return a new holder instance
        return new DeoViewHolder(deoView);
    }

    @Override
    public void onBindViewHolder(@NonNull DeoViewHolder holder, int position) {
        Deo deo = listaDelova.get(position);
        holder.imeDela.setText(deo.getImeDela());
        //holder.slikaDela.setImageURI(Uri.parse(new File(deo.getPutanjaSlike()).toString()));
        holder.cenaDela.setText(String.valueOf(deo.getCenaDela()));
        Glide.with(context)
                .load(Uri.fromFile(new File(deo.getPutanjaSlike())))
                .into(holder.slikaDela);
    }

    @Override
    public int getItemCount() {
        return listaDelova.size();
    }

    public void setujDelove(List<Deo> delovi) {
        this.listaDelova = delovi;
        notifyDataSetChanged();
    }

    public class DeoViewHolder extends RecyclerView.ViewHolder {
        private TextView imeDela;
        private ImageView slikaDela;
        private TextView cenaDela;


        public DeoViewHolder(@NonNull View itemView) {
            super(itemView);
            imeDela = itemView.findViewById(R.id.naziv_dela);
            slikaDela = itemView.findViewById(R.id.sinle_item_slika);
            cenaDela = itemView.findViewById(R.id.cena_dela);

        }
    }
}
Bhoomika Patel
  • 1,895
  • 1
  • 13
  • 30
gojic
  • 363
  • 7
  • 20

2 Answers2

1

Your image is failed to load because the image path which you are trying to load is not real path. try to get real path from uri from this link:

gist.github.com/tatocaster/32aad15f6e0c50311626

add RealPathUtil class and call method like this in your adapter class

  @Override
public void onBindViewHolder(@NonNull DeoViewHolder holder, int position) {
    Deo deo = listaDelova.get(position);
    holder.imeDela.setText(deo.getImeDela());
    //holder.slikaDela.setImageURI(Uri.parse(new File(deo.getPutanjaSlike()).toString()));
    holder.cenaDela.setText(String.valueOf(deo.getCenaDela()));

    Uri pathUri=Uri.parse(deo.getPutanjaSlike());
    String realPath = RealPathUtil.getRealPathFromURI_API19(context,pathUri);
    pathUri=Uri.parse(realpath);

    Glide.with(context)
            .load(pathUri)
            .into(holder.slikaDela);
}
Ankit
  • 1,068
  • 6
  • 10
  • again,don't know where to put this,because i don't know what part of my code is making a problem,thank you for your patiance :) – gojic Sep 28 '19 at 12:21
1

I Guess the path or decoding the Image file is not working properly.

Refer the Below Link :

Glide load local image by Uri.

Also, you can use Picasso instead of Glide.

https://medium.com/@multidots/glide-vs-picasso-930eed42b81d

Stephan John
  • 331
  • 1
  • 2
  • 11