12. Android 카카오톡 인터넷창 로그인 오류 ID 1062548

Android 12 버전 사용하고 있고 ID 1062548입니다.


이 부분까지는 잘 뜨는데 이 부분에서 동의하고 계속하기가 클릭되지 않습니다.
(웹뷰에서 동의하고 계속하기가 클릭이 되지 않을 뿐 아니라, 카카오톡이 깔려있는 핸드폰의 경우에는 카톡으로 실행이 된후에 로그인이 되는 것이 아니라 웹뷰로 들어가서 저 화면이 뜨고 로그인이 실행이 안됩니다.

<activity
            android:name=".ui.login.SplashScreenActivity"
            android:exported="true"
            android:theme="@style/Base.Theme.SplashScreen.Unipiece">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
            <intent-filter>
                <data
                    android:host="oauth"
                    android:scheme="${NATIVE_APP_KEY}" />
            </intent-filter>
        </activity>

이렇게 사용을 했다가 redirect url??? 문제인 것 같다고 해서

<activity
            android:name=".ui.login.SplashScreenActivity"
            android:exported="true"
            android:theme="@style/Base.Theme.SplashScreen.Unipiece">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name="com.kakao.sdk.auth.AuthCodeHandlerActivity"
            android:exported="true"
            android:launchMode="singleTask">
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.BROWSABLE" />

                <data
                    android:host="oauth"
                    android:scheme="${NATIVE_APP_KEY}" />
            </intent-filter>
        </activity>
<queries>
        <package android:name="com.kakao.talk" />
    </queries>

</manifest>

이렇게도 고쳐봤는데 수행이 안됩니다.

혹시 몰라 로그인 코드까지 첨부합니다.

private fun kakaoLogin(){
        val TAG = "test1234"

        //kakaoSDK 초기화
        KakaoSdk.init(requireActivity(), BuildConfig.KAKAO_API_KEY)

        //카카오 계정으로 로그인 공통 callback 구성
        val callback: (OAuthToken?, Throwable?) -> Unit = { token, error ->
            if (error != null) {
                Log.e(TAG, "카카오계정으로 로그인 실패", error)
            } else if (token != null) {
                Log.i(TAG, "카카오계정으로 로그인 성공 ${token.accessToken}")
            }
        }

         // 카카오톡이 설치되어 있으면 카카오톡으로 로그인, 아니면 카카오계정으로 로그인
        if (UserApiClient.instance.isKakaoTalkLoginAvailable(requireActivity())) {
            UserApiClient.instance.loginWithKakaoTalk(requireActivity()) { token, error ->
                if (error != null) {
                    Log.e(TAG, "카카오톡으로 로그인 실패", error)

                    // 사용자가 카카오톡 설치 후 디바이스 권한 요청 화면에서 로그인을 취소한 경우,
                    // 의도적인 로그인 취소로 보고 카카오계정으로 로그인 시도 없이 로그인 취소로 처리 (예: 뒤로 가기)
                    if (error is ClientError && error.reason == ClientErrorCause.Cancelled) {
                        return@loginWithKakaoTalk
                    }
                    // 카카오톡에 연결된 카카오계정이 없는 경우, 카카오계정으로 로그인 시도
                    UserApiClient.instance.loginWithKakaoAccount(requireActivity(), callback = callback)
                    //Log.d("seonguk1234", Utility.getKeyHash(requireActivity()))
                } else if (token != null) {
                    Log.i(TAG, "카카오톡으로 로그인 성공 ${token.accessToken}")

                    // 로그인한 사용자 정보를 가져온다.
                    // 이 때 accessToken 을 카카오 서버로 전달해야 해야하는데 알아서해준다.
                    UserApiClient.instance.me { user, error ->
                        if (error != null) {
                            Log.e(TAG, "사용자 정보를 가져오는데 실패하였습니다", error)
                        } else if (user != null) {

                            viewLifecycleOwner.lifecycleScope.launch(Dispatchers.Main) {
                                checkUserId = viewModel.checkUserId(user.kakaoAccount?.email?:"")

                                if (checkUserId != false){

                                    val dialog = NicknameDialog("닉네임을 입력해주세요")
                                    dialog.setNicknameButtonClickListener(object : NicknameDialog.dialogButtonClickListener{
                                        override fun nicknameOkButton() {
                                            val nickname = dialog.binding.nickNameDialog.text.toString()
                                            val userId = user.kakaoAccount?.email?:""
                                            val name = user.kakaoAccount?.name?:""
                                            val phoneNumber = user.kakaoAccount?.phoneNumber?:""
                                            val userPwd = user.id.toString()

                                            viewModel.insertUserData(name, nickname, phoneNumber, userId, userPwd,true){success ->
                                                if (success){
                                                    viewLifecycleOwner.lifecycleScope.launch {
                                                        val userInfo = viewModel.getUserDataByUserId(userId)

                                                        val newIntent = Intent(requireActivity(), MainActivity::class.java)
                                                        UniPieceApplication.prefs.setUserIdx("userIdx", userInfo!!.userIdx)
                                                        UniPieceApplication.prefs.setAutoLogin("userId", userInfo.userId)
                                                        startActivity(newIntent)
                                                    }
                                                }
                                            }
                                        }

                                        override fun nicknameNoButton() {

                                        }

                                    })
                                    dialog.show(parentFragmentManager, "NicknameDialog")

                                }else{
                                    viewLifecycleOwner.lifecycleScope.launch {
                                        val userInfo = viewModel.getUserDataByUserId(user.kakaoAccount?.email?:"")
                                        val newIntent = Intent(requireActivity(), MainActivity::class.java)
                                        UniPieceApplication.prefs.setUserIdx("userIdx", userInfo!!.userIdx)
                                        UniPieceApplication.prefs.setAutoLogin("userId", userInfo.userId)
                                        startActivity(newIntent)
                                        requireActivity().finish()
                                    }
                                }
                            }
                        }
                    }
                }
            }
        } else {
            UserApiClient.instance.loginWithKakaoAccount(requireActivity(), callback = callback)
        }
    }

안녕하세요.

필수 동의 항목에 동의 해야만 하단 “동의하고 계속하기” 버튼이 노란색으로 활성화 됩니다.
전체 동의 하기 체크박스를 선택해 보시겠어요?

1개의 좋아요

체크후에 동의하고 계속하기 노란색으로 활성화 후에 클릭을 해도 버튼이 눌리지 않습니다…!

아래 내용 확인 부탁드립니다.

  1. SplashScreenActivity 에서 oauth intent-filter 제거
    AuthCodeHandlerActivity가 처리해야 합니다.

  2. AuthCodeHandlerActivity의 scheme 설정 확인

<data android:host="oauth"
                android:scheme="${NATIVE_APP_KEY}" />
=>
<data android:host="oauth"
                android:scheme="kakao${NATIVE_APP_KEY}" />

이렇게 수정해서 해봤는데도 되지 않습니다…!
그리고 “kakao${NATIVE_APP_KEY}” 이렇게 안 했던 이유가 로컬 프로퍼티에 kakao~~~ 까지 같이 저장을 해서 따로 하지 않았던 것입니다!

        <activity
            android:name=".ui.login.SplashScreenActivity"
            android:exported="true"
            android:theme="@style/Base.Theme.SplashScreen.Unipiece">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name="com.kakao.sdk.auth.AuthCodeHandlerActivity"
            android:exported="true"
            android:launchMode="singleTask">
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.BROWSABLE" />
                <data
                    android:host="oauth"
                    android:scheme="kakao${NATIVE_APP_KEY}" />
            </intent-filter>
        </activity>

프로젝트 구성에 원인이 있을것 같은데요
디벨로퍼스에서 제공되는 샘플 프로젝트와 구성 비교 확인 부탁드립니다.

https://developers.kakao.com/docs/latest/ko/android/download

추가로 SDK 초기화가 앱 시작 위치가 아닌 로그인 위치에 있는데요
안드로이드 프로젝트 설정 가이드에 따라 설정 부탁드립니다.

https://developers.kakao.com/docs/latest/ko/android/getting-started

init 초기화를 앱 시작 위치에서 해주었고, 설정 가이드에 따라 해주었는데도 카카오톡 앱이 안 깔려있으면 인터넷에서 로그인을 해주는데 동의하고 계속하기에서 안 넘어갑니다…

androidMenifest에 잘 설정하셨고, 코드상 init이 되었으며 해당 빌드환경 키해시가 디벨로퍼스앱 설정에 등록되어 있다면
동의창 동의 후, 개발하신 앱으로 돌아가야합니다.

개발하시는 환경 문제인지 확인을 위해
아래 최신 버전 예제로 정상작동 확인 부탁드려요.

다운로드 | Kakao Developers 다운로드

샘플 앱을 돌렸을때는 동의창 동의 후에 개발한 앱으로 돌아갑니다. 하지만 저희 앱에서는 버튼이 노란색으로 활성화 되어도, 동의창 동의 버튼이 클릭되지 않고, 앱으로 돌아오지 않습니다.

안녕하세요.

샘플앱과의 구현상 차이점이 있는 것으로 보입니다.
AuthCodeHandlerActivity 에서 android:launchMode=“singleTask” 부분은 제외 부탁드립니다.

singleTask를 제외했는데도 되지 않습니다…!

 <activity
            android:name="com.kakao.sdk.auth.AuthCodeHandlerActivity"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.BROWSABLE" />

                <data
                    android:host="oauth"
                    android:scheme="${NATIVE_APP_KEY}" />
            </intent-filter>
        </activity>

AndroidManifest.xml 전체 내용 공유 부탁드립니다.

NATIVE_APP_KEY 부분에 kakao${app_key} 형태의 상수를 직접 넣었을 때는 정상동작하는지도 확인 부탁드리겠습니다.

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">

    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.ACCESS_MEDIA_LOCATION" />
    <uses-permission android:name="android.permission.INTERNET" />

    <application
        android:name=".UniPieceApplication"
        android:allowBackup="true"
        android:dataExtractionRules="@xml/data_extraction_rules"
        android:fullBackupContent="@xml/backup_rules"
        android:icon="@mipmap/ic_main_logo"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_main_logo_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.UniPiece"
        android:usesCleartextTraffic="true"
        tools:targetApi="31">
        <activity
            android:name=".ui.payment.SearchAddressActivity"
            android:exported="false" />
        <activity
            android:name=".ui.mypage.FollowActivity"
            android:exported="false" />
        <activity
            android:name=".ui.payment.DeliveryActivity"
            android:exported="false" />
        <activity
            android:name=".ui.payment.OrderActivity"
            android:exported="false" />
        <activity
            android:name=".ui.payment.CartActivity"
            android:exported="false" />
        <activity
            android:name=".ui.buy.BuyDetailActivity"
            android:exported="false" />
        <activity
            android:name=".ui.author.AuthorInfoActivity"
            android:exported="false" />
        <activity
            android:name=".ui.mygallery.SalesApplicationActivity"
            android:exported="false"
            android:theme="@style/Theme.Material3" />
        <activity
            android:name=".ui.mypage.VisitGalleryActivity"
            android:exported="false" />
        <activity
            android:name=".ui.infomation.InfoAllActivity"
            android:exported="false" />
        <activity
            android:name=".ui.infomation.InfoOneActivity"
            android:exported="false" />
        <activity
            android:name=".ui.mygallery.PurchasedPieceDetailActivity"
            android:exported="false"
            android:theme="@style/Theme.Material3" />
        <activity
            android:name=".ui.mypage.UserInfoActivity"
            android:exported="false" />
        <activity
            android:name=".ui.author.UpdateAuthorActivity"
            android:exported="false" />
        <activity
            android:name=".ui.author.AddAuthorActivity"
            android:exported="false" />
        <activity
            android:name=".ui.MainActivity"
            android:exported="false" >
            <!--<intent-filter>
                <action android:name="android.intent.action.VIEW" />
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.BROWSABLE" />
                <data
                    android:host="oauth"
                    android:scheme="${NATIVE_APP_KEY}" />
            </intent-filter>-->
        </activity>
        <activity
            android:name=".ui.login.LoginActivity"
            android:exported="false" >
            <!--<intent-filter>
                <action android:name="android.intent.action.VIEW" />
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.BROWSABLE" />
                <data
                    android:host="oauth"
                    android:scheme="${NATIVE_APP_KEY}" />
            </intent-filter>-->
        </activity>
        <activity
            android:name=".ui.login.SplashScreenActivity"
            android:exported="true"
            android:theme="@style/Base.Theme.SplashScreen.Unipiece">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name="com.kakao.sdk.auth.AuthCodeHandlerActivity"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.BROWSABLE" />

                <data
                    android:host="oauth"
                    android:scheme="${NATIVE_APP_KEY}" />
            </intent-filter>
        </activity>
        <!-- 촬영한 사진을 저장하는 프로바이더 -->
        <provider
            android:name="androidx.core.content.FileProvider"
            android:authorities="kr.co.lion.unipiece.file_provider"
            android:exported="false"
            android:grantUriPermissions="true">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/file_path" />
        </provider>
    </application>

</manifest>

입니다!

local properties에 kakao~~~~이런식으로 붙였는데 kakao${app_key}로 해야할까요??

네 맞습니다. 접미어 kakao 가 있어야만 합니다.
번거로우시겠지만, 정확한 확인을 위해 리소스 참조하지 마시고 xml에 앱 키를 직접 입력하시어 확인 부탁드립니다.

직접 넣으면 로그인이 되네요…! 혹시 리소스를 참조했을때는 로그인이 안되는 이유가 있을까요?

지금까지의 내용만으로는 어떻게 리소스 참조하도록 구현하셨는지를 알 수 없어서 정확한 원인 파악은 어려울 것 같습니다.
리소스 참조가 제대로 되고 있는지부터 확인해보시는게 도움이 될 것 같아요