728x90
반응형

 

모바일 기기는 작다보니 하나의 화면에 모든것을 표현하기 부족합니다.

 

그래서 기본적으로 지원하는 ScrollView를 추가해줘야 하는데요.

 

ScrollView 사용방법을 알아보겠습니다.

 

 

 

 

activity_main.xml 에서 아래와같은 태그로 선언을 할 수 있습니다.

 

ScrollView 태그는 자식 태그를 한개만 소유할 수 있습니다.

 

 

 

 

ScrollView를 알맞게 사용하려면 Layout을 넣은뒤 그 안에 하위 태그를 넣어주면 됩니다.

 

 

 

 

 

LinearLayout으로 감싼 뒤 TextView를 넣어주면 알맞게 사용할 수 있습니다.

 

 

 

 

 

화면보다 내용이 많아 보여지기 어려운 부분을 ScrollView로 간단하게 처리 하였습니다.

 

 

728x90
반응형
728x90
반응형

 

Android 개발을 하고 Play Store 에 등록하려면 우선 개발자 등록을 해야합니다.

 

Google Play Console 에서 개발자 등록 하는 방법을 알아보겠습니다.

 

 

 

 

 

아래 URL 을 통해 Google Play Console 사이트로 이동합니다.

 

https://developer.android.com/distribute/console?hl=ko

 

Google Play Console

developer.android.com

 

 

1. 로그인

 

아래와 같은 화면이 보여지고 우측 상단의 "로그인"을 클릭하여 로그인 합니다.

 

정상적으로 로그인이 된 후에 "PLAY CONSOLE 실행하기" 버특을 클릭합니다.

 

 

 

 

 

2. 개발자 계약 수락

 

Google Play 개발자 배포 계약 검토 및 동의를 한 뒤 "결제 페이지로 이동" 버튼을 클릭합니다.

 

 

 

 

3. 등록 수수료 결제

 

해외결제가 가능한 카드를 등록하여 결제를 합니다.

 

 

 

 

 

내용을 입력한 후 "구매" 버튼을 클릭합니다.

 

영수증은 이메일로 받을 수 있다는 알림을 확인한 뒤 "등록 계속하기" 버튼을 클릭합니다.

 

 

 

 

 

4. 계정 세부정보 작성

 

결제까지 완료하였으니 미비된 개발자 정보를 등록해야 합니다.

 

개발자 이름, 주소, 사이트 정보, 전화번호를 입력후 "등록 완료" 버튼을 클릭합니다.

 

 

 

 

 

정상적으로 등록이 완료되면 아래와같은 화면이 보여지게됩니다.

 

 

 

 

 

정말 쉽고 간편하게 Play Store에 올릴수 있는 개발자 등록을 완료하였습니다.

 

다음 글에선 앱 등록을 해보도록 하겠습니다.

 

728x90
반응형
728x90
반응형


기존 JAVA 언어로 사용하던 방식들이 Kotlin 언어로 사용되면서 조금씩 간결하게 소스가 변경되었습니다.


람다를 사용하여 소스코드 가독성이 높아졌는데요.


특정 인터페이스가 한개로 구성되어있다면 {} 중괄호를 입력하여 함수명을 생략할 수 있는데


EditText 의 입력값이 바뀌는걸 감지하는 addTextChangedListener 함수는 3개의 함수를 Override 해야하기 때문에 함수명을 생략할 수 없습니다.






그렇기에 위의 함수를 정의 할때는 아래와 같이 정의해주면 됩니다.


    editText.addTextChangedListener(object: TextWatcher {
            override fun beforeTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {
 
            }
 
            override fun onTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {
 
            }
 
            override fun afterTextChanged(p0: Editable?) {
 
            }
        })

cs



728x90
반응형
728x90
반응형


Android는 XML 에서 디자인을 할 수 있습니다.


Drag & Drop 으로 쉽게 만들 수 있지만 정확한 값을 입력하기엔 더 번거로워 질 수 있습니다.


