일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 안드로이드광고
- JetpackCompose
- 클린 아키텍처
- 안드로이드 카카오 지도
- 안드로이드컴포즈
- 다이나믹 링크
- 애드몹배너
- 아키텍처
- 파이어베이스
- dynamiclink
- 동적 링크
- android kakao map
- 젯팩컴포즈
- HTTP
- thread
- android 지도
- glide
- Firebase
- RecyclerView
- component
- android daum map
- 안드로이드 라이브러리
- 애드몹광고
- Clean Architecture
- 컴포넌트
- 안드로이드
- Android 애드몹
- ImageView
- Android
- 선언형UI
- Today
- Total
코딩스토리
[Android/안드로이드] 카카오톡 로그인 연동 본문
이번 시간에는 카카오톡으로 로그인 연동을 시켜보도록 하겠습니다.
App Key 발급 및 등록
카카오연동을 하기 위해서는 페이스북 연동할떄와 마찬가지로 SDK외에도 App Key를 발급받아 프로젝트에 등록을 해주어야 합니다. App Key는 카카오개발자 홈페이지에서 받을 수 있습니다.
카카오개발자 홈페이지에 로그인을 하게되면 우측 상단에 이름을 클릭하게 되면 마이페이지로 갈 수 있습니다.
내 어플리케이션을 누르게 되면 앱을 만들 수 있는 폼이 생성됩니다. 앱 만들기 버튼을 클릭해줍니다.
앱 이름과 회사명을 설정하게 되면 다음과같이 앱 코드가 생성됩니다.
여기서 저희가 사용할 키는 네이티브 앱 키를 사용하게 됩니다.
우선 키를 만들었지만 프로젝트 생성을 하기 전에 몇가지 세팅을 더 해보겠습니다.
좌측 탭을 보면 설정에 사용자 관리를 클릭을 해 사용자 관리를 on시켜줍니다.
on으로 하지 않으면 api를 사용할 수 없습니다.
사용자관리를 활성화 시켜줬으면 이제 다시 좌측 탭에서 개요를 클릭해 앱에 대해 설정을 해줍니다.
앱정보를 설정해서 안드로이드 플랫폼을 추가해줍니다.
패키지명과 키해시를 입력해줍니다
키해시는 이전 글을 참조하여 넣어주시기 바랍니다.
2019/12/16 - [Android/유용한 기술] - [Android/안드로이드] 해시키(Hash key) 가져오는 방법
해시키를 넣고 저장을 누르면 카카오톡 로그인에 대한 세팅은 끝났습니다
이제 안드로이드 프로젝트를 생성해줍니다.
아까 생성한 네이티브 앱 코드를 strings.xml코드에 넣어줍니다.
수정사항
현재포스팅되어있는 버전은 v1 사용자 정보요청 버전입니다. v1은 지금 사용이 중단되어 v2로 업데이트를 해야 사용자 정보를 가져올 수 있습니다. App Key생성까지 하셨다면 다음 포스팅에서 다시 확인 부탁드립니다.
프로젝트에 Kakao SDK 추가
strings.xml
<resources>
<string name="app_name">KakaoLoginSample</string>
<string name="kakao_app_key">앱 키</string>
</resources>
build.gradle(Project:~)파일에 다음과 같이 두줄을 추가해줍니다.
build.gradle(Project:~)
allprojects {
repositories {
google()
jcenter()
maven{
url "https://maven.google.com"
}
/*카카오*/
maven { url 'http://devrepo.kakao.com:8088/nexus/content/groups/public/'}
}
}
gradle.properties파일에도 다음과 같이 두줄을 추가해줍니다.
gradle.properties
KAKAO_SDK_GROUP=com.kakao.sdk
KAKAO_SDK_VERSION=1.1.7
build.gradle(Module:app)에 카카오톡 SDK를 추가해줍니다.
build.gradle(Module:app)
dependencies {
implementation group: project.KAKAO_SDK_GROUP, name: 'usermgmt', version: project.KAKAO_SDK_VERSION
}
카카오 API연동
Kakao SDK를 사용하기 위해서는 초기화를 해줘야 합니다. 초기화는 GlobalApplication 공유 클래스를 만들어 앱 수준에서 관리하도록 하겠습니다. kakaoSDKAdapter클래스는 KakaoAdapter를 상속받습니다.
package com.example.kakaologinsample;
import android.app.Activity;
import android.app.Application;
import android.content.Context;
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;
public static GlobalApplication getGlobalApplicationContext() {
if (instance == null) {
throw new IllegalStateException("This Application does not inherit com.kakao.GlobalApplication");
}
return instance;
}
@Override
public void onCreate() {
super.onCreate();
instance = this;
// Kakao Sdk 초기화
KakaoSDK.init(new KakaoSDKAdapter());
}
@Override
public void onTerminate() {
super.onTerminate();
instance = null;
}
public class KakaoSDKAdapter extends KakaoAdapter {
@Override
public ISessionConfig getSessionConfig() {
return new ISessionConfig() {
// 로그인 시 인증 타입 지정
@Override
public AuthType[] getAuthTypes() {
return new AuthType[] {AuthType.KAKAO_ACCOUNT};
}
// pause와 resume시에 타이머를 설정/ CPU의 소모를 절약 할 지의 여부를 지정
@Override
public boolean isUsingWebviewTimer() {
return false;
}
// Kakao와 제휴 된 앱에서 사용되는 값
@Override
public ApprovalType getApprovalType() {
return ApprovalType.INDIVIDUAL;
}
// 로그인 웹뷰에서 email 입력 폼의 데이터를 저장할 지 여부를 지정
@Override
public boolean isSaveFormData() {
return true;
}
};
}
// Application이 가지고 있는 정보를 얻기 위한 인터페이스
@Override
public IApplicationConfig getApplicationConfig() {
return new IApplicationConfig() {
@Override
public Activity getTopActivity() { return null;
}
@Override
public Context getApplicationContext() {
return GlobalApplication.getGlobalApplicationContext();
}
};
}
}
}
GlobalApplication 객체를 공유하기 위해서 manifests.xml에 다음과 같이 추가를 해야합니다.
AuthType
Kakao SDK로그인을 하는 방식에 대한 Enum class
KAKAO_TALK | 0 | kakaotalk으로 login을 하고 싶을때 지정. |
KAKAO_STORY | 1 | kakaostory으로 login을 하고 싶을때 지정. |
KAKAO_ACCOUNT | 2 | 웹뷰 Dialog를 통해 카카오 계정연결을 제공하고 싶을경우 지정. |
KAKAO_TALK_EXCLUDE_NATIVE_LOGIN | 3 | 카카오톡으로만 로그인을 유도하고 싶으면서 계정이 없을때 계정생성을 위한 버튼도 같이 제공을 하고 싶다면 지정. KAKAO_TALK과 중복 지정불가. |
KAKAO_LOGIN_ALL | 4 | 모든 로그인 방식을 사용하고 싶을 때 지정. |
manifests.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.lakue.kakaologinsample">
<uses-permission android:name="android.permission.INTERNET" />
<application
android:name=".GlobalApplication"
...>
<meta-data
android:name="com.kakao.sdk.AppKey"
android:value="@string/kakao_app_key" />
<activity>
...
</activity>
</application>
</manifest>
인터넷을 사용하기 위해 <uses-permission android:name="android.permission.INTERNET" /> 를 넣어줘야 하고,
카카오에서 받아온 앱 키를 설정할 메타데이터 를 넣어줘야 합니다.
Login버튼 구현
로그인 버튼은 페이스북과 마찬가지로 카카오에서 제공하는 로그인 버튼과 사용자 맘대로 꾸밀 수 있는 커스텀 로그인버튼이 있습니다. 이번 프로젝트에서 두개 다 사용해보겠습니다.
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical"
tools:context=".MainActivity">
<Button
android:id="@+id/btn_custom_login"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="카카오 로그인" />
<com.kakao.usermgmt.LoginButton
android:id="@+id/btn_kakao_login"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
이제 MainActivity에서 버튼을 클릭했을 때 로그인을 요청해줍니다.
MainActivity.java
package com.example.kakaologinsample;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import androidx.appcompat.app.AppCompatActivity;
import com.kakao.auth.AuthType;
import com.kakao.auth.Session;
public class MainActivity extends AppCompatActivity {
private Button btn_custom_login;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn_custom_login = (Button) findViewById(R.id.btn_custom_login);
btn_custom_login.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Session session = Session.getCurrentSession();
session.addCallback(new SessionCallback());
session.open(AuthType.KAKAO_LOGIN_ALL, MainActivity.this);
}
});
}
}
SessionCallback 클래스 구현
카카오톡 로그인 요청을 코드는 완성되었습니다. 이제 로그인 결과값을 전달받기 위한 Callback클래스를 구현하겠습니다.
SessionCallback.java
package com.example.kakaologinsample;
import android.util.Log;
import com.kakao.auth.ISessionCallback;
import com.kakao.network.ErrorResult;
import com.kakao.usermgmt.UserManagement;
import com.kakao.usermgmt.callback.MeResponseCallback;
import com.kakao.usermgmt.response.model.UserProfile;
import com.kakao.util.exception.KakaoException;
public class SessionCallback implements ISessionCallback {
// 로그인에 성공한 상태
@Override
public void onSessionOpened() {
requestMe();
}
// 로그인에 실패한 상태
@Override
public void onSessionOpenFailed(KakaoException exception) {
Log.e("SessionCallback :: ", "onSessionOpenFailed : " + exception.getMessage());
}
// 사용자 정보 요청
public void requestMe() {
// 사용자정보 요청 결과에 대한 Callback
UserManagement.requestMe(new MeResponseCallback() {
// 세션 오픈 실패. 세션이 삭제된 경우,
@Override
public void onSessionClosed(ErrorResult errorResult) {
Log.e("SessionCallback :: ", "onSessionClosed : " + errorResult.getErrorMessage());
}
// 회원이 아닌 경우,
@Override
public void onNotSignedUp() {
Log.e("SessionCallback :: ", "onNotSignedUp");
}
// 사용자정보 요청에 성공한 경우,
@Override
public void onSuccess(UserProfile userProfile) {
Log.e("SessionCallback :: ", "onSuccess");
String nickname = userProfile.getNickname();
String profileImagePath = userProfile.getProfileImagePath();
String thumnailPath = userProfile.getThumbnailImagePath();
long id = userProfile.getId();
Log.i("Profile : ", "nickname / " + nickname + "");
Log.i("Profile : ", "profileImagePath / " + profileImagePath + "");
Log.i("Profile : ", "thumnailPath / " + thumnailPath + "");
Log.i("Profile : ", "id / " + id + "");
}
// 사용자 정보 요청 실패
@Override
public void onFailure(ErrorResult errorResult) {
Log.e("SessionCallback :: ", "onFailure : " + errorResult.getErrorMessage());
}
});
}
}
Name | Type | Description |
onSuccess | UserProfile | 사용자 정보 요청이 성공한 경우로 사용자 정보 객체를 받습니다. |
onSessionClosed | ErrorResult | 세션이 닫혀 실패한 경우로 에러 결과를 받습니다. 재로그인 / 토큰발급이 필요합니다. |
onFailure | ErrorResult | 가입이 안된 경우와 세션이 닫힌 경우를 제외한 다른 이유로 요청이 실패한 경우 콜백입니다. |
로그아웃
로그아웃 요청은 간단합니다.
UserManagerment에서 requestLogout()인터페이스만 정의해주면 로그아웃 요청이 됩니다.
로그아웃했을 때 Toast메시지를 띄워 확인해보도록 하겠습니다.
UserManagement.requestLogout(new LogoutResponseCallback() {
@Override
public void onCompleteLogout() {
Toast.makeText(MainActivity.this, "로그아웃 되었습니다.", Toast.LENGTH_SHORT).show();
}
});
실행화면
카카오에서 제공하는 카카오계정으로 로그인과 커스텀버튼으로 만든 카카오로그인의 기능은 같기 때문에 둘중 하나라도 누르면 카카오 로그인 창이 띄워집니다. 로그인에 성공을 하게 되면 Logcat을 확인하여 계정에 대한 카카오 정보를 가져올 수 있습니다.
'Android > 유용한 기술' 카테고리의 다른 글
[Android/안드로이드] ImageVideoView / url에 따라 이미지나 비디오를 하나의 뷰로 만들기 (1) | 2020.01.04 |
---|---|
[Android/안드로이드] Android OS 9 Pie버전에서 http사용하기 (0) | 2020.01.04 |
[Android/안드로이드] 모서리 둥근 이미지뷰 만들기/RoundImageView (0) | 2019.12.30 |
[Android/안드로이드] RecyclerView 스크롤 효과 제거 (0) | 2019.12.29 |
[Android/안드로이드] 버튼 터치 이벤트 막기 (0) | 2019.12.27 |