[#113][안드로이드] Firebase Storage에 이미지 업로드하기 (갤러리, 사진촬영)
[안드로이드] Firebase Storage에 이미지 업로드하기 (갤러리, 사진촬영)
이전 게시물에 이어서..([#107][안드로이드] 카메라로 사진찍기 / 갤러리에서 이미지 불러오기 (TEDPERMISSION 이용))
카메라에서 촬영한 이미지는 잘 전송이 되는데, 앨범에서 선택하면 자꾸 이상한 오류가 나서 코드를 변경했다.. 이걸로 며칠을 헤맸는지 ㅠㅠㅠㅠ
다이얼로그로 사진촬영 / 앨범선택 / 취소
private void makeDialog(){
AlertDialog.Builder alt_bld = new AlertDialog.Builder(WriteClassActivity.this,R.style.MyAlertDialogStyle);
alt_bld.setTitle("사진 업로드").setIcon(R.drawable.check_dialog_64).setCancelable(
false).setPositiveButton("사진촬영",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
// 사진 촬영 클릭
Log.v("알림", "다이얼로그 > 사진촬영 선택");
flag = 0;
takePhoto();
}
}).setNeutralButton("앨범선택",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialogInterface, int id) {
Log.v("알림", "다이얼로그 > 앨범선택 선택");
flag = 1;
//앨범에서 선택
selectAlbum();
}
}).setNegativeButton("취소 ",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
Log.v("알림", "다이얼로그 > 취소 선택");
// 취소 클릭. dialog 닫기.
dialog.cancel();
}
});
AlertDialog alert = alt_bld.create();
alert.show();
}
| cs |
사진찍기 클릭시
1. takePhoto 함수
//사진 찍기 클릭
public void takePhoto(){
// 촬영 후 이미지 가져옴
String state = Environment.getExternalStorageState();
if(Environment.MEDIA_MOUNTED.equals(state)){
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
if(intent.resolveActivity(getPackageManager())!=null){
File photoFile = null;
try{
photoFile = createImageFile();
}catch (IOException e){
e.printStackTrace();
}
if(photoFile!=null){
Uri providerURI = FileProvider.getUriForFile(this,getPackageName(),photoFile);
imgUri = providerURI;
intent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, providerURI);
startActivityForResult(intent, FROM_CAMERA);
}
}
}else{
Log.v("알림", "저장공간에 접근 불가능");
return;
}
}
| cs |
2. createImageFile() 이미지 생성 함수
public File createImageFile() throws IOException{
String imgFileName = System.currentTimeMillis() + ".jpg";
File imageFile= null;
File storageDir = new File(Environment.getExternalStorageDirectory() + "/Pictures", "ireh");
if(!storageDir.exists()){
//없으면 만들기
Log.v("알림","storageDir 존재 x " + storageDir.toString());
storageDir.mkdirs();
}
Log.v("알림","storageDir 존재함 " + storageDir.toString());
imageFile = new File(storageDir,imgFileName);
mCurrentPhotoPath = imageFile.getAbsolutePath();
return imageFile;
}
| cs |
3. galleryAddPic() 찍은 사진을 갤러리에 저장하는 함수
public void galleryAddPic(){
Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
File f = new File(mCurrentPhotoPath);
Uri contentUri = Uri.fromFile(f);
mediaScanIntent.setData(contentUri);
sendBroadcast(mediaScanIntent);
Toast.makeText(this,"사진이 저장되었습니다",Toast.LENGTH_SHORT).show();
}
| cs |
앨범선택 클릭시
1. selectAlbum() 앨범열기
//앨범 선택 클릭
public void selectAlbum(){
//앨범에서 이미지 가져옴
//앨범 열기
Intent intent = new Intent(Intent.ACTION_PICK);
intent.setType(MediaStore.Images.Media.CONTENT_TYPE);
intent.setType("image/*");
startActivityForResult(intent, FROM_ALBUM);
}
| cs |
선택 후 처리 (FROM_ALBUM, FROM_CAMERA에 따라 다르게 처리)
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(resultCode != RESULT_OK){
return;
}
switch (requestCode){
case FROM_ALBUM : {
//앨범에서 가져오기
if(data.getData()!=null){
try{
photoURI = data.getData();
Bitmap bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), photoURI);
img1.setImageBitmap(bitmap);
}catch (Exception e){
e.printStackTrace();
}
}
break;
}
case FROM_CAMERA : {
//카메라 촬영
try{
Log.v("알림", "FROM_CAMERA 처리");
galleryAddPic();
img1.setImageURI(imgUri);
}catch (Exception e){
e.printStackTrace();
}
break;
}
}
}
| cs |
FIREBASE 저장소로 보내기
public void makeConfirmDialog(){
AlertDialog.Builder alt_bld = new AlertDialog.Builder(WriteClassActivity.this, R.style.MyAlertDialogStyle);
alt_bld.setTitle("작성 완료").setIcon(R.drawable.check_dialog_64).setMessage("글을 게시하시겠습니까?").setCancelable(
false).setPositiveButton("네",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
//DB에 등록하기
final String cu = mAuth.getUid();
//1. 사진을 storage에 저장하고 그 url을 알아내야함..
String filename = cu + "_" + System.currentTimeMillis();
StorageReference storageRef = storage.getReferenceFromUrl("본인의 Firebase 저장소").child("WriteClassImage/" + filename);
UploadTask uploadTask;
Uri file = null;
if(flag ==0){
//사진촬영
file = Uri.fromFile(new File(mCurrentPhotoPath));
}else if(flag==1){
//앨범선택
file = photoURI;
}
uploadTask = storageRef.putFile(file);
final ProgressDialog progressDialog = new ProgressDialog(WriteClassActivity.this,R.style.MyAlertDialogStyle);
progressDialog.setMessage("업로드중...");
progressDialog.show();
// Register observers to listen for when the download is done or if it fails
uploadTask.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception exception) {
// Handle unsuccessful uploads
Log.v("알림", "사진 업로드 실패");
exception.printStackTrace();
}
}).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
@Override
public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
// taskSnapshot.getMetadata() contains file metadata such as size, content-type, and download URL.
downloadUrl = taskSnapshot.getDownloadUrl();
Log.v("알림", "사진 업로드 성공 " + downloadUrl);
}
});
}
}).setNegativeButton("아니오",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
// 아니오 클릭. dialog 닫기.
dialog.cancel();
}
});
AlertDialog alert = alt_bld.create();
alert.show();
}
| cs |
결과
잘보고가요
답글삭제전체코드좀 메일로 보내주실 수 있을까요?
답글삭제kibin3846@gmail.com 입니다
삭제