간단하게 버튼 디자인을 해보겠습니다.





일반적인 버튼입니다.


사각형의 디자인으로 정말 밋밋합니다.


    <Button
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="LOGIN"/>
cs








버튼에 Radius 값을 넣어서 둥글고 이쁘게 만들어 보겠습니다.


res -> drawable 안에 새로운 XML을 만들어 줍니다.


이름은 편한이름으로 주면 됩니다.





버튼이 클릭되었거나, 비활성화 되었을 때가 있기때문에 selector로 만들어 주겠습니다.


item 은 각각의 상태를 정해줄수 있습니다.


item 안에 shape를 만들어 준다음 corners 로 버튼의 Radius 값을 정해줍니다.


solid 로 버튼의 색상을 지정합니다.


<selector xmlns:android="http://schemas.android.com/apk/res/android">
 
    <item>
        <shape android:shape="rectangle">
            <corners android:radius="20dp"></corners>
            <solid android:color="@color/colorBlue"></solid>
        </shape>
    </item>

</selector>
cs






위에 만든 xml 을 설정해주면 상태에 따라 변화하게 됩니다.


    <Button
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@drawable/btn_blue"
            android:text="LOGIN"/>
cs



간단하게 버튼에 Radius 값과 색상을 넣어 멋지게 만들어줬습니다.

728x90
반응형
728x90
반응형

Android 로 Cloude Firestore 개발을 진행하면서 초기에 이런 에러가 발생하였습니다.

 

The library com.google.android.gms:play-services-basement is being requested by various other libraries at [[15.0.1,15.0.1]], 
but resolves to 16.0.1. Disable the plugin and check your dependencies tree using ./gradlew :app:dependencies.
cs

 

 

 

 

 

Firebase에서 제공하는 개발 환경 설정 방법이 오래되어있다보니 정보가 부족했습니다.

 

Firebase 콘솔에서 새 프로젝트를 만들고 데이터베이스 섹션에서 Cloude Firestore으로 설정했습니다. 

 

 

 

 

 

 

app/gradle 에 아래와 같이 코드를 삽입해 주었습니다.

 

dependencies {
    ...
 
    // Firebase Database
    implementation 'com.google.firebase:firebase-core:16.0.6'
    implementation 'com.google.firebase:firebase-firestore:17.1.0'
 
 
    ...
}
 
apply plugin: 'com.google.gms.google-services'
cs

 

 

 

 

 

프로젝트/gradle 에 아래와 같이 코드를 삽입해 주었습니다.

 

    ext {
        googlePlayServicesVersion   = "15.0.1"
    }
cs

 

allprojects {
    ...
 
    configurations.all {
        resolutionStrategy {
            force "com.google.android.gms:play-services-basement:$googlePlayServicesVersion"
            force "com.google.android.gms:play-services-tasks:$googlePlayServicesVersion"
        }
    }
}
cs
 

 

 

 

 

 

FirebaseFirestore.getInstance 부분에서 계속 에러가 났지만 위의 코드를 추가해줌으로써 에러를 해결했습니다.

 

override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
 
        val db = FirebaseFirestore.getInstance()
}
cs

 

 

728x90
반응형
728x90
반응형

 

 

간단하게 회원가입과 로그인은 대부분의 앱에서 필요로 합니다.

 

Email 회원가입/로그인은 Firebase에서 지원하고 있으며 기능을 구현해보도록 하겠습니다.

 

우선 Firebase 에 접속합니다.

 

https://console.firebase.google.com

 

로그인 - Google 계정

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

accounts.google.com

 

 

 

Authenfication 으로 들어간 뒤 '로그인 방법' 탭을 클릭합니다.

 

여러가지 로그인 기능이 있는데 이메일/비밀번호 로그인을 사용 설정 합니다.

 

 

 

 

 

 

사용자 탭으로 가보면 아직 사용자 정보가 보여지지 않고 있습니다.

 

