[안드로이드][Java] 파이어베이스 스토리지 파일 업로드 및 다운로드 getDownloadUrl(), 파이어베이스 데이터 베이스 이미지 업로드

2022. 9. 6. 09:45·정리 전 게시글/공부 관련
작업이나 공부를 하면서 막힌 부분을 해결했던 것, 알고 싶었던 것이나 알리고 싶은 것을 올리는 블로그입니다
최대한 검증은 하겠지만 100% 정확한 글이 아니므로 단순 참고만 해주시길 바랍니다 :)
사실 공부한거 블로그 주인장이 안까먹을려고 올리는거임

파이어베이스

파이어베이스 데이터베이스에는 사진을 올릴 수 없으니 파이어베이스 스토리지에 업로드를 한 후 데이터베이스에는 파일의 다운로드 uri를 저장하여 사용한다

 

사진 선택하기

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity"
    android:padding="10dp">

    <ImageView
        android:id="@+id/image_view"
        android:layout_width="300dp"
        android:layout_height="300dp"
        android:src="@drawable/common_google_signin_btn_icon_dark"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"/>

    <Button
        android:id="@+id/button_select"
        android:layout_width="120dp"
        android:layout_height="wrap_content"
        android:text="사진 선택"
        app:layout_constraintTop_toBottomOf="@+id/image_view"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        android:backgroundTint="#838383"
        android:layout_marginTop="20dp"/>

    <Button
        android:id="@+id/button_upload"
        android:layout_width="120dp"
        android:layout_height="wrap_content"
        android:text="사진 업로드"
        app:layout_constraintTop_toBottomOf="@+id/button_select"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        android:backgroundTint="#838383"
        android:layout_marginTop="20dp"/>

    <Button
        android:id="@+id/button_show"
        android:layout_width="120dp"
        android:layout_height="wrap_content"
        android:text="사진 보기"
        app:layout_constraintTop_toBottomOf="@+id/button_upload"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        android:backgroundTint="#838383"
        android:layout_marginTop="20dp"/>

</androidx.constraintlayout.widget.ConstraintLayout>
public class MainActivity extends AppCompatActivity {

    private Uri uri;

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

        ImageView imageView = findViewById(R.id.image_view);
        Button buttonSelect = findViewById(R.id.button_select);

        buttonSelect.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(Intent.ACTION_GET_CONTENT );
                intent.setType("image/*");
                launcher.launch(intent);

            }
        });

    }

    private final ActivityResultLauncher<Intent> launcher = registerForActivityResult(
            new ActivityResultContracts.StartActivityForResult(),
            new ActivityResultCallback<ActivityResult>() {
                @Override
                public void onActivityResult(ActivityResult result) {
                    if(result.getResultCode() == RESULT_OK && result.getData() != null) {
                        uri = result.getData().getData();
                        Log.d("test", uri.toString());

                    }
                }
            });
}

사진 선택은 StartActivityForResult가 지원이 중단되어서 ActivityResultLauncher를 사용하면 된다고 하네요

 

사진 Storage에 업로드

private void upload() {
    StorageReference storageReference = FirebaseStorage.getInstance().getReference("Study");
    storageReference.child("images").child("image").putFile(uri).addOnCompleteListener(new OnCompleteListener<UploadTask.TaskSnapshot>() {
        @Override
        public void onComplete(@NonNull Task<UploadTask.TaskSnapshot> task) {
            if(task.isSuccessful()) {
                Toast.makeText(MainActivity.this, "업로드에 성공했습니다", Toast.LENGTH_SHORT).show();
            }
            else {
                Toast.makeText(MainActivity.this, "업로드에 실패했습니다", Toast.LENGTH_SHORT).show();
            }
        }
    });
}

저장은 Study/images/image로 저장이 됩니다.

 

getDownloadUri()로 사진 다운로드 uri 받고 이미지 설정

private void show() {
    StorageReference storageReference = FirebaseStorage.getInstance().getReference("Study");
    storageReference.child("images").child("image").getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
        @Override
        public void onSuccess(Uri uri) {
            Glide.with(MainActivity.this).load(uri).into(imageView);
        }
    });
}

 

전체 코드

public class MainActivity extends AppCompatActivity {

    private Uri uri;
    private ImageView imageView;

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

        imageView = findViewById(R.id.image_view);

        Button buttonSelect = findViewById(R.id.button_select);

