원본출처: 티스토리 바로가기
예전 부터 만들어 관리하던 앱이 있는데... 알림을 카카오톡을 보내주는 ... 카카오에서 api 을 upgrade 하고 있어서 나도 해 보기로 했다.
먼저 gradle 파일의 변화
변경전
implementation group: project.KAKAO_SDK_GROUP, name: 'usermgmt', version: project.KAKAO_SDK_VERSION implementation group: project.KAKAO_SDK_GROUP, name: 'kakaotalk', version: project.KAKAO_SDK_VERSION implementation group: project.KAKAO_SDK_GROUP, name: 'friends', version: project.KAKAO_SDK_VERSION
변경후
implementation "com.kakao.sdk:v2-user:2.9.0" // 카카오 로그인 implementation "com.kakao.sdk:v2-talk:2.9.0" // 친구, 메시지(카카오톡) implementation "com.kakao.sdk:v2-story:2.9.0" // 카카오스토리 implementation "com.kakao.sdk:v2-link:2.9.0" // 메시지(카카오링크) implementation "com.kakao.sdk:v2-navi:2.9.0" // 카카오내비
이제 로그인 시도해 보는 방법의 차이
변경전에는 제공된 login activity 을 이용해서 login 을 시도 하면 계정으로 로그인하는 것만을 지원했다면...
변경후에는
if (UserApiClient.getInstance().isKakaoTalkLoginAvailable(getApplicationContext())) { UserApiClient.getInstance().loginWithKakaoTalk(getApplicationContext(), new Function2<OAuthToken, Throwable, Unit>() { @Override public Unit invoke(OAuthToken oAuthToken, Throwable throwable) { if (throwable != null) { Log.e(TAG, throwable.getMessage()); return null; } else { Intent intent = new Intent(InitActivity.this, MonthlyMain.class); startActivity(intent); finish(); } return null; } }); } else { Log.e(TAG, "keyHash=" + Utility.INSTANCE.getKeyHash(getApplicationContext())); UserApiClient.getInstance().loginWithKakaoAccount(getApplicationContext(), prompts, new Function2<OAuthToken, Throwable, Unit>() { @Override public Unit invoke(OAuthToken oAuthToken, Throwable throwable) { Log.e(TAG, oAuthToken.getAccessToken()); if (throwable != null) { Log.e(TAG, throwable.getMessage()); return null; } else { Intent intent = new Intent(InitActivity.this, MonthlyMain.class); startActivity(intent); finish(); } return null; } }); };
내폰에서 카카오톡으로 로그인이 가능한 상태 인지를 확인해 보고 가능 하다면 단순 로그인이 지원이 되고 그렇지 않을 떄면 예전 처럼 계정으로 로그인을 시도 하도록 구성할 수 있다는 차이가 생겼다.
친구 목록을 받아오는 방법은
변경전
AppFriendContext friendContext = new AppFriendContext( AppFriendOrder.NICKNAME, 0, 100, "asc"); KakaoTalkService.getInstance().requestAppFriends(friendContext, new TalkResponseCallback<AppFriendsResponse>() { @Override public void onNotKakaoTalkUser() { // 발신자가 카카오톡 유저가 아님 Log.e(TAG, "onNotKakaoTalkUser") ; } @Override public void onFailure(ErrorResult errorResult) { // 그 외 에러 Log.e(TAG, "getErrorMessage =" + errorResult.getErrorMessage()); Log.e(TAG, "getErrorCode =" + errorResult.getErrorCode()); Log.e(TAG, "getHttpStatus =" + errorResult.getHttpStatus()); Log.e(TAG, "errorResult =" + errorResult.toString()); kakaoToast.makeToast(StrValueAdd.this, errorResult.getErrorMessage(), Toast.LENGTH_LONG).show(); } @Override public void onSessionClosed(ErrorResult errorResult) { // 액세스토큰 및 리프레시토큰이 만료됨. 재로그인 필요. Log.e(TAG, "onSessionClosed" ) ; redirectLoginActivity() ; } @Override public void onSuccess(AppFriendsResponse result) { // context의 beforeUrl과 afterUrl이 업데이트 된 상태. appFriendInfos = result.getFriends(); adapter = new kakaoFriendinfoAdapter(appFriendInfos); listAppFriendInfo.setAdapter(adapter); appFriendCount = result.getTotalCount(); Log.e(TAG, "onSuccess " + result.getTotalCount()) ; if (!"".equals(strUUID)) { for(int i=0; i < appFriendCount ; i++) { if (strUUID.equals(appFriendInfos.get(i).getUUID())) { Log.e(TAG, strUUID + "/" + appFriendInfos.get(i).getUUID()) ; appFiendIndex = i; break ; } } if (appFriendInfos != null) { try { kakaoUserId.setText(appFriendInfos.get(appFiendIndex).getProfileNickname()); } catch (Exception e) { kakaoUserId.setText(""); } } else { kakaoUserId.setText(""); } } } });
변경후
TalkApiClient.getInstance().friends(new Function2<Friends<Friend>, Throwable, Unit>() { @Override public Unit invoke(Friends<Friend> friendFriends, Throwable throwable) { if (friendFriends != null) { appFriends = friendFriends; adapter = new kakaoFriendinfoAdapter(appFriends); listAppFriendInfo.setAdapter(adapter); appFriendCount = appFriends.getTotalCount(); Log.e(TAG, "onSuccess " + appFriends.getTotalCount()) ; if (!"".equals(strUUID)) { for(int i=0; i < appFriendCount ; i++) { if (strUUID.equals(appFriends.getElements().get(i).getUuid())) { Log.e(TAG, strUUID + "/" + appFriends.getElements().get(i).getUuid()) ; appFiendIndex = i; break ; } } try { kakaoUserId.setText(appFriends.getElements().get(appFiendIndex).getProfileNickname()); } catch (Exception e) { kakaoUserId.setText(""); } } else { kakaoUserId.setText(""); } } return null; } });
훨씬 소스의 길이가 간결해진다.
다음은 문자공유하는 sendMessage 의 차이
변경전
LinkObject link = LinkObject.newBuilder().setWebUrl("https://developers.kakao.com") .setMobileWebUrl("https://developers.kakao.com") .build(); TextTemplate params = TextTemplate.newBuilder(strBody, link) .setButtonTitle("OK").build(); if (!"".equals(rs.getString(5))) { List<String> uuids = Collections.singletonList(rs.getString(5)); KakaoTalkService.getInstance().sendMessageToFriends(uuids, params, new TalkResponseCallback<MessageSendResponse>() { @Override public void onNotKakaoTalkUser() { Log.e(TAG, " 발신자가 카카오톡 유저가 아님 "); } @Override public void onFailure(ErrorResult errorResult) { Log.e(TAG, " 그 외 에러 "); } @Override public void onSessionClosed(ErrorResult errorResult) { Log.e(TAG, " 액세스토큰 및 리프레시토큰이 만료됨. 재로그인 필요. "); } @Override public void onSuccess(MessageSendResponse result) { Log.e(TAG, "API 호출 성공. 일부 사용자에게는 전송이 실패했을 수 있음. "); kakaoToast.makeToast(context, strBody, Toast.LENGTH_LONG).show(); } }); } else { KakaoTalkService.getInstance().requestSendMemo(new TalkResponseCallback<Boolean>() { @Override public void onNotKakaoTalkUser() { Log.e(TAG, " 발신자가 카카오톡 유저가 아님 "); } @Override public void onSessionClosed(ErrorResult errorResult) { Log.e(TAG, " 그 외 에러 "); } @Override public void onSuccess(Boolean result) { Log.e(TAG, "API 호출 성공. 일부 사용자에게는 전송이 실패했을 수 있음. "); kakaoToast.makeToast(context, "To Me : " + strBody, Toast.LENGTH_LONG).show(); } }, params); }
변경후
Link link = new Link("http://billcorea.tistory.com","http://billcorea.tistory.com", null, null); TextTemplate textTemplate = new TextTemplate(strBody, link, null, "알림을 카톡으로"); if (!"".equals(rs.getString(5))) { List<String> uuids = Collections.singletonList(rs.getString(5)); TalkApiClient.getInstance().sendDefaultMessage(uuids, textTemplate, new Function2<MessageSendResult, Throwable, Unit>() { @Override public Unit invoke(MessageSendResult messageSendResult, Throwable throwable) { Log.e("context", messageSendResult.toString()); return null; } }); } else { TalkApiClient.getInstance().sendDefaultMemo(textTemplate, new Function1<Throwable, Unit>() { @Override public Unit invoke(Throwable throwable) { Log.e("context", "메모 등록"); return null; } }); }
수정하면서 url 등은 변경을 했지만... 훨씬 간결하게 코드를 구현할 수 있게 된 것 같다.
이제 안드로이드 패치가 되어도 더는 고민할 이유가 없어졌다.
이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.
댓글
댓글 쓰기