Today's

길을 나서지 않으면 그 길에서 만날 수 있는 사람을 만날 수 없다

모바일 앱(안드로이드)

안드로이드 앱 만들기. 카카오 API V2 로 이전

Billcorea 2022. 3. 21. 22:17
반응형

예전 부터 만들어 관리하던 앱이 있는데...  알림을 카카오톡을 보내주는 ... 카카오에서 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(InitActivity.this)) {
    UserApiClient.getInstance().loginWithKakaoTalk(InitActivity.this, 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(InitActivity.this));
    UserApiClient.getInstance().loginWithKakaoAccount(InitActivity.this, 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;
        }
    });
};

** 2022.03.24 수정 : 위 소스에서 getApplicationContext() 에서 InitActivity.this 로 수정함.

** getApplicationContext() 에 파라미터를 전달하게 되면 정상적으로 실행이 되지 않는 현상이 발견됨.

 

내폰에서 카카오톡으로 로그인이 가능한 상태 인지를 확인해 보고 가능 하다면 단순 로그인이 지원이 되고 그렇지 않을 떄면 예전 처럼 계정으로 로그인을 시도 하도록 구성할 수 있다는 차이가 생겼다.

 

친구 목록을 받아오는 방법은

 

변경전

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 등은 변경을 했지만... 훨씬 간결하게 코드를 구현할 수 있게 된 것 같다.

 

이제 안드로이드 패치가 되어도 더는 고민할 이유가 없어졌다.

 

로그인 실행된 샘플 이미지는 다음과 같이...

로그인 하기

 

반응형