        buttonSelect.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                select();
            }
        });

        Button button_upload = findViewById(R.id.button_upload);
        button_upload.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                upload();
            }
        });

        Button button_show = findViewById(R.id.button_show);
        button_show.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                show();
            }
        });

    }

    private void select() {
        Intent intent = new Intent(Intent.ACTION_GET_CONTENT );
        intent.setType("image/*");
        launcher.launch(intent);
    }

    private void upload() {
        StorageReference storageReference = FirebaseStorage.getInstance().getReference("Study");
        storageReference.child("images").child("image").putFile(uri).addOnCompleteListener(new OnCompleteListener<UploadTask.TaskSnapshot>() {
            @Override
            public void onComplete(@NonNull Task<UploadTask.TaskSnapshot> task) {
                if(task.isSuccessful()) {
                    Toast.makeText(MainActivity.this, "업로드에 성공했습니다", Toast.LENGTH_SHORT).show();
                }
                else {
                    Toast.makeText(MainActivity.this, "업로드에 실패했습니다", Toast.LENGTH_SHORT).show();
                }
            }
        });
    }

    private void show() {
        StorageReference storageReference = FirebaseStorage.getInstance().getReference("Study");
        storageReference.child("images").child("image").getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
            @Override
            public void onSuccess(Uri uri) {
                Glide.with(MainActivity.this).load(uri).into(imageView);
            }
        });
    }

    private final ActivityResultLauncher<Intent> launcher = registerForActivityResult(
            new ActivityResultContracts.StartActivityForResult(),
            new ActivityResultCallback<ActivityResult>() {
                @Override
                public void onActivityResult(ActivityResult result) {
                    if(result.getResultCode() == RESULT_OK && result.getData() != null) {
                        uri = result.getData().getData();
                        Log.d("test", uri.toString());

                    }
                }
            });
}



참고 링크

https://firebase.google.com/docs/storage/android/create-reference?hl=ko 

 

Android에서 Cloud Storage 참조 만들기  |  Firebase Storage

의견 보내기 Android에서 Cloud Storage 참조 만들기 파일은 Cloud Storage 버킷에 저장됩니다. 이 버킷의 파일은 로컬 하드 디스크의 파일 시스템 또는 Firebase 실시간 데이터베이스의 데이터와 같이 계층

firebase.google.com


 

저작자표시 (새창열림)

'정리 전 게시글 > 공부 관련' 카테고리의 다른 글

안드로이드 스튜디오 한글화 설치 방법 - 한글 언어 팩 플러그인  (0) 2022.09.16
[안드로이드][Java] Edit Text 글 입력 위에서부터 입력하기  (0) 2022.09.07
[안드로이드][Java] Gson, 데이터베이스에 객체, 배열, 리스트 변환, 저장하기, json, array, list  (2) 2022.09.06
[오류 해결] 안드로이드 스튜디오 파이어베이스 Ignoring header X-Firebase-Locale because its value was null. SDK 에뮬레이터 다운그레이드 방법  (0) 2022.09.03
[안드로이드 스튜디오, Java] R.string 자바 코드에서 불러오는법, context.getString(R.string.name), valueOf, toString  (0) 2022.08.15
'정리 전 게시글/공부 관련' 카테고리의 다른 글
  • 안드로이드 스튜디오 한글화 설치 방법 - 한글 언어 팩 플러그인
  • [안드로이드][Java] Edit Text 글 입력 위에서부터 입력하기
  • [안드로이드][Java] Gson, 데이터베이스에 객체, 배열, 리스트 변환, 저장하기, json, array, list
  • [오류 해결] 안드로이드 스튜디오 파이어베이스 Ignoring header X-Firebase-Locale because its value was null. SDK 에뮬레이터 다운그레이드 방법
aptenia
aptenia
공부하면서 배운 것들
  • aptenia
    새벽의 아이디어
    aptenia
  • 전체
    오늘
    어제
    • 분류 전체보기 (279)
      • 논문 (0)
      • Roboracer (2)
      • 개발 아무거나 (1)
      • 일상 아무거나 (2)
      • 정리 전 게시글 (268)
        • 개발 관련 (25)
        • 정보 관련 (19)
        • 공부 관련 (224)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
    • 네이버 블로그
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    티스토리HTML
    C언어강좌
    C언어
    마크
    백준
    파이어베이스
    컨텍스트스위칭
    캡스톤디자인
    콜라츠추측
    C++강좌
    마인크래프트
    이것이자바다확인문제
    이것이자바다연습문제
    이것이자바다
    마인크래프트강화스크립트
    안드로이드
    빅데이터공모전
    c언어초보
    프로그래머스PCCE
    마인크래프트스크립트
    티스토리반응형2스킨편집
    반복하지않는수
    프로그래머스
    파이썬
    공개SW개발자대회
    일본규슈공업대학교
    티스토리스킨편집
    자바
    마크스크립트
    스크롤바CSS
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
aptenia
[안드로이드][Java] 파이어베이스 스토리지 파일 업로드 및 다운로드 getDownloadUrl(), 파이어베이스 데이터 베이스 이미지 업로드
상단으로

티스토리툴바