프로젝트

[안드로이드 스튜디오] 파이어베이스 storage 이미지 모두 불러오기 / 결제 바코드 구분 코드

gom1n 2021. 9. 5. 19:51

파이어베이스 storage 안에 있는 이미지를 불러오려면 다음 공식사이트를 참고하여 listAll()을 써주면 된다.

https://firebase.google.com/docs/storage/android/list-files?hl=ko 

 

Android에서 Cloud Storage로 파일 나열  |  Firebase

Google은 흑인 공동체를 위한 인종적 평등을 추구하기 위해 노력하고 있습니다. 자세히 알아보기 의견 보내기 Android에서 Cloud Storage로 파일 나열 Firebase용 Cloud Storage를 사용하면 Cloud Storage 버킷의

firebase.google.com

 

 

그러나 내가 구현하고자 하는 것은 마켓 구현이기 때문에,

결제된 바코드와 결제되지 않은 바코드를 구분할 필요가 있었다.

따라서 결제된 바코드 사진의 url을 파이어베이스 realtime database에 저장시키고,

listAll을 사용해 파일 하나를 불러올 때마다 결제된 바코드 url과 일치한다면 break, 

일치하지 않는다면 그것이 바로 사용자에게 제공될 바코드이기 때문에 함수를 수행하게끔 하였다.


INDEX

1. listAll() 코드 사용

2. 1번 코드 안에 item.DownLoadUrl() 코드 사용

3. 2번 코드 안에 database 코드 사용

3. 전체 코드 및 결과화면


차근차근 시작해보자.

1. 우선 위의 listAll 코드를 활용한다.

FirebaseStorage storage = FirebaseStorage.getInstance();
StorageReference listRef = storage.getReference().child("itemBarcode");
        listRef.listAll()
                .addOnSuccessListener(new OnSuccessListener<ListResult>() {
                    @Override
                    public void onSuccess(ListResult listResult) {
                        for (StorageReference item : listResult.getItems()) {
                            ... [A 파트]
                        }
                    }
                })
                .addOnFailureListener(new OnFailureListener() {
                    @Override
                    public void onFailure(@NonNull Exception e) {
                        // Uh-oh, an error occurred!
                    }
                });

파일을 나열할 수 있는 코드라니. 나는 또 이미지 이름 하나하나 구해서 돌릴 생각에 머리가 까마득했었다.

listResult의 아이템들을 하나하나 가져와 for문으로 돌려 아이템들을 비교할 수 있을 듯 하다.

 

2. 이 아이템들의 url들을 불러와야한다.

item.getDownloadUrl()을 사용하면 된다.

위 코드의 [A파트]에 삽입해주면 된다.

