현재 운영중에 APP 에서는 KAKAO SDK V1 을 사용중인데..
아래와 같은 메일을 받았다..
결론은 SDK 버전 업그레이드를 하라는 이야기..
Kakao developers 에 보면 잘 설명이 나와 있다.
https://developers.kakao.com/docs/latest/ko/getting-started/sdk-android#migration
Kakao Developers
카카오 API를 활용하여 다양한 어플리케이션을 개발해보세요. 카카오 로그인, 메시지 보내기, 친구 API, 인공지능 API 등을 제공합니다.
developers.kakao.com
앱 개발자가 아닌.. 내가 보고 했으니..Java 를 하신다면 SDK 버전 변경하는데 문제는 없을꺼 같다.
bulid.gradle 수정 (SDK V2 url 로 변경한다)
repositories {
mavenCentral()
// KAKAO SDK V1
//maven { url 'http://devrepo.kakao.com:8088/nexus/content/groups/public/' }
// KAKAO SDK V2
maven { url 'https://devrepo.kakao.com/nexus/content/groups/public/'}
}
서비스하는 앱에서는 로그인만 사용하기 때문에 로그인 부분만 추가하였다
dependencies {
// 카카오로그인
// SDK V1
//implementation group: 'com.kakao.sdk', name: 'usermgmt', version: project.KAKAO_SDK_VERSION // 카카오 로그인 sdk를 사용하기 위해 필요.
// SDK V2
implementation "com.kakao.sdk:v2-user:2.12.0" // 카카오 로그인
//implementation "com.kakao.sdk:v2-all:2.12.0" // 전체 모듈 설치, 2.11.0 버전부터 지원
}
AndroidManifest.xml 에 있는 KAKAO KEY 값을 가져와서 init 처리를 하였다
public class GlobalApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
/* KAKAO SDK V1 */
//KakaoSDK.init(new KakaoSDKAdapter());
/* KAKAO SDK V2 */
String kakaoAppkey = "";
try {
ApplicationInfo ai = getPackageManager().getApplicationInfo(getPackageName(), PackageManager.GET_META_DATA);
if (ai.metaData != null) {
kakaoAppkey = ai.metaData.getString("com.kakao.sdk.AppKey");
}
} catch (PackageManager.NameNotFoundException e) {
// if we can't find it in the manifest, just return null
}
KakaoSdk.init(this, kakaoAppkey);
}
}
아래와 같은 클래스를 만들어서 SDK V2로 로그인 처리를 하였다.
기존에 V1에서 사용하는 키해시 값이 아닌 다른 값을 리턴 받을 수 있다.
새로운 키해시 값을 받는다면 kakao develop 사이트에서 해당 APP에 들어가
해시값을 추가해주어야한다
public class KakaoV2Callback {
public KakaoV2Callback(){
String keyHash = getKeyHash();
Log.e("KakaoV2Callback KeyHash : ", keyHash);
if(UserApiClient.getInstance().isKakaoTalkLoginAvailable(MainActivity.this)){
// 카카오톡으로 로그인
login();
}else{
// 카카오계정으로 로그인
accountLogin();
}
}
// 카카오톡으로 로그인
public void login(){
String TAG = "login()";
UserApiClient.getInstance().loginWithKakaoTalk(MainActivity.this,(oAuthToken, error) -> {
if (error != null) {
Log.e(TAG, "로그인 실패", error);
} else if (oAuthToken != null) {
Log.i(TAG, "로그인 성공(토큰) : " + oAuthToken.getAccessToken());
getUserInfo(oAuthToken.getAccessToken());
}
return null;
});
}
// 카카오계정으로 로그인
public void accountLogin(){
String TAG = "accountLogin()";
UserApiClient.getInstance().loginWithKakaoAccount(MainActivity.this,(oAuthToken, error) -> {
if (error != null) {
Log.e(TAG, "로그인 실패", error);
} else if (oAuthToken != null) {
Log.i(TAG, "로그인 성공(토큰) : " + oAuthToken.getAccessToken());
getUserInfo(oAuthToken.getAccessToken());
}
return null;
});
}
public void getUserInfo(String accessToken){
String TAG = "getUserInfo()";
UserApiClient.getInstance().me((user, meError) -> {
if (meError != null) {
Log.e(TAG, "사용자 정보 요청 실패", meError);
} else {
{
Log.i("SessionKakaoV2Callback getUserInfo() - 사용자 정보 요청 성공 : ",
"\n회원번호 : "+user.getId() +
"\n이메일 : "+user.getKakaoAccount().getEmail());
}
Account user1 = user.getKakaoAccount();
try {
String email = user.getKakaoAccount().getEmail();
String nickname = user.getKakaoAccount().getProfile().getNickname();
String profileImagePath = user.getKakaoAccount().getProfile().getProfileImageUrl();
String thumnailPath = user.getKakaoAccount().getProfile().getThumbnailImageUrl();
long id = user.getId();
JSONObject jsonAccount = new JSONObject();
jsonAccount.put("email", email);
jsonAccount.put("nickname", nickname);
jsonAccount.put("profileImagePath", profileImagePath);
jsonAccount.put("thumnailPath", thumnailPath);
jsonAccount.put("id", id);
JSONObject jsonObject = new JSONObject();
jsonObject.put("accessToken", accessToken); // getAccessToken
jsonObject.put("userInfo", jsonAccount); // 사용자정보
Log.i(TAG, "jsonObject", jsonObject);
} catch (Exception e) {
e.printStackTrace();
}
}
return null;
});
}
// 키해시 얻기
public String getKeyHash(){
try{
PackageInfo packageInfo = getPackageManager().getPackageInfo(getPackageName(), PackageManager.GET_SIGNATURES);
if(packageInfo == null) return null;
for(Signature signature: packageInfo.signatures){
try{
MessageDigest md = MessageDigest.getInstance("SHA");
md.update(signature.toByteArray());
return android.util.Base64.encodeToString(md.digest(), Base64.NO_WRAP);
}catch (NoSuchAlgorithmException e){
Log.w("getKeyHash", "Unable to get MessageDigest. signature="+signature, e);
}
}
}catch(PackageManager.NameNotFoundException e){
Log.w("getPackageInfo", "Unable to getPackageInfo");
}
return null;
}
}
참고한 블로그 : https://kakao-tam.tistory.com/115
안드로이드는 이제 해결 되었으니...
iOS 작업 시작..
'개발경험 및 메모 > Android' 카테고리의 다른 글
안드로이드 QUERY_ALL_PACKAGES 권한 (0) | 2023.01.12 |
---|---|
Android 12 (SDK 31) 로 변경 - Apps targeting Android 12 and higher are required to specify an explicit value for `android:exported` (0) | 2022.12.23 |
최근댓글