728x90
클라우드 스토리지는 사진, 동영상 등의 객체 저장소 서비스이다
파이어베이스 콘솔의 Storage를 선택한후 시작하기를 클릭한다.
클라우드 스토리지 시작하기
종속성 설정
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
// ...
}
});
'Front-end > Android (안드로이드 앱 개발)' 카테고리의 다른 글
Android Studio , Firebase 파이어베이스 : 실시간 데이터베이스 데이터 읽고 쓰기 (like. 인별그램) (3) | 2021.01.12 |
---|---|
Android Studio , 사진 가져오기 , Glide (0) | 2021.01.08 |
Android studio , Firebase 파이어베이스 Google Login 구글 로그인 (0) | 2021.01.01 |
Android Studio , Firebase 파이어베이스 android 초기 설정 (0) | 2020.12.28 |
Android Studio , XML 데이터 가져오기, JSON 데이터 가져오기 (0) | 2020.08.18 |
댓글