본문 바로가기
Front-end/Android (안드로이드 앱 개발)

Android Studio , Firebase 파이어베이스 Storage 저장

by javapp 자바앱 2021. 1. 4.
728x90

클라우드 스토리지는 사진, 동영상 등의 객체 저장소 서비스이다

 

 

https://firebase.google.com/docs/storage?authuser=0



파이어베이스 콘솔의 Storage를 선택한후 시작하기를 클릭한다.

 

로그인 - Google 계정

하나의 계정으로 모든 Google 서비스를 Google 계정으로 로그인

accounts.google.com


시작하기


기본 스토리지 파일


스토리지 규칙들을 설정

 


클라우드 스토리지 시작하기

 

종속성 설정

dependencies {
    // Import the BoM for the Firebase platform
    implementation platform('com.google.firebase:firebase-bom:26.1.0')

    // Declare the dependency for the Cloud Storage library
    // When using the BoM, you don't specify versions in Firebase library dependencies
    implementation 'com.google.firebase:firebase-storage'
}

 

AndroidManifest.xml

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

 

권한 허락 받기

    private String[] permissionList = {Manifest.permission.READ_EXTERNAL_STORAGE};
    //권한 체크 함수
    public void checkPermission(){
        //현재 버전 6.0 미만이면 종료 --> 6이후 부터 권한 허락
        if(Build.VERSION.SDK_INT < Build.VERSION_CODES.M) return;

        //각 권한 허용 여부를 확인
        for(String permission : permissionList){
            int chk = checkCallingOrSelfPermission(permission);
            //거부 상태라면
            if(chk == PackageManager.PERMISSION_DENIED){
                //사용자에게 권한 허용여부를 확인하는 창을 띄운다.
                requestPermissions(permissionList,0); //권한 검사 필요한 것들만 남는다.
                break;
            }
        }
    }

 

싱글톤으로 FirebaseStorage 인스턴스 만들기

private FirebaseStorage storage;

storage = FirebaseStorage.getInstance();

 

앨범에서 사진선택

      private int GALLEY_CODE = 10;

      
      btnUploadImg = (Button) findViewById(R.id.btn_storage_upload);
        btnUploadImg.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(Intent.ACTION_PICK);
                intent.setType(MediaStore.Images.Media.CONTENT_TYPE);

                startActivityForResult(intent,GALLEY_CODE);
            }
        });



    //사진 고른 후
    //로컬 파일에서 업로드
    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        if(requestCode == GALLEY_CODE)
        {
try {
            // Create a storage reference from our app
            StorageReference storageRef = storage.getReference();

            Uri file = Uri.fromFile(new File(uri));
            final StorageReference riversRef = storageRef.child("images/"+file.getLastPathSegment());
            UploadTask uploadTask = riversRef.putFile(file);


            Task<Uri> urlTask = uploadTask.continueWithTask(new Continuation<UploadTask.TaskSnapshot, Task<Uri>>() {
                @Override
                public Task<Uri> then(@NonNull Task<UploadTask.TaskSnapshot> task) throws Exception {
                    if (!task.isSuccessful()) {
                        throw task.getException();
                    }

                    // Continue with the task to get the download URL
                    return riversRef.getDownloadUrl();
                }
            }).addOnCompleteListener(new OnCompleteListener<Uri>() {
                @Override
                public void onComplete(@NonNull Task<Uri> task) {
                    if (task.isSuccessful())
                    {
                        Toast.makeText(UploadActivity.this, "업로드 성공", Toast.LENGTH_SHORT).show();

                        @SuppressWarnings("VisibleForTests")
                        Uri downloadUrl = task.getResult();

                        Intent intent = new Intent(getApplicationContext(), UserActivity.class);
                        startActivity(intent);

                    } else {
                        // Handle failures
                        // ...
                    }
                }
            });
        }

        super.onActivityResult(requestCode, resultCode, data);
    }
    
    
    private String getRealPathFromUri(Uri uri)
    {
        String[] proj=  {MediaStore.Images.Media.DATA};
        CursorLoader cursorLoader = new CursorLoader(this,uri,proj,null,null,null);
        Cursor cursor = cursorLoader.loadInBackground();

        int columnIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
        cursor.moveToFirst();
        String result = cursor.getString(columnIndex);
        cursor.close();
        return  result;
    }
    

 

 

메모리 데이터, 비트맵을 바이트코드로 comporess 하여 추가하기

// Get the data from an ImageView as bytes
imageView.setDrawingCacheEnabled(true);
imageView.buildDrawingCache();
Bitmap bitmap = ((BitmapDrawable) imageView.getDrawable()).getBitmap();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);
byte[] data = baos.toByteArray();

UploadTask uploadTask = mountainsRef.putBytes(data);
uploadTask.addOnFailureListener(new OnFailureListener() {
    @Override
    public void onFailure(@NonNull Exception exception) {
        // Handle unsuccessful uploads
    }
}).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
    @Override
    public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
        // taskSnapshot.getMetadata() contains file metadata such as size, content-type, etc.
        // ...
    }
});

 

 

전체예시

업로드 ,진행률 모니터링 ,오류 처리

progress를 통해 진행률 확인 가능

// File or Blob
file = Uri.fromFile(new File("path/to/mountains.jpg"));

// Create the file metadata
metadata = new StorageMetadata.Builder()
        .setContentType("image/jpeg")
        .build();

// Upload file and metadata to the path 'images/mountains.jpg'
uploadTask = storageRef.child("images/"+file.getLastPathSegment()).putFile(file, metadata);

// Listen for state changes, errors, and completion of the upload.
uploadTask.addOnProgressListener(new OnProgressListener<UploadTask.TaskSnapshot>() {
    @Override
    public void onProgress(UploadTask.TaskSnapshot taskSnapshot) {
        double progress = (100.0 * taskSnapshot.getBytesTransferred()) / taskSnapshot.getTotalByteCount();
        Log.d(TAG, "Upload is " + progress + "% done");
    }
}).addOnPausedListener(new OnPausedListener<UploadTask.TaskSnapshot>() {
    @Override
    public void onPaused(UploadTask.TaskSnapshot taskSnapshot) {
        Log.d(TAG, "Upload is paused");
    }
}).addOnFailureListener(new OnFailureListener() {
    @Override
    public void onFailure(@NonNull Exception exception) {
        // Handle unsuccessful uploads
    }
}).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
    @Override
    public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
        // Handle successful uploads on complete
        // ...
    }
});

댓글