프로젝트

[안드로이드 스튜디오] 파이어베이스 storage에 이미지 업로드하기 / 불러오는 함수

gom1n 2021. 8. 29. 12:12

그냥 안드로이드 스튜디오 내에 drawable 폴더에 이미지를 삽입하는 편한 경우도 있지만,

이번에 진행하는 프로젝트는 관리자가 업로드한 이미지를 끌어오는 방식을 써야하기 때문에

파이어베이스 스토리지를 사용하려 한다.

파이어베이스 realtimeBase에 이미지를 바이트형식으로 넣는 방법도 있지만, 

그렇게 되면 너무 번거롭고 realtimeBase에 넣어야할 데이터양이 많아져 storage를 사용하기로 결정!

 

파이어베이스 Storage에 들어간다.

storage 시작하기 클릭 / 이후 나오는 창에서 [다음] 클릭 / [완료] 클릭 을 하면, 

스토리지가 생성된다.

 

 

그 다음 Rules에 들어가 규칙을 수정해줄 것이다.

수정 전 / 수정 후

초기화면은 왼쪽과 같고, 그 내용들을

rules_version = '2';
service firebase.storage {
  match /b/{bucket}/o {
    match /{allPaths=**} {
      allow read, write: if true;
    }
  }
}

이렇게 바꿔준뒤 [게시]를 눌러준다.

이렇게 하지 않아주면, permission denied가 되어 아무나 이미지를 접근하지 못하게 된다고 한다.

 

 

manifest에 들어가 권한 허용 코드를 써준다.

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

 

 

build.gradle:app에 들어가 implementation 추가

implementation platform('com.google.firebase:firebase-bom:26.5.0')
implementation 'com.google.firebase:firebase-storage'

이미지 넣기 함수 및 loadAlbum() 

- loadAlbum() 함수는 안드로이드 기기 내의 갤러리에 접근하는 역할을 한다.

private void loadAlbum(){
        Intent intent = new Intent(Intent.ACTION_PICK);
        intent.setType(MediaStore.Images.Media.CONTENT_TYPE);
        startActivityForResult(intent, GALLERY_CODE);
    }

    @Override
    protected void onActivityResult(int requestCode, final int resultCode, final Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == GALLERY_CODE) {
            Uri file = data.getData();
            StorageReference storageRef = storage.getReference();
            StorageReference riversRef = storageRef.child("[이미지경로]");
            UploadTask uploadTask = riversRef.putFile(file);
            
            try {
                InputStream in = getContentResolver().openInputStream(data.getData());
                Bitmap img = BitmapFactory.decodeStream(in);
                in.close();
                photo.setImageBitmap(img);
            } catch (Exception e) {
                e.printStackTrace();
            }

            uploadTask.addOnFailureListener(new OnFailureListener() {
                @Override
                public void onFailure(@NonNull Exception exception) {
                    Toast.makeText(ImgActivity.this, "사진이 정상적으로 업로드 되지 않았습니다." ,Toast.LENGTH_SHORT).show();
                }
            }).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
                @Override
                public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
                    Toast.makeText(ImgActivity.this, "사진이 정상적으로 업로드 되었습니다." ,Toast.LENGTH_SHORT).show();
                }
            });
        }
    }

 

이미지 불러오기 함수

- 이미지를 불러오는 것은 Glide 라이브러리를 사용하였다.

        FirebaseStorage storage = FirebaseStorage.getInstance(); //스토리지 인스턴스를 만들고,
        // 다운로드는 주소를 넣는다.
        StorageReference storageRef = storage.getReference();//스토리지를 참조한다
        storageRef.child("[이미지경로]").getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
            @Override
            public void onSuccess(Uri uri) { //성공시
                Glide.with(itemBarcode.this).load(uri)
                        .error(R.drawable.loading)
                        .into(itemBarcode);
            } }).addOnFailureListener(new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception exception) {
                //실패시
                Toast.makeText(getApplicationContext(), "진입실패.", Toast.LENGTH_SHORT).show();
            }
        });

 

Glide 라이브러리 사용방법

- build.gradle (:app)에 implement 해준다.

implementation 'com.github.bumptech.glide:glide:3.7.0'
Glide.with(itemBarcode.this).load(uri)	// 이미지 경로 uri
                        .error(R.drawable.loading)	// error가 났을 때 로드되는 이미지
                        .into(itemBarcode);		// 이미지를 넣을 레이아웃id