https://developers.kakao.com/docs/android/user-management 에 나온 public class GlobalApplication extends Application {} 부분을 참조하여 코드를 구현한다.
테스트에 사용한 소스 코드는 맨 하단에 첨부했다.
GlobalApplication.java
package com.link2me.android.auth_kakao;
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 final GlobalApplication getGlobalApplicationContext() { if (instance == null) throw new IllegalStateException("this application does not inherit com.kakao.GlobalApplication"); return instance; }
protected static class KakaoSDKAdapter extends KakaoAdapter { /** * Session Config에 대해서는 default값들이 존재한다. * 필요한 상황에서만 override해서 사용하면 됨. * * @return Session의 설정값. */ @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()); }
}
|
activity_kakao_login.xml
<?xml version="1.0" encoding="utf-8"?> <FrameLayout 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" tools:context=".SampleLoginActivity">
<com.kakao.usermgmt.LoginButton android:id="@+id/com_kakao_login" android:layout_width="300dp" android:layout_height="wrap_content" android:layout_marginLeft="20dp" android:layout_marginRight="20dp" android:layout_marginTop="250dp" android:layout_marginBottom="30dp" android:layout_weight="1"/>
</FrameLayout>
|
LoginActivity.java
package com.link2me.android.auth_kakao;
import android.content.Context; import android.content.Intent; import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
import com.kakao.auth.ISessionCallback; import com.kakao.auth.Session; import com.kakao.util.exception.KakaoException; import com.kakao.util.helper.log.Logger;
public class LoginActivity extends AppCompatActivity { static final String TAG = LoginActivity.class.getSimpleName(); Context mContext; private SessionCallback callback; /** * 로그인 버튼을 클릭 했을시 access token을 요청하도록 설정한다. * * @param savedInstanceState 기존 session 정보가 저장된 객체 */
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mContext = LoginActivity.this;
callback = new SessionCallback(); Session.getCurrentSession().addCallback(callback); Session.getCurrentSession().checkAndImplicitOpen(); }
@Override protected void onActivityResult(int requestCode, int resultCode, 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() { redirectSignupActivity(); } @Override public void onSessionOpenFailed(KakaoException exception) { if (exception != null) { Logger.e(exception); } } }
protected void redirectSignupActivity() { final Intent intent = new Intent(this, MainActivity.class); startActivity(intent); finish(); }
}
|
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:orientation="vertical" tools:context=".MainActivity">
<TextView android:id="@+id/tv_signup" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="center" android:gravity="center" android:layout_marginTop="50dp" android:textSize="14sp" android:text="SignupActivity" />
<Button android:id="@+id/btn_logout" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:gravity="center" android:layout_marginTop="20dp" android:text="Logout"/>
</LinearLayout> |
MainActivity.java
package com.link2me.android.auth_kakao;
import android.content.DialogInterface; import android.content.Intent; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.TextView;
import androidx.appcompat.app.AlertDialog; import androidx.appcompat.app.AppCompatActivity;
import com.kakao.network.ErrorResult; import com.kakao.usermgmt.UserManagement; import com.kakao.usermgmt.callback.LogoutResponseCallback; import com.kakao.usermgmt.callback.MeV2ResponseCallback; import com.kakao.usermgmt.callback.UnLinkResponseCallback; import com.kakao.usermgmt.response.MeV2Response; import com.kakao.util.helper.log.Logger;
import java.util.ArrayList; import java.util.List;
public class MainActivity extends AppCompatActivity { static final String TAG = MainActivity.class.getSimpleName();
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);
TextView textView = findViewById(R.id.tv_signup); textView.setText("로그인 성공"); requestMe();
Button logout_btn = findViewById(R.id.btn_logout); logout_btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { onClickLogout(); } }); }
private void onClickLogout() { UserManagement.getInstance().requestLogout(new LogoutResponseCallback() { @Override public void onCompleteLogout() { redirectLoginActivity(); } }); }
private void redirectLoginActivity() { final Intent intent = new Intent(this, LoginActivity.class); startActivity(intent); finish(); }
private void requestMe() { // https://developers.kakao.com/apps/361201/settings/user // 앱 생성된 이름 선택(테스트 앱) → 사용자 관리 → 접근권한관리항목 설정 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) { redirectLoginActivity(); }
@Override public void onSuccess(MeV2Response response) { Log.e(TAG,"user id : " + response.getId()); Log.e(TAG,"nickname : " + response.getNickname()); Log.e(TAG,"email: " + response.getKakaoAccount().getEmail()); //Logger.d("profile image: " + response.getKakaoAccount().getProfileImagePath()); //redirectMainActivity(); }
}); }
private void onClickUnlink() { // 앱 연결 해제는 카카오 플랫폼에 연결된 사용자와 앱의 연결을 영구 해제함으로서 일반적으로 사용자가 앱 탈퇴 요청을 하는 경우와 비슷하다. // 앱 연결 해제가 수행된 사용자는 영구적으로 복구가 불가능하며 카카오 플랫폼 서비스를 더이상 사용할 수 없다. // 단, 다시 앱 연결을 통해 새로운 데이터로 카카오 플랫폼 서비스를 이용할 수는 있다. final String appendMessage = getString(R.string.com_kakao_confirm_unlink); new AlertDialog.Builder(this) .setMessage(appendMessage) .setPositiveButton(getString(R.string.com_kakao_ok_button), new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { UserManagement.getInstance().requestUnlink(new UnLinkResponseCallback() { @Override public void onFailure(ErrorResult errorResult) { Logger.e(errorResult.toString()); }
@Override public void onSessionClosed(ErrorResult errorResult) { redirectLoginActivity(); }
@Override public void onNotSignedUp() { LoginActivity loginActivity = new LoginActivity(); loginActivity.redirectSignupActivity(); }
@Override public void onSuccess(Long userId) { redirectLoginActivity(); } }); dialog.dismiss(); } }) .setNegativeButton(getString(R.string.com_kakao_cancel_button), new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); } }).show();
}
}
|
소스코드
- src/main/res/values/strings.xml 을 수정한다.
<string name="kakao_app_key">본인의 앱 키를 적으세요</string>
auth_kakao.zip