FirebaseStorage_설정_이미지 로드& 업로드

소정·2023년 3월 17일
0

Android_with_Java

목록 보기
31/33

Firebase

안드로이드 앱을 개발할 때 서버단 작업을 코딩 한줄없이 사용하는 플랫폼
구글 로그인 필요

FireBase와 내 앱 연동하기 (가이드 문서 참고)

  • firebase 사이트에 로그인하고 console에서 [프로젝트 만들기] 를 통해 작업지시

  1. Gradle : Project 에 속성 추가

  2. Gradle : app 에 속성 추가

  1. 그외 필요한 것 아래 주소에 가서 추가하기
    https://firebase.google.com/docs/android/setup#available-libraries

  1. 스토리지 빌리기

  2. 룰 수정

  3. 이미지 경로 확인하는 곳



[1] FirebaseStorage_Image


main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
    android:orientation="vertical"
    android:padding="16dp"
    tools:context=".MainActivity">

    <Button
        android:id="@+id/btn_load"
        android:text="load img from firebase storage"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

    <ImageView
        android:id="@+id/iv"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1"/>

    <Button
        android:id="@+id/btn_select"
        android:text="select"
        android:backgroundTint="@color/teal_700"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>

    <Button
        android:id="@+id/btn_upload"
        android:text="upload img to firebase storage"
        android:backgroundTint="@color/black"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

</LinearLayout>



1. 이미지 로드

Firebase Storage에 저장되어 있는 이미지 파일 읽어오기

  1. Firebase Storage 관리객체 소환
    • 서버통신 끝 (인터넷 퍼미션도 필요없음 다 알아서 함)
  2. 저장소의 최상위 참조객체 얻어오기

    StorageReference
    Corsur 처럼 위치를 가르키는 친구

  3. 어오길 원하는 파일의 참조객체 얻어오기
  4. 파일참조 객체로부터 이미지의 다운로드 url(엑세스토큰) 을 얻어오기(실제 이미지 경로)

main.java

package com.bsj0420.ex88firebasestorage;

import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContracts;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.icu.text.SimpleDateFormat;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.widget.Toast;

import com.bsj0420.ex88firebasestorage.databinding.ActivityMainBinding;
import com.bumptech.glide.Glide;
import com.google.android.gms.tasks.OnFailureListener;
import com.google.android.gms.tasks.OnSuccessListener;
import com.google.firebase.storage.FirebaseStorage;
import com.google.firebase.storage.StorageReference;
import com.google.firebase.storage.UploadTask;

import java.util.Date;

public class MainActivity extends AppCompatActivity {

    // firebase - 안드로이드 앱을 개발할 때 서버단 작업을 코딩 한줄없이 사용하는 플랫폼
    
    // 1. 이 프로젝트와 firebase 플랫폼 연동하기 (가이드 문서 참고)
    // firebase 사이트에 로그인하고 console에서 [프로젝트 만들기] 를 통해 작업지시

    ActivityMainBinding binding;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        binding = ActivityMainBinding.inflate(getLayoutInflater());
        setContentView(binding.getRoot());

        binding.btnLoad.setOnClickListener(view -> clickLoad());
        binding.btnSelect.setOnClickListener(view -> clickSelect());
        binding.btnUpload.setOnClickListener(view -> clickUpLoad());
    }

    private void clickLoad() {

        //Firebase Storage에 저장되어 있는 이미지 파일 읽어와보기

        //Firebase Storage 관리객체 소환 - 서버통신 끝 (인터넷 퍼미션도 필요없음 다 알아서 함)
        FirebaseStorage firebaseStorage = FirebaseStorage.getInstance();

        //저장소의 최상위 참조객체 얻어오기
        //위치를 가르키는 친구가 있음
        StorageReference rootRef = firebaseStorage.getReference();

        //읽어오길 원하는 파일의 참조객체 얻어오기
        StorageReference imgRef = rootRef.child("ms18.png");

        if(imgRef != null) {
            //파일참조 객체로부터 이미지의 다운로드 url(엑세스토큰) 을 얻어오기
            imgRef.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
                @Override
                public void onSuccess(Uri uri) {
                    Glide.with(MainActivity.this).load(uri).into(binding.iv);
                }
            });
        }
        
        // getDownloadUrl() 비동기 형식이라 addOnSuccessListener 필요

    }
}



