마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

firebase storage 사진과 동영상 동시에 올리기

0 추천
ainActivity() {
    }

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



        mButtonUpload.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (mUploadTask != null && mUploadTask.isInProgress()) {
                    Toast.makeText(MainActivity.this, "Upload in progress", Toast.LENGTH_SHORT).show();
                } else {

                
                    uploadVideoFile();
                    uploadImageFile();

                    Upload upload = new Upload(mEditTextFileName.getText().toString().trim(), DownloadVideoUri.toString(), DownloadImageUri.toString());
                    mDatabaseRef.push().setValue(upload);

             
            }
        });
        mTextViewShowUploads.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                openImagesActivity();
            }
        });


    }



    private void uploadImageFile() {


        //Imgae upload

        if (mImageUri != null) {
            Log.d(TAG, "2");
            mImageStorageRef = mStorageRef.child("Image/" + mEditTextFileName.getText().toString().trim());
            mImageStorageRef.putFile(mImageUri).continueWithTask(new Continuation<UploadTask.TaskSnapshot, Task<Uri>>() {
                @Override
                public Task<Uri> then(@NonNull Task<UploadTask.TaskSnapshot> task) throws Exception {
                    Log.d(TAG, "then: 1");
                    if (!task.isSuccessful()) {
                        throw task.getException();
                    }
                    return mImageStorageRef.getDownloadUrl();
                }
            }).addOnCompleteListener(new OnCompleteListener<Uri>() {
                @Override
                public void onComplete(@NonNull Task<Uri> task) {
                    if (task.isSuccessful()) {
                        Uri downloadUri = task.getResult();
                        Log.e(TAG, "then: " + downloadUri.toString());
                        DownloadImageUri = Uri.parse(getFileExtension(mImageUri));


                    } else {
                        Toast.makeText(MainActivity.this, "upload failed: " + task.getException().getMessage(), Toast.LENGTH_SHORT).show();
                        Log.d(TAG, "faile ");
                    }
                }
            });
        }

    }

    private void uploadVideoFile() {

        //Video upload
        if (mVideoUri != null) {
            Log.d(TAG, "uploadVideoFile: " + mVideoUri);
            mVideoStorageRef = mStorageRef.child("Video/" + mEditTextFileName.getText().toString().trim());
            mVideoStorageRef.putFile(mVideoUri).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();
                    }
                    return mVideoStorageRef.getDownloadUrl();
                }
            }).addOnCompleteListener(new OnCompleteListener<Uri>() {
                @Override
                public void onComplete(@NonNull Task<Uri> task) {
                    if (task.isSuccessful()) {

                        Uri downloadVideoUri = task.getResult();
                        Log.e("TAG", "then: " + downloadVideoUri.toString());
                        Toast.makeText(MainActivity.this, "upload Video success", Toast.LENGTH_SHORT).show();
                        DownloadVideoUri = downloadVideoUri.toString();


                    } else {
                        Toast.makeText(MainActivity.this, "upload failed: " + task.getException().getMessage(), Toast.LENGTH_SHORT).show();
                    }
                }
            }).addOnFailureListener(new OnFailureListener() {
                @Override
                public void onFailure(@NonNull Exception e) {
                    Toast.makeText(MainActivity.this, e.getMessage(), Toast.LENGTH_SHORT).show();
                }
            });
//                    .addOnProgressListener(new OnProgressListener<UploadTask.TaskSnapshot>() {
//                        @Override
//                        public void onProgress(UploadTask.TaskSnapshot taskSnapshot) {
//                            double progress = (100.0 * taskSnapshot.getBytesTransferred() / taskSnapshot.getTotalByteCount());
//                            mProgressBar.setProgress((int) progress);
//                        }
//                    });
        } else {
            Toast.makeText(this, "No file selected", Toast.LENGTH_SHORT).show();
            Log.d(TAG, "faile ");
        }

    }


    private void openFileChooser() {
        Intent intent = new Intent();
        intent.setType("video/*");
        intent.setAction(Intent.ACTION_GET_CONTENT);
        startActivityForResult(intent, PICK_VIDEO_REQUEST);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        switch (resultCode) {
            case Activity.RESULT_OK:
                switch (requestCode) {
                    case PICK_VIDEO_REQUEST:
                        if (data.getData() != null) {
                            mVideoUri = data.getData();
                            mVideoView.setVideoURI(mVideoUri);
                            videoname = getFileName(mVideoUri);
                            mVideoView.start();
                        }
                        break;
                    case PICK_IMAGE_REQUEST:
                        if (data.getData() != null) {
                            mImageUri = data.getData();
                            Log.d(TAG, "mImageUri: " + mImageUri);
                            Picasso.with(this).load(mImageUri).into(mImageView);
                        }

                }

        }

    }

    public String getFileName(Uri uri) {
        String result = null;
        if (uri.getScheme().equals("content")) {
            Cursor cursor = getContentResolver().query(uri, null, null, null, null);
            try {
                if (cursor != null && cursor.moveToFirst()) {
                    result = cursor.getString(cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME));
                }
            } finally {
                cursor.close();
            }
        }
        if (result == null) {
            result = uri.getPath();
            int cut = result.lastIndexOf('/');
            if (cut != -1) {
                result = result.substring(cut + 1);

            }
        }
        return result;
    }

    private void openImagesActivity() {
        Intent intent = new Intent(this, VideosActivity.class);
        startActivity(intent);
    }
}

지금 코드를 이런식으로 짜서 파이어베이스 스토리지랑 데이터베이스에 저장을 하려고 하는데 자꾸

DownloadVideoUri, DownloadImageUri 에서 null이 발생하는데 어떻게 수정해야 할까요?? ㅠㅠ

익명사용자 님이 2019년 5월 2일 질문

1개의 답변

0 추천

DownloadVideoUri, DownloadImageUri 들이 전역변수인듯 한데요, firebase동작들은 다 비동기 형식이라 전역변수로 잡아놓으신 변수들은 Null로 찍힐거에요. 리스너 안에서 데이터베이스에 setValue 해보셔야 할것 같아요.

익명사용자 님이 2019년 5월 2일 답변
답변감사합니다~ 그런데 혹시 비동기형식이 뭔지 설명을 부탁드려도 될까요~?
조금 쉽게  설명하자면 하나의 작업이 모두끝나고 다른작업진행하면 동기, 하나의 작업이 수행하면서 다른작업도 수행되면 비동기 라고 할수있는데요. 안드로이드는 메인스레드에선 네트워크작업을 할수없지요. 그래서 asynctask같은걸 이용해 비동기처리방식으로 하구요. 파이어베이스는 내부적으로 그런작업을 비동기적으로 처리하고  있는것이구요.
...