item.getDownloadUrl().addOnCompleteListener(new OnCompleteListener<Uri>() {
	@Override
	public void onComplete(@NonNull Task<Uri> task) {
		if (task.isSuccessful()) {
			String uri = task.getResult().toString();
			isBought = false;
			...[B파트]
		}
	}).addOnFailureListener(new OnFailureListener() {
	@Override
	public void onFailure(@NonNull Exception e) {
		Toast.makeText(itemBarcode.this, "진입실패", Toast.LENGTH_SHORT).show();
	}
});

 

 

3. 파이어베이스 realtime database 안의 결제된 바코드 url들과 비교를 시작한다.

만약 이미 결제된 코드라면 boolean isBought 를 true로 바꿔주고 break,

아니라면 파이어베이스 realtime database에 url를 넣어주고 사용자 개인계정에도 넣어준다. (나중에 바코드 사진을 불러오기 위해)

 

database 객체를 불러오는 코드를 안에 삽입해준다. 

(위 코드의 [B파트]안에 삽입해준다.)

databaseReference.child("buy").addValueEventListener(new ValueEventListener() {
	@Override
	public void onDataChange(@NonNull DataSnapshot snapshot) {
		for(DataSnapshot dataSnapshot : snapshot.getChildren()) {
			if(uri.equals(dataSnapshot.getValue(String.class))) {
				isBought = true;
				break;
			}
		}
		if(isBought == false) {
			databaseReference.child("buy").child(buyTime).setValue(uri);
			databaseReference.child("users/"+id+"_"+website+"/marketHistory/"+buyTime+"/imageURI").setValue(uri);
		}
	}
	@Override
	public void onCancelled(@NonNull DatabaseError error) {

	}
});

 

참고로 이미 결제된 바코드는 realtime database에 이렇게 저장해두었다.
상품 구매 history에도 이렇게 삽입해주었다.

3. 전체코드

FirebaseStorage storage = FirebaseStorage.getInstance();
        StorageReference listRef = storage.getReference().child("itemBarcode");
        listRef.listAll()
                .addOnSuccessListener(new OnSuccessListener<ListResult>() {
                    @Override
                    public void onSuccess(ListResult listResult) {
                        for (StorageReference item : listResult.getItems()) {
                            item.getDownloadUrl().addOnCompleteListener(new OnCompleteListener<Uri>() {
                                @Override
                                public void onComplete(@NonNull Task<Uri> task) {
                                    if (task.isSuccessful()) {
                                        String uri = task.getResult().toString();
                                        isBought = false;
                                        databaseReference.child("buy").addValueEventListener(new ValueEventListener() {
                                            @Override
                                            public void onDataChange(@NonNull DataSnapshot snapshot) {
                                                for(DataSnapshot dataSnapshot : snapshot.getChildren()) {
                                                    if(uri.equals(dataSnapshot.getValue(String.class))) {
                                                        isBought = true;
                                                        break;
                                                    }
                                                }
                                                if(isBought == false) {
                                                    databaseReference.child("buy").child(buyTime).setValue(uri);
                                                    databaseReference.child("users/"+id+"_"+website+"/marketHistory/"+buyTime+"/imageURI").setValue(uri);
                                                }
                                            }
                                            @Override
                                            public void onCancelled(@NonNull DatabaseError error) {

                                            }
                                        });
                                    }
                                }

                            }).addOnFailureListener(new OnFailureListener() {
                                @Override
                                public void onFailure(@NonNull Exception e) {
                                    Toast.makeText(itemBarcode.this, "진입실패", Toast.LENGTH_SHORT).show();
                                }
                            });
                        }

                    }
                })
                .addOnFailureListener(new OnFailureListener() {
                    @Override
                    public void onFailure(@NonNull Exception e) {
                        // Uh-oh, an error occurred!
                    }
                });

 

 

결과화면

 


*번외

이 결제된 바코드를 상품구매내역에서 불러와보자. 

1) 리스트뷰 클릭 이벤트 함수 - intent로 정보 넘겨줌

// 상품구매내역 클릭 시 물품 바코드 등장!
        listViews.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> a_parent, View a_view, int a_position, long a_id) {
                BuyItem item = (BuyItem) a_parent.getAdapter().getItem(a_position);
                String url = item.getImageURI();
                Intent intent = new Intent(getApplicationContext(), seeBarcode.class);
                intent.putExtra("imageURI", url);
                System.out.println(url);
                startActivity(intent);
            }
        });

2) seeBarcode.java

intent로 넘겨진 이미지 url를 받아 Glide로 보여준다.

Intent intent = getIntent();
        String url = intent.getStringExtra("imageURI");
        Glide.with(seeBarcode.this).load(url)
                .error(R.drawable.loading)
                .into(seeBarcode);

구매목록 클릭 > 바코드 사진 출력


사실 정말 많은 고민을 했다.

이정도면 마켓 라이브러리를 돈내고 찾아서 도입해야하나... 많이 고민했지만

우리는 돈 없는 대학생들이기 때문에^^

파이어베이스 storage에 임시 바코드들을 넣고 코드를 직접 짜기로 하였다.

결제하자마자 사진을 보여주고 바로 삭제할까? 하면서 storage 파일삭제 코드도 만져보고

카카오톡으로 보내줄까? 문자로 전송해줄까? 이메일로 보내볼까? 하면서 kakao sdk도 넣어보고 SMS 코드도 넣어보고 email 자동발송 라이브러리도 삽입해보고 그랬었다...

 

근데 생각보다 잘 되지 않았다. 가상 디바이스로만 확인해서 그런가 (안드 기기가 없어서...)

그래서 그냥 파베로 이리저리 url을 넣어주고 하면서 짜주었다.

그래도 하루종일 붙잡으니까 오류도 점점 해결되고 나아지더라. 하루로 끝난게 다행인건가싶다.