막무가내 삽질 블로그

안드로이드 파이어베이스로 사용자 프로필 저장 본문

Android

안드로이드 파이어베이스로 사용자 프로필 저장

joong~ 2019. 6. 2. 02:26
728x90

오늘은 기본적인 사용자 프로필을 데이터베이스 스토리지에 저장했다

 

우선 사용자의 기본정보가 필요하니 클래스를 하나 생성했다

public class UserModel {
    // 사용자 기본정보
    
    public String userName; // 사용자 이름(닉네임)
    public String profileImageUrl; // 사용자 프로필사진
    public String uid; // 현재 사용자(로그인한)
//    public String pushToken;

}

 

회원가입화면에서 정보들을 입력한 후 데이터베이스에 바로 저장하는 코드이다.

이미지는 Storage에 저장되고 사용자 정보는 DB에 저장된다.

public static final int PICK_FROM_ALBUM = 1;
private Uri imageUri;
private String pathUri;
private File tempFile;
private FirebaseAuth mAuth; 
private FirebaseDatabase mDatabase; 
private FirebaseStorage mStorage; 

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

        // Authentication, Database, Storage 초기화
        mAuth = FirebaseAuth.getInstance();
        mDatabase = FirebaseDatabase.getInstance();
        mStorage = FirebaseStorage.getInstance();

        // 변수 할당
        editText1 = findViewById(R.id.editText1);
        editText2 = findViewById(R.id.editText2);
        editText3 = findViewById(R.id.editText3);
        profile = findViewById(R.id.memberjoin_iv);
        signup = findViewById(R.id.Meberjoin_bt);

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

        profile.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                gotoAlbum();
            }
        });
    }
    
        // 앨범 메소드
        private void gotoAlbum() { 
        Intent intent = new Intent(Intent.ACTION_PICK);
        intent.setType(MediaStore.Images.Media.CONTENT_TYPE);
        startActivityForResult(intent, PICK_FROM_ALBUM);
         }
         
        
    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        if (resultCode != RESULT_OK) { // 코드가 틀릴경우
            toast("취소 되었습니다");
            if (tempFile != null) {
                if (tempFile.exists()) {
                    if (tempFile.delete()) {
                        Log.e(TAG, tempFile.getAbsolutePath() + " 삭제 성공");
                        tempFile = null;
                    }
                }
            }
            return;
        }

        switch (requestCode) {
            case PICK_FROM_ALBUM: { // 코드 일치
                // Uri
                imageUri = data.getData();
                pathUri = getPath(data.getData());
                Log.d(TAG, "PICK_FROM_ALBUM photoUri : " + imageUri);
                profile.setImageURI(imageUri); // 이미지 띄움
                break;
            }
        }
    }
    
    // uri 절대경로 가져오기
    public String getPath(Uri uri) {

        String[] proj = {MediaStore.Images.Media.DATA};
        CursorLoader cursorLoader = new CursorLoader(this, uri, proj, null, null, null);

        Cursor cursor = cursorLoader.loadInBackground();
        int index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);

        cursor.moveToFirst();
        return cursor.getString(index);
    }
    
    // 회원가입 로직
    private void signup() {
        name = editText1.getText().toString();
        email = editText2.getText().toString();
        pw = editText3.getText().toString();

        // 프로필사진,이름,이메일,비밀번호 중 하나라도 비었으면 return
        if (TextUtils.isEmpty(name) || TextUtils.isEmpty(email) ||
                TextUtils.isEmpty(pw) || profile == null) {
            toast("정보를 바르게 입력해 주세요");
            return;
        }

        try {
            // Authentication에 email,pw 생성
            mAuth.createUserWithEmailAndPassword(email, pw)
                    .addOnCompleteListener
                            (MeberjoinActivity.this, new OnCompleteListener<AuthResult>() {
                                @Override
                                public void onComplete(@NonNull Task<AuthResult> task) {
                                    if (task.isSuccessful()) { // 회원가입 성공시

                                        // uid에 task, 선택된 사진을 file에 할당
                                        final String uid = task.getResult().getUser().getUid();
                                        final Uri file = Uri.fromFile(new File(pathUri)); // path

                                        // 스토리지에 방생성 후 선택한 이미지 넣음
                                        StorageReference storageReference = mStorage.getReference()
                                                .child("usersprofileImages").child("uid/"+file.getLastPathSegment());
                                        storageReference.putFile(imageUri).addOnCompleteListener(new OnCompleteListener<UploadTask.TaskSnapshot>() {
                                            @Override
                                            public void onComplete(@NonNull Task<UploadTask.TaskSnapshot> task) {
                                                final Task<Uri> imageUrl = task.getResult().getStorage().getDownloadUrl();
                                                while (!imageUrl.isComplete()) ;

                                                UserModel userModel = new UserModel();

                                                userModel.userName = name;
                                                userModel.uid = uid;
                                                userModel.profileImageUrl = imageUrl.getResult().toString();

                                                // database에 저장
                                                mDatabase.getReference().child("users").child(uid)
                                                        .setValue(userModel);
                                            }

                                        });

                                        toast("회원가입에 성공하였습니다");
                                        startMainActivity();

                                    } else {
                                        if (task.getException() != null) { // 회원가입 실패시
                                            toast("가입에 실패 하였습니다");
                                            Log.d(TAG, "createUserWithEmail:failure");
                                        }
                                    }
                                }
                            });
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
         
    

 

Storage - userprofileImages - uid  안에 선택한 프로필이미지들이 저장 된다.

 

이미지를 클릭하면 이름, 다운로드 URL을 확인할 수 있다. 

 

 

DB에 사용자들의 정보가 저장되어 있다(DB-users-uid)

사용자의 id값으로 저장되어 있고

profileimageurl은 스토리지에 저장되어있던 다운로드 url과 일치하게 된다.

 

 

 

안드로이드 스터디 모집

www.notion.so/fundevjay/Android-ddf96b24265e414fb2d9e8fc5d388b80

Comments