정상적으로 로그인을 하면 이 화면에서 사용자가 보여집니다.

 

 

 

 

 

Android Studio 로 돌아가 앱 수준 build.gradle 파일에 

 

Firebase 인증에 대한 종속 항목을 추가합니다.

 

implementation 'com.google.firebase:firebase-auth:16.0.3'
cs

 

 

 

 

activity_main.xml 에 아래와 같이 추가해 주었습니다.

 

<EditText
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:inputType="textEmailAddress"
            android:ems="10"
            android:id="@+id/edit_email"
            android:hint="Email"
            android:layout_marginStart="16dp"
            app:layout_constraintStart_toStartOf="parent"
            android:layout_marginLeft="16dp"
            android:layout_marginEnd="16dp"
            app:layout_constraintEnd_toEndOf="parent"
            android:layout_marginRight="16dp"
            android:layout_marginTop="8dp"
            app:layout_constraintTop_toTopOf="parent"/>
    <EditText
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:inputType="textPassword"
            android:ems="10"
            android:id="@+id/edit_password"
            android:hint="Password"
            android:layout_marginStart="16dp"
            app:layout_constraintStart_toStartOf="parent"
            android:layout_marginLeft="16dp"
            android:layout_marginEnd="16dp"
            app:layout_constraintEnd_toEndOf="parent"
            android:layout_marginRight="16dp"
            android:layout_marginTop="8dp"
            app:layout_constraintTop_toBottomOf="@+id/edit_email"/>
    <Button
            android:text="Button"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:id="@+id/emailLoginBtn"
            android:layout_marginTop="8dp"
            app:layout_constraintTop_toBottomOf="@+id/edit_password"
            app:layout_constraintStart_toStartOf="parent"
            android:layout_marginLeft="16dp"
            android:layout_marginStart="16dp"
            app:layout_constraintEnd_toEndOf="parent"
            android:layout_marginEnd="16dp"
            android:layout_marginRight="16dp"
            android:background="@color/colorPrimary"
            android:textColor="@color/common_google_signin_btn_text_dark_default"/>
cs

 

 

 

 

ConstraintLayout 으로 구성하였고 Design 에 이렇게 보여지게 됩니다.

 

 

 

 

 

RC_SIGN_IN 은 Activity 의 requestCode 를 정해주었고

 

firebaseAuth 객체 변수를 전역으로 선언해 주었습니다.

 

    // Google Login result
    private val RC_SIGN_IN = 9001
 
    // Firebase Auth
    private var firebaseAuth: FirebaseAuth? = null
cs

 

 

 

 

Android 앱에 Google 로그인 통합하기 페이지를 참고해 Google 로그인을 앱에 통합

 

아래와 같이 GoogleSignInOptions 객체를 구성할 때 requestIdToken을 호출합니다.

 

구글 버튼이 클릭이 되면 구글 계정 인증 Activity가 보여지게 됩니다.

 

 

 

 

테스트이기 때문에 버튼을 한곳에 두어 진행하였고 응용하셔서 수정하시기 바랍니다.

 

    // [START onCreate]
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
 
        firebaseAuth = FirebaseAuth.getInstance();
 
        googleLoginBtn.setOnClickListener {
            // 회원가입 또는 로그인 함수 호출부
        }
    }
    // [END onCreate]
cs

 

 

 

 

Email 사용자 생성 함수 입니다.

 

신규 사용자의 이메일 주소와 비밀번호를 createUserWithEmailAndPassword 에 전달하여 신규 계정을 생성합니다.

 

getCurrentUser 메소드를 사용하여 사용자의 계정 데이터를 가져올 수 있습니다.

 

     // EmailCreate
    private fun createEmail(){
        firebaseAuth!!.createUserWithEmailAndPassword(edit_email.text.toString(), edit_password.text.toString())
            .addOnCompleteListener(this) {
                if (it.isSuccessful) {
                    // Sign in success, update UI with the signed-in user's information
                    val user = firebaseAuth?.currentUser
                    Toast.makeText(this"Authentication success.",Toast.LENGTH_SHORT).show()
                } else {
                    // If sign in fails, display a message to the user.
                    Toast.makeText(this"Authentication failed.",Toast.LENGTH_SHORT).show()
                }
            }
    }
cs

 

 

 

Email 사용자 로그인 확인 함수 입니다.

 

사용자가 앱에 로그인하면 사용자의 이메일 주소와 비밀번호를 signInWithEmailAndPassword 에 절달합니다.

 

getCurrentUser 메소드를 사용하여 계속 진행할 수 있습니다.

 

    // Email SignIn
    private fun loginEmail(){
        firebaseAuth!!.signInWithEmailAndPassword(edit_email.text.toString(), edit_password.text.toString())
            .addOnCompleteListener(this) {
                if (it.isSuccessful) {
                    // Sign in success, update UI with the signed-in user's information
                    Toast.makeText(this"signInWithEmail success.",Toast.LENGTH_SHORT).show()
                    val user = firebaseAuth?.currentUser
                } else {
                    // If sign in fails, display a message to the user.
                    Toast.makeText(this"signInWithEmail failed.",Toast.LENGTH_SHORT).show()
                }
            }
    }
cs

 

 

 

정상적으로 로그인이 되었다면 Firebase 사용자 탭으로 이동해 보겠습니다.

 

아래와 같이 사용자 정보가 추가되어있다면 잘 적용된 것입니다.

 

 

 

 

 

사용자를 로그아웃시키려면 signOut을 호출하면 됩니다.

    FirebaseAuth.getInstance().signOut();
cs

 

728x90
반응형
728x90
반응형

#본글은 Firebase에 프로젝트 등록까지 진행 후 내용입니다.

 

Google 로그인 기능을 추가하여 회원가입 없이 로그인 하는 용도로 사용됩니다.

 

Firebase에서 지원하고 있으며 기능을 구현해보도록 하겠습니다.

 

 

 

 

우선 Firebase 에 접속합니다.

 

https://console.firebase.google.com

 

로그인 - Google 계정

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

accounts.google.com

 

Authenfication 으로 들어간 뒤 '로그인 방법' 탭을 클릭합니다.

 

여러가지 로그인 기능이 있는데 Google 로그인을 사용 설정 합니다.

 

 

 

 

 

 

 

 

사용자 탭으로 가보면 아직 사용자 정보가 보여지지 않고 있습니다.

 

정상적으로 로그인을 하면 이 화면에서 사용자가 보여집니다.

 

 

 

 

 

 

Android Studio 로 돌아가 앱 수준 build.gradle 파일에 

 

Firebase 인증 및 Google 로그인에 대한 종속 항목을 추가합니다.

 

implementation 'com.google.firebase:firebase-auth:16.0.3'
implementation 'com.google.android.gms:play-services-auth:16.0.0'
cs

 

 

 

 

 

activity_main.xml 에 아래와 같이 추가해 주었습니다.

 

    <com.google.android.gms.common.SignInButton
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:text="Hello World!"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toTopOf="parent" android:layout_marginLeft="16dp"
            android:layout_marginRight="16dp" android:id="@+id/googleLoginBtn"/>
 
cs

 

 

 

 

ConstraintLayout 으로 구성하였고 Design 에 이렇게 보여지게 됩니다.

 

 

 

 

 

 

RC_SIGN_IN 은 Activity 의 requestCode 를 정해주었고

 

googleSigninClient 객체, firebaseAuth 객체 변수를 전역으로 선언해 주었습니다.

 

    // Google Login result
    private val RC_SIGN_IN = 9001
 
    // Google Api Client
    private var googleSigninClient: GoogleSignInClient? = null
 
    // Firebase Auth
    private var firebaseAuth: FirebaseAuth? = null
cs

 

 

 

 

 

Android 앱에 Google 로그인 통합하기 페이지를 참고해 Google 로그인을 앱에 통합

 

아래와 같이 GoogleSignInOptions 객체를 구성할 때 requestIdToken을 호출합니다.

 

구글 버튼이 클릭이 되면 구글 계정 인증 Activity가 보여지게 됩니다.

 

    // [START onCreate]
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
 
        // [START config_signin]
        val gso = GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
            .requestIdToken(getString(R.string.default_web_client_id))
            .requestEmail()
            .build()
        // [END config_signin]
 
        googleSigninClient = GoogleSignIn.getClient(this, gso)
 
        firebaseAuth = FirebaseAuth.getInstance();
 
        googleLoginBtn.setOnClickListener {
            val signInIntent = googleSigninClient?.getSignInIntent()
            startActivityForResult(signInIntent, RC_SIGN_IN)
        }
    }
    // [END onCreate]
cs

 

 

 

 

 

 

정상적으로 로그인이 되었다는 것이고 Firebase에 등록을 수행합니다.

 

이렇게 응답이 정상이면 firebaseAuthWithGoogle 함수를 호출 합니다.

 

    // [START onActivityResult]
    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
 
        // Google 로그인 인텐트 응답
        if (requestCode === RC_SIGN_IN) {
            val task = GoogleSignIn.getSignedInAccountFromIntent(data)
            try {
                // Google Sign In was successful, authenticate with Firebase
                val account = task.getResult(ApiException::class.java)
                firebaseAuthWithGoogle(account)
            } catch (e: ApiException) {
 
            }
        }
    }
    // [END onActivityResult]
cs

 

 

 

 

 

 

사용자가 정상적으로 로그인한 후에 GoogleSignInAccount 객체에서 ID 토큰을 가져와

 

Firebase 사용자 인증 정보로 교환하고 Firebase 사용자 인증 정보를 사용해 Firebase에 인증합니다.

 

signInWithCredential 에 대한 호출이 성공하면 getCurrentUser 메소드로 사용자의 계정 데이터를 가져올 수 있습니다.

 

    // [START firebaseAuthWithGoogle]
    private fun firebaseAuthWithGoogle(acct: GoogleSignInAccount) {
 
        val credential = GoogleAuthProvider.getCredential(acct.idToken, null)
        firebaseAuth!!.signInWithCredential(credential)
            .addOnCompleteListener(this) {
 
                // 성공여부
                if (it.isSuccessful) {
 
                    val user = firebaseAuth?.currentUser
                    Toast.makeText(this"로그인 성공", Toast.LENGTH_SHORT).show()
 
                } else {
 
                    Toast.makeText(this"로그인 실패", Toast.LENGTH_SHORT).show()
                }
            }
    }
    // [END firebaseAuthWithGoogle]
cs
 

 

 

 

 

 

정상적으로 로그인이 되었다면 Firebase 사용자 탭으로 이동해 보겠습니다.

 

아래와 같이 사용자 정보가 추가되어있다면 잘 적용된 것입니다.

 

 

 

 

사용자를 로그아웃시키려면 signOut을 호출하면 됩니다.

    FirebaseAuth.getInstance().signOut();
cs

 

728x90
반응형
728x90
반응형

 

Firebase 프로젝트를 만들어서 사용할 때 필요한 

 

디버그 서명 인증서 SHA-1 정보를 AndroidStudio 에서 확인해 보겠습니다.

 

 

 

 

 

AndroidStudio 우측에 Gradle 이라는 탭을 클릭합니다.

 

 

 

 

 

 

아래와 같은 화면이 보여지며 프로젝트 -> Tasks -> android 로 진입합니다.

 

3개의 설정 파일이 보여지는데 signingReport 를 더블 클릭합니다.

 

 

 

 

 

 

 

AndroidStudio 하단에 서명인증서 정보가 보여지게 됩니다.

 

 

 

 

 

간단하게 디버그 서명 인증서를 확인해 보았습니다.

 

 

 

 

728x90
반응형

+ Recent posts