2. 이미지 업로드

  1. 업로드할 이미지 파일 가져오기 [MediaStore.ACTION_PICK_IMAGES] 사용
    • ActivityResultLauncher 를 이용해 스타트하고 결과값 받아오기
  2. 파이어베어스 관리 저장소 일단 소환(최상위 루트)
  3. 저장할 파일 이름이 중복되지 않도록 이름에 날짜 붙여주기
  4. 저장할 파일 위치에 대한 참조객체 (파일이 저장될 위치와 저장이름 설정)
  5. 위 저장 경로 참조객체에게 실제파일 업로드 시키기

main.java

package com.bsj0420.ex88firebasestorage;

import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContracts;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.icu.text.SimpleDateFormat;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.widget.Toast;

import com.bsj0420.ex88firebasestorage.databinding.ActivityMainBinding;
import com.bumptech.glide.Glide;
import com.google.android.gms.tasks.OnFailureListener;
import com.google.android.gms.tasks.OnSuccessListener;
import com.google.firebase.storage.FirebaseStorage;
import com.google.firebase.storage.StorageReference;
import com.google.firebase.storage.UploadTask;

import java.util.Date;

public class MainActivity extends AppCompatActivity {

    // firebase - 안드로이드 앱을 개발할 때 서버단 작업을 코딩 한줄없이 사용하는 플랫폼
    
    // 1. 이 프로젝트와 firebase 플랫폼 연동하기 (가이드 문서 참고)
    // firebase 사이트에 로그인하고 console에서 [프로젝트 만들기] 를 통해 작업지시

    ActivityMainBinding binding;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        binding = ActivityMainBinding.inflate(getLayoutInflater());
        setContentView(binding.getRoot());

        binding.btnLoad.setOnClickListener(view -> clickLoad());
        binding.btnSelect.setOnClickListener(view -> clickSelect());
        binding.btnUpload.setOnClickListener(view -> clickUpLoad());
    }

    private void clickSelect() {

        Intent intent = new Intent(MediaStore.ACTION_PICK_IMAGES);
        resultLauncher.launch(intent);

    }

    //선택된 이미지 Uri
    Uri imgUri = null;

    ActivityResultLauncher<Intent> resultLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> {
        if (result.getResultCode() == RESULT_CANCELED) return;
        imgUri = result.getData().getData();

        Glide.with(this).load(imgUri).into(binding.iv);
    });

    private void clickUpLoad() {
        if(imgUri == null) return; //사진 선택 안했으면 하지마

        //Firebase Storage에 파일 업로드

        //파이어베어스 관리 저장소 일단 소환
        FirebaseStorage firebaseStorage = FirebaseStorage.getInstance();

        //저장할 파일 이름이 중복되지 않도록 날짜 붙여주기
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
        String fileName = "IMG_" + sdf.format(new Date()) + ".png";

        //저장할 파일 위치에 대한 참조객체
        StorageReference imgRef = firebaseStorage.getReference("photo/"+fileName); //저장할 이름
        //폴더가 없으면 만들고 있으면 그냥 참조한다

        //위 저장 경로 참조객체에게 실제파일 업로드 시키기
        imgRef.putFile(imgUri).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
            @Override
            public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
                Toast.makeText(MainActivity.this, "업로드 성공", Toast.LENGTH_SHORT).show();
            }
        }).addOnFailureListener(new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception e) {
                Toast.makeText(MainActivity.this, "error : " + e, Toast.LENGTH_SHORT).show();
            }
        });
    }
profile
보조기억장치

0개의 댓글