시나브로

[ kakaoDevelopers ] 로그인 Api 사용하기 본문

안드로이드

[ kakaoDevelopers ] 로그인 Api 사용하기

혬혬 2019. 10. 23. 21:29
728x90

MainActivity -> Login[ 카카오 로그인 버튼 위치 ]

Setting

1. build.gradle(Project : 프로젝트 명)

밑에 두줄을 추가하자

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

2.build.gradle(Module: app)

dependencies에 맨마지막줄을 추가해주자

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:runner:1.2.0'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
    implementation group: 'com.kakao.sdk', name: 'usermgmt', version: project.KAKAO_SDK_VERSION
}

3.gradle.properties

두줄을 맨 마지막에 추가해주자

KAKAO_SDK_GROUP=com.kakao.sdk
KAKAO_SDK_VERSION=1.14.0

4. AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.a">

    <uses-permission android:name="android.permission.INTERNET" />
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme"
        android:name="com.example.a.GlobalApplication">
        <activity android:name=".Login"></activity>
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

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

        <activity
            android:name="com.kakao.auth.authorization.authcode.KakaoWebViewActivity"
            android:launchMode="singleTop"
            android:windowSoftInputMode="adjustResize">
            <intent-filter>
                <action android:name="android.intent.action.Main" />

                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>
    </application>

</manifest>

1.

위부분에 <uses-permission ~~>의 부분을 추가하자. 

이는 인터넷 사용을 허가하는 소스이다. 이를 안할 경우, 작동을 안할 수 있다. 

 

2.

< application ~~ name="com.example.a.GlobalApplication"의 부분을 보면 com.example.a는 나의 패키지명이다. 각자의 패키지 명에 맞게 수정해야한다. GlobalApplicaion은 KakaoSDKAdapter class가 위치해 있다. 

KakaoSDKAdapter는 카카오 api를 이용하기 위해 필수 사항이다. 나와 같게 진행한다면 일단 GlobalApplication으로 진행해도 되지만, 아니라면 밑에 있는 GlobalApplication의 설명을 읽고 파일을 만드는 것이 좋다. 

나는 GlobalApplication 때문에 많은 고생을 하였다. 주의하길...

이를 하지 않을 경우, 파일을 찾지 못한다는 오류가 날 수 있다. 

 

3.

MainActivity의 내용은 위와 동일하게 채워주면 된다. 이유는 잘모르겠으나 모든 블로그가 이렇게 하기에 따라하자

 

4. 

<meta-data ~~>의 경우 그대로 적자. 여기서 kakao_app_key의 경우, res-values에 kakao_string.xml 파일을 만들어서 값을 입력할 것이다. 밑에 더 자세하게 적겠다.

 

5.

맨 마지막에 있는<activity ~~>는 우리가 익숙하던 형태는 아니지만, 일단 입력하자.

 

5.kakao_strings.xml

res-values에 kakao_strings.xml 파일을 만들어 준다. 

내용은 아래와 동일하다. 

<resources>
    <string name="kakao_app_key"> be4a0aa071faecf17991a4e91872f256</string>
</resources>

 

 

Code

1. activity_login.xml

카카오 로그인 아이콘이 위치할 xml 파일이다.

xml파일에 아래의 소스를 추가하면, 옆에 화면에 아이콘이 추가된것을 확인할 수 있다. 

    <com.kakao.usermgmt.LoginButton
        android:id="@+id/com_kakao_login"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:layout_marginBottom="30dp"
        android:layout_marginLeft="20dp"
        android:layout_marginRight="20dp"
        tools:ignore="MissingConstraints" />

 

2.Login.java

이는  위의 activity_login.xml과 짝이되는 java파일이다. 

package com.example.a;

import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.inputmethod.InputMethod;
import android.view.inputmethod.InputMethodSession;

import com.kakao.auth.ISessionCallback;
import com.kakao.auth.Session;
import com.kakao.network.ErrorResult;
import com.kakao.usermgmt.UserManagement;
import com.kakao.usermgmt.callback.MeV2ResponseCallback;
import com.kakao.usermgmt.callback.UnLinkResponseCallback;
import com.kakao.usermgmt.response.MeV2Response;
import com.kakao.util.exception.KakaoException;
import com.kakao.util.helper.log.Logger;

import java.util.ArrayList;
import java.util.List;

public class Login extends Activity {
    private SessionCallback callback;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);
        callback= new SessionCallback();
        Session.getCurrentSession().addCallback(callback);
        Session.getCurrentSession().checkAndImplicitOpen();
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        if(Session.getCurrentSession().handleActivityResult(requestCode,resultCode,data)){
            return;
        }
        super.onActivityResult(requestCode, resultCode, data);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Session.getCurrentSession().removeCallback(callback);
    }
    private class SessionCallback implements ISessionCallback{

        @Override
        public void onSessionOpened() {
            Log.e("kakao login result", "카카오 로그인 성공 ");
            requestMe();
            redirectMainActivity();
        }

        @Override
        public void onSessionOpenFailed(KakaoException exception) {
            if(exception!=null){
                Logger.e(exception);
            }
        }
    }
    private void requestMe() {
        List<String> keys = new ArrayList<>();
        keys.add("properties.nickname");
        keys.add("properties.profile_image");
        keys.add("kakao_account.email");

        UserManagement.getInstance().me(keys, new MeV2ResponseCallback() {
            @Override
            public void onFailure(ErrorResult errorResult) {
                String message = "failed to get user info. msg=" + errorResult;
                Logger.d(message);
            }

            @Override
            public void onSessionClosed(ErrorResult errorResult) {
                Log.e("onsuccess close", errorResult.getErrorMessage());
                redirectLoginActivity();
            }

            @Override
            public void onSuccess(MeV2Response response) {
                Log.e("kakao nickname is", response.getNickname());
                Logger.d("user id : " + response.getId());
                Logger.d("nickname"+response.getNickname());
                redirectMainActivity();
                //profile image 다운로드 안됨
            }
            //onNotSignedUp() 함수 삭제
        });
    }
    protected void redirectMainActivity(){
        final Intent intent=new Intent(this, MainActivity.class);
        startActivity(intent);
        finish();
    }
    protected void redirectLoginActivity(){
        final Intent intent=new Intent(this, Login.class);
        startActivity(intent);
        finish();
    }
    private void onClickLogout(){
        UserManagement.getInstance().requestUnlink(new UnLinkResponseCallback() {
            @Override
            public void onSessionClosed(ErrorResult errorResult) {
                Log.e("kakao login session successclosed", "카카오 로그아웃 onSessionClosed");
            }

            @Override
            public void onNotSignedUp() {
                Log.e("kakao login session on not signedup", "카카오 로그아웃 onNotSignedUp");
            }

            @Override
            public void onSuccess(Long result) {
                Log.e("kakao login session success", "카카오 로그아웃 onSuccess");
            }
        });
    }
}

 

다 가져다가 붙히면 될거 같다. 성공시, 아래의 Logcat에 빨간글씨로 카카오톡 로그인 성공 안내 메세지와 nickname을 볼 수 있다. 

 

3. GlobalApplication.java

예시를 찾다보면 다들 GlobalApplication이라고 하는데 이름은 상관없다. 

하나의 중요점은 app클릭 - new -activity -empty activity를 클릭해서 파일을 생성하면 안된다.

java class 파일을 만들어야된다.   나는 이것 때문에 많은 고생을 했다. 

그 이유는 이 파일에서는 activity/AppCompatActivity를 상속하지 않고 Application을 상속하기 때문이다. 

 

package com.example.a;

import android.app.Application;
import android.content.Context;
import android.util.Log;

import com.kakao.auth.ApprovalType;
import com.kakao.auth.AuthType;
import com.kakao.auth.IApplicationConfig;
import com.kakao.auth.ISessionConfig;
import com.kakao.auth.KakaoAdapter;
import com.kakao.auth.KakaoSDK;

public class GlobalApplication extends Application {
    private static GlobalApplication instance;
    private static class KakaoSDKAdapter extends KakaoAdapter {
        @Override
        public ISessionConfig getSessionConfig() {
            return new ISessionConfig() {
                @Override
                public AuthType[] getAuthTypes() {
                    return new AuthType[]{AuthType.KAKAO_LOGIN_ALL};
                }

                @Override
                public boolean isUsingWebviewTimer() {
                    return false;
                }

                @Override
                public boolean isSecureMode() {
                    return false;
                }

                @Override
                public ApprovalType getApprovalType() {
                    return ApprovalType.INDIVIDUAL;
                }

                @Override
                public boolean isSaveFormData() {
                    return true;
                }
            };
        }

        @Override
        public IApplicationConfig getApplicationConfig() {
            return new IApplicationConfig() {
                @Override
                public Context getApplicationContext() {
                    return GlobalApplication.getGlobalApplicationContext();
                }

            };
        }
    }
    @Override
    public void onCreate() {
        super.onCreate();
        instance=this;
        KakaoSDK.init(new KakaoSDKAdapter());
    }
    public static GlobalApplication getGlobalApplicationContext() {
        if(instance == null)
            throw new IllegalStateException("this application does not inherit com.kakao.GlobalApplication");
        return instance;
    }
}

만약 getGlobalApplicationContext()함수에서 instance null오류가 난다면, onCreate() 함수에서 instance = this를 하였는지 확인해봐라.

728x90
Comments