안드로이드 uri를 사용하여 이미지 뿌리기

조회수 3363회

제가 안드로이드 스튜디오에서 앱을 만들고 있습니다. 프래그먼트에서 버튼을 클릭하면 대화상자가 뜨고 사진과 간략한 설명을 넣을 수 있습니다. (사진은 사용자의 갤러리에서 가져옵니다.) 확인을 누르면 대화상자가 닫히고 프래그먼트에 존재하는 RecyclerView에 이미지와 설명이 들어갑니다. 그러나 제가 짠 코드는 설명은 들어가나 이미지가 들어가지 않습니다. 이에 대한 해결방안을 듣고 싶어서 질문을 올리게 되었습니다. 답변해주시면 감사하겠습니다!

저의 코드가 어떻게 돌아가는지 간략히 설명하자면, 대화상자에서 이미지를 받아오면 토스트 메시지로 해당 파일의 경로(/storage/emulated/0/Pictures/a.jpg)를 띄워주고 대화상자가 닫힘과 동시에 프래그먼트로 경로와 설명이 String 형태로 전달되고 경로는 프래그먼트에서 다시 Uri로 변환되어 이를 이용한 Bitmap으로 변하여 RecyclerView에 뿌려지는 형식입니다.

아래는 저의 코드입니다.

**Fragment.java**
//        리스트를 생성하기 위한 버튼
        btn_addlist = view.findViewById(R.id.btn_addlist);
        btn_addlist.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
//                버튼을 클릭하면 DialogFragment_cus 객체를 생성하여 보여준다.
                DialogFragment_cus dialog = new DialogFragment_cus();
                dialog.show(getActivity().getSupportFragmentManager(), "tag");

//                DialogFragment_cus.java에서 보낸 데이터를 전달 받는다.
                dialog.setDialogResult(new DialogFragment_cus.OnMyDialogResult() {
//                    result : uri, result2 : dlg_edtName, result3 : dlg_edtSubtitle
                    @Override
                    public void finish(String result, String result2, String result3) {
                        imageUri = result;  RecyclerInputName = result2;
                        RecyclerInputSubtitle = result3;
                        Uri uri = Uri.parse("file://" + imageUri);
                        Bitmap bitmap = null;
                        try {
//                            uri 주소를 Bitmap으로 변환한다.
                            bitmap = MediaStore.Images.Media.getBitmap(getActivity().getContentResolver(), uri);
                        } catch (FileNotFoundException e) {
                            e.printStackTrace();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                        RecyclerItem_cus item = new RecyclerItem_cus(bitmap, RecyclerInputName, RecyclerInputSubtitle);
                        mArrayList.add(0, item);
                        mAdapter.notifyDataSetChanged();
                        Toast.makeText(getActivity(), "리스트가 완성되었습니다! 삭제하시려면 리스트를 길게 눌러주세요.", Toast.LENGTH_SHORT).show();
                    }
                });
            }
        });

**DialogFragment.java**
//        dlg_AddButton : 갤러리에서 사진 가져오기
        dlg_AddButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent();
                intent.setType("image/*");
                intent.setAction(Intent.ACTION_PICK);
                startActivityForResult(intent, 1);
            }
        });
//        dlg_ok : RecyclerView에 반영
        dlg_ok.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                DialogFragment_cus fragment = new DialogFragment_cus();
//                사용자가 리스트에 넣기 위해 적은 텍스트를 저장한다.
                String input1 = dlg_edtName.getText().toString();
                String input2 = dlg_edtSubtitle.getText().toString();
                if(fragment != null) {
                    if(mDialogResult != null ) {
//                        uri, dlg_edtName, dlg_edtSubtitle을 각각 finish 함수로 전달한다.
                        mDialogResult.finish(name_Str, input1, input2);
                    }
                }
                dismiss();
            }
        });

//        dlg_cancel : Dialog 닫기
        dlg_cancel.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
//                dismiss : Dialog 닫기
                dismiss();
            }
        });
        return view;
    }
    public void setDialogResult(OnMyDialogResult dialogResult){
        mDialogResult = dialogResult;
    }

    public interface OnMyDialogResult{
        void finish(String result, String result2, String result3);
    }

//    갤러리를 호출하여 선택된 이미지를 onActivityResult() 메서드에 받은 후 Bitmap으로 ImageView에 표시
    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == 1 && resultCode == RESULT_OK) {
            try {
                name_Str = getImageNameToUri(data.getData());
//                선택한 이미지에서 비트맵 생성
                InputStream in = getActivity().getContentResolver().openInputStream(data.getData());
                Bitmap img = BitmapFactory.decodeStream(in);
                in.close();
//                이미지 표시 및 ImageView 배경 투명화
                dlg_ImageView.setImageBitmap(img);
                dlg_ImageView.setBackgroundResource(android.R.color.white);
                Toast.makeText(getActivity(), "name_Str : "+name_Str , Toast.LENGTH_LONG).show();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

//    실제 이미지 파일이 저장된 경로를 얻기 위한 메소드
//    갤러리 액티비티를 통해 선택한 이미지의 uri 값을 파라미터로 던져주면 실제 SD카드의 경로를 리턴해주는 함수이다.
    public String getImageNameToUri(Uri uri) {
        String[] projection = {MediaStore.Images.Media.DATA};
        Cursor cursor = getActivity().getContentResolver().query(uri, projection, null, null, null);
        getActivity().startManagingCursor(cursor);
        int columnIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
        cursor.moveToFirst();
        return cursor.getString(columnIndex);
    }


**RecyclerView_cusAdapter.java**
@Override
    public void onBindViewHolder(@NonNull final MyViewHolder myViewHolder, int i) {
        final RecyclerItem_cus item = items.get(i);
        if (item != null) {
            Glide.with(context)
                    .load(item.getImage())
                    .asBitmap()
                    .format(DecodeFormat.PREFER_ARGB_8888)
                    .into(new SimpleTarget<Bitmap>() {
                        @Override
                        public void onResourceReady(Bitmap resource, GlideAnimation<? super Bitmap> glideAnimation) {
                            myViewHolder.cus_img.setImageBitmap(resource);
                        }
                    });
            myViewHolder.cus_title.setText(item.getTitle());
            myViewHolder.cus_subtitle.setText(item.getSubTitle());
        }
    }

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

    public class MyViewHolder extends RecyclerView.ViewHolder {
        TextView cus_title;
        TextView cus_subtitle;
        ImageView cus_img;

        public MyViewHolder(View itemView) {
            super(itemView);

            cus_title = itemView.findViewById(R.id.cus_title);
            cus_subtitle = itemView.findViewById(R.id.cus_subtitle);
            cus_img = itemView.findViewById(R.id.cus_img);
        }
    }

**RecyclerItem_cus.java**
public class RecyclerItem_cus {
    private Bitmap image;
    private String title;
    private String subTitle;

    public RecyclerItem_cus(Bitmap image, String title, String subTitle) {
        this.image = image;
        this.title = title;
        this.subTitle = subTitle;
    }

    public Bitmap getImage() {
        return image;
    }
    public String getTitle() {
        return title;
    }
    public String getSubTitle() {
        return subTitle;
    }

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)