그냥 안드로이드 스튜디오 내에 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
'프로젝트' 카테고리의 다른 글
[안드로이드 스튜디오][API][JSON파싱] 대한민국 공공서비스 목록 구현하기 (0) | 2021.10.02 |
---|---|
[안드로이드 스튜디오] 파이어베이스 storage 이미지 모두 불러오기 / 결제 바코드 구분 코드 (0) | 2021.09.05 |
[안드로이드 스튜디오] 엑셀파일 읽어오기 (0) | 2021.08.28 |
[안드로이드 스튜디오] 엑셀 파일을 내부DB에 저장 후 불러오기 (0) | 2021.08.24 |
[안드로이드 스튜디오] 커스텀 리스트뷰 검색기능 (0) | 2021.08.24 |