songining
article thumbnail

์šฐ์„  Kakao Developer์—์„œ ์•ฑ์„ ๋งŒ๋“ค๊ณ  ํ™œ์„ฑํ™”์„ค์ •, ํ•ด์‹œํ‚ค์ž…๋ ฅ ๋“ฑ ๋ชจ๋“  ์ค€๋น„๋ฅผ ๋๋ƒˆ๋‹ค๊ณ  ์น˜์ž. 

(์นด์นด์˜ค ์‚ฌ์šฉ์ž ์ •๋ณด ๋™์˜๋ฅผ ํ•„์ˆ˜ ๋˜๋Š” ์„ ํƒ์œผ๋กœ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์€ ์ •๋ง ์ค‘์š”ํ•˜๋‹ค. ์ด๊ฑธ ํ™•์ธ ์•ˆํ•˜๊ณ  ์ฝ”๋“œ๋งŒ ๊ณ„์† ๊ณ ์น˜๋‹ค๊ฐ€ ๊ฑฐ์˜ ์ผ์ฃผ์ผ์„ ๊ณ ์ƒํ–ˆ๋‹ค. ์‚ฌ์šฉ์ž์ •๋ณด ๋™์˜ ์„ค์ •๊ณผ ๋กœ๊ทธ์ธ ํ™œ์„ฑํ™”๋Š” ์ •๋ง ํ•„์ˆ˜๋‹ค.) 

 

์ด์ œ ์•ˆ๋“œ๋กœ์ด๋“œ ์ŠคํŠœ๋””์˜ค์— ์ž…๋ ฅํ•  ์ฝ”๋“œ๋“ค์ด๋‹ค. 

 

<AndroidManifest.xml>

 

//application ๋ฐ–์—

<uses-permission android:name="android.permission.INTERNET" /> //์ธํ„ฐ๋„ท ์‚ฌ์šฉ๊ถŒํ•œ ์„ค์ • 

 

//application ์•ˆ์— 

<meta-data
            android:name="com.kakao.sdk.AppKey"
            android:value="@string/kakao_app_key" />

 

<build.gradle(;app)>

dependencies {

    implementation fileTree(dir: "libs", include: ["*.jar"])
    implementation 'androidx.appcompat:appcompat:1.1.0'
    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'androidx.test.ext:junit:1.1.1'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'

    // ์นด์นด์˜คํ†ก SDK ์ถ”๊ฐ€
    implementation group: project.KAKAO_SDK_GROUP, name: 'usermgmt', version: project.KAKAO_SDK_VERSION

    // ์นด์นด์˜ค ๋กœ๊ทธ์ธ
    implementation group: 'com.kakao.sdk', name: 'usermgmt', version: '1.30.0'

    // ์นด์นด์˜คํ†ก
    implementation group: 'com.kakao.sdk', name: 'kakaotalk', version: '1.30.0'

    // ์นด์นด์˜ค์Šคํ† ๋ฆฌ
    implementation group: 'com.kakao.sdk', name: 'kakaostory', version: '1.30.0'

    // ์นด์นด์˜ค๋งํฌ
    implementation group: 'com.kakao.sdk', name: 'kakaolink', version: '1.30.0'

    // ์นด์นด์˜ค๋‚ด๋น„
    implementation group: 'com.kakao.sdk', name: 'kakaonavi', version: '1.30.0'

}

 

<build.gradle(ํ”„๋กœ์ ํŠธ ์ด๋ฆ„)>

 

allprojects {
    repositories {
        google()
        jcenter()
        maven{
            url "https://maven.google.com"
        }
        maven { url 'https://devrepo.kakao.com/nexus/content/groups/public/' }
    }
}

 

<resํด๋” ์•ˆ์— strings.xml ์ถ”๊ฐ€>

<resources>
    //์นด์นด์˜ค ์•ฑ ํ‚ค
    <string name="app_name">์นด์นด์˜ค๋””๋ฒจ๋กœํผ์— ๋“ฑ๋กํ•œ ์•ฑ์ด๋ฆ„ ์ ๊ธฐ</string>
    <string name="kakao_app_key">์นด์นด์˜ค๋””๋ฒจ๋กœํผ์—์„œ ํ™•์ธํ•œ ๋„ค์ดํ‹ฐ๋ธŒ์•ฑํ‚ค ์ ๊ธฐ</string>
</resources>

 

์œ„์˜ ๊ณผ์ •์„ ์ž˜ ๋งˆ์ณค๋‹ค๋ฉด import com.kakao.~ ๊ฐ€ ๊ฐ€๋Šฅํ•  ๊ฒƒ์ด๋‹ค. 

์•„๋ž˜์˜ ์ฝ”๋“œ๋Š” ๋‚ด๊ฐ€ ๋งŒ๋“  ๋กœ๊ทธ์ธ ์˜ˆ์‹œ์ด๋‹ค. 

๋‚˜๋Š” ์นด์นด์˜ค ๋ฒ„ํŠผ์„ ์ง์ ‘ ๋””์ž์ธ ํ•˜๊ณ  ์‹ถ์–ด ๋”ฐ๋กœ ๋ฒ„ํŠผ์„ ๋งŒ๋“ค์—ˆ๋‹ค. 

 

<LoginActivity.xml>

 

   <com.kakao.usermgmt.LoginButton
            android:id="@+id/btn_kakao_login"
            android:layout_width="19dp"
            android:layout_height="wrap_content"
            android:visibility="gone" />

์œ„์˜ ์ฝ”๋“œ๊ฐ€ ์นด์นด์˜ค์—์„œ ์ œ๊ณตํ•˜๋Š” ๋ฒ„ํŠผ์ด๋‹ค. ๋‚˜๋Š” ์ด ๋ฒ„ํŠผ์„ ๋ฎ๊ณ  ์•„๋ž˜์ฒ˜๋Ÿผ ์ƒˆ๋กœ ์ปค์Šคํ…€ํ•ด๋ณด์•˜๋‹ค. 

    <Button
        android:id="@+id/btn_custom_login"
        android:layout_width="187dp"
        android:layout_height="41dp"
        android:layout_gravity="center"
        android:background="@drawable/buttonstyle"

        android:text="์นด์นด์˜คํ†ก์œผ๋กœ ๊ฐ„ํŽธ ๋กœ๊ทธ์ธ"
        android:textColor="#000000" />

์นด์นด์˜ค์—์„œ ์ œ๊ณตํ•œ ๋ฒ„ํŠผ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ์„ธ์…˜์„ ์ง์ ‘ ์—ด์–ด์ฃผ์—ˆ๋‹ค. 

 

<LoginActivity.java>

public class LoginActivity extends AppCompatActivity {

    private Button btn_custom_login;
    private Button btn_custom_logout;
    private SessionCallback sessionCallback = new SessionCallback();
    private String nickname,email;
    Session session;


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

        btn_custom_login = (Button) findViewById(R.id.btn_custom_login);
        btn_custom_logout = (Button) findViewById(R.id.btn_custom_logout);

        //๋กœ๊ทธ์ธ ๋ฒ„ํŠผ
        btn_custom_login.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                session = Session.getCurrentSession();
                session.addCallback(sessionCallback);
                session.open(AuthType.KAKAO_LOGIN_ALL, LoginActivity.this);

            }

        });

        //๋กœ๊ทธ์•„์›ƒ ๋ฒ„ํŠผ
        btn_custom_logout.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                UserManagement.getInstance()
                        .requestLogout(new LogoutResponseCallback() {
                            @Override
                            public void onCompleteLogout() {
                                Toast.makeText(LoginActivity.this, "๋กœ๊ทธ์•„์›ƒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.", Toast.LENGTH_SHORT).show();
                            }
                        });
            }
        });

    }

    @Override
    protected void onDestroy() {
        super.onDestroy();

        // ์„ธ์…˜ ์ฝœ๋ฐฑ ์‚ญ์ œ
        Session.getCurrentSession().removeCallback(sessionCallback);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        // ์นด์นด์˜คํ†ก|์Šคํ† ๋ฆฌ ๊ฐ„ํŽธ๋กœ๊ทธ์ธ ์‹คํ–‰ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ›์•„์„œ SDK๋กœ ์ „๋‹ฌ
        if (Session.getCurrentSession().handleActivityResult(requestCode, resultCode, data)) {
            return;
        }

        super.onActivityResult(requestCode, resultCode, data);
    }

    //์ฝœ๋ฐฑ ๋‚ด๋ถ€ ํด๋ž˜์Šค
    private class SessionCallback implements ISessionCallback {

        // ๋กœ๊ทธ์ธ์— ์„ฑ๊ณตํ•œ ์ƒํƒœ
        @Override
        public void onSessionOpened() {
            requestMe();

        }


        // ๋กœ๊ทธ์ธ์— ์‹คํŒจํ•œ ์ƒํƒœ
        @Override
        public void onSessionOpenFailed(KakaoException exception) {
            Log.e("SessionCallback :: ", "onSessionOpenFailed : " + exception.getMessage());
        }

        // ์‚ฌ์šฉ์ž ์ •๋ณด ์š”์ฒญ
        public void requestMe() {

            UserManagement.getInstance()
                    .me(new MeV2ResponseCallback() {
                        @Override
                        public void onSessionClosed(ErrorResult errorResult) {
                            Log.e("KAKAO_API", "์„ธ์…˜์ด ๋‹ซํ˜€ ์žˆ์Œ: " + errorResult);
                        }

                        @Override
                        public void onFailure(ErrorResult errorResult) {
                            Log.e("KAKAO_API", "์‚ฌ์šฉ์ž ์ •๋ณด ์š”์ฒญ ์‹คํŒจ: " + errorResult);
                        }

                        //์‚ฌ์šฉ์ž ์ •๋ณด ์š”์ฒญ์— ์„ฑ๊ณตํ•œ ๊ฒฝ์šฐ
                            @Override
                            public void onSuccess(MeV2Response result) {

                            Log.i("KAKAO_API", "์‚ฌ์šฉ์ž ์•„์ด๋””: " + result.getId());
                            UserAccount kakaoAccount = result.getKakaoAccount();

                            if (kakaoAccount != null) {
                                // ์ด๋ฉ”์ผ
                               email = kakaoAccount.getEmail();

                                if (email != null) {
                                    Log.i("KAKAO_API", "email: " + email);

                                } else if (kakaoAccount.emailNeedsAgreement() == OptionalBoolean.TRUE) {
                                    // ๋™์˜ ์š”์ฒญ ํ›„ ์ด๋ฉ”์ผ ํš๋“ ๊ฐ€๋Šฅ
                                    // ๋‹จ, ์„ ํƒ ๋™์˜๋กœ ์„ค์ •๋˜์–ด ์žˆ๋‹ค๋ฉด ์„œ๋น„์Šค ์ด์šฉ ์‹œ๋‚˜๋ฆฌ์˜ค ์ƒ์—์„œ ๋ฐ˜๋“œ์‹œ ํ•„์š”ํ•œ ๊ฒฝ์šฐ์—๋งŒ ์š”์ฒญํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

                                } else {
                                    // ์ด๋ฉ”์ผ ํš๋“ ๋ถˆ๊ฐ€
                                }

                                // ํ”„๋กœํ•„
                                Profile profile = kakaoAccount.getProfile();

                                if (profile != null) {
                                    Log.d("KAKAO_API", "nickname: " + profile.getNickname());
                                    Log.d("KAKAO_API", "profile image: " + profile.getProfileImageUrl());
                                    Log.d("KAKAO_API", "thumbnail image: " + profile.getThumbnailImageUrl());
                                    nickname=profile.getNickname();
                                } else if (kakaoAccount.profileNeedsAgreement() == OptionalBoolean.TRUE) {
                                    // ๋™์˜ ์š”์ฒญ ํ›„ ํ”„๋กœํ•„ ์ •๋ณด ํš๋“ ๊ฐ€๋Šฅ

                                } else {
                                    // ํ”„๋กœํ•„ ํš๋“ ๋ถˆ๊ฐ€
                                }
                                redirectSignupActivity();
                            }

                        }});

        }
    }



    protected void redirectSignupActivity() {       //์„ธ์…˜ ์—ฐ๊ฒฐ ์„ฑ๊ณต ์‹œ profileActivity๋กœ ๋„˜๊น€

        ArrayList<String> profile=new ArrayList<>();
        profile.add(nickname);
        profile.add(email);
        Intent intent = new Intent(this, HomeActivity.class);
        intent.putExtra("profile",profile);
        startActivity(intent);
        finish();
    }
}