카카오링크 API를 이용해 메시지를 전송하려고 합니다만.. null 이라고 나옵니다 ㅠ

안녕하세요 초보 안드로이드 개발자 입니다.

안드로이드 스튜디오를 이용해 카카오링크 API를 사용해보려는데요

특정 이미지를 누르면 카카오 친구리스트가 뜨고, 준비해둔 메시지를 전송하려고 합니다.

여기에 나와있는대로
https://developers.kakao.com/docs/latest/ko/message/android-link#create-message
기본 템플릿으로 메시지 보내기를 따라해보고 있습니다만… 뭔가 잘못한것 같은데 뭔지 모르겠습니다 ㅠ

아래는 설명에 나온 GlobalApplication 에 SDK 초기화 부분이구요, sendKakaoMessage 함수를 열면 onCreate에 다 때려박으면 어찌 메시지는 보내지기는 합니다… 하지만 뭔가 이상하다는건 알고있습니다 Application에 구현하는게 아닌것 같아서요

해서 아래에 sendKakao 클래스를 만들었고, 특정 액티비티에서 이미지를 터지할시 리스너를 통해 작동시키려 합니다만
아래와 같은 오류메시지가 발생합니다

 D/SendKakao: 카카오링크 보내기 성공 Intent
 E/SendKakao: 카카오링크 보내기 실패
'android.app.ActivityThread$ApplicationThread android.app.ActivityThread.getApplicationThread()' on a null object reference

메시지에 따르면, 아래 sendKakaoMessage 함수의 startActivity(linkResult.intent) 부분이 문제가 있다고 합니다만 잘 모르겠습니다 ㅠ

아래에 코드 부분 붙여두었습니다. 어제부터 계속 붙잡고 있던 문제라ㅠ 뭘 어떻게 해야할지 모르겠습니다. 알려주시면 감사하겠습니다.

class KakaoApplication : Application() {
    val TAG : String = "KakaoApplication"

    override fun onCreate() {
        super.onCreate()

        var context : Context = applicationContext

        // kakao SDK 초기화
        KakaoSdk.init(this, "c205ec19xxxxxxd5161xxxxxxxxx3d815" );

        //sendKakaoMessage(context)
    }

Activity.class

       mIvKakaoTalk.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //mSendKakao = new SendKakao();
                //mSendKakao.sendKakaoMessage(mContext);

                //Intent intent = new Intent(mContext, SendKakao.class);
                //mContext.startActivity(intent);
            }
        });

SendKakao.calss

class SendKakao : AppCompatActivity() {

    var TAG : String = "SendKakao"

    fun sendKakaoMessage(context : Context) {

        val defaultFeed = TextTemplate(
            text = """
        카카오링크는 카카오 플랫폼 서비스의 대표 기능으로써 사용자의 모바일 기기에 설치된 카카오 플랫폼과 연동하여 다양한 기능을 실행할 수 있습니다.
        현재 이용할 수 있는 카카오링크는 다음과 같습니다.
        카카오톡링크
        카카오톡을 실행하여 사용자가 선택한 채팅방으로 메시지를 전송합니다.
        카카오스토리링크
        카카오스토리 글쓰기 화면으로 연결합니다.
    """.trimIndent(),
            link = Link(
                webUrl = "https://developers.kakao.com",
                mobileWebUrl = "https://developers.kakao.com"
            )
        )

        // 피드 메시지 보내기

// 카카오톡 설치여부 확인
        if (LinkClient.instance.isKakaoLinkAvailable(context)) {
            // 카카오톡으로 카카오링크 공유 가능
            LinkClient.instance.defaultTemplate(context, defaultFeed) { linkResult, error ->
                if (error != null) {
                    Log.e(TAG, "카카오링크 보내기 실패", error)
                }
                else if (linkResult != null) {
                    Log.d(TAG, "카카오링크 보내기 성공 ${linkResult.intent}")
                    startActivity(linkResult.intent)

                    // 카카오링크 보내기에 성공했지만 아래 경고 메시지가 존재할 경우 일부 컨텐츠가 정상 동작하지 않을 수 있습니다.
                    Log.w(TAG, "Warning Msg: ${linkResult.warningMsg}")
                    Log.w(TAG, "Argument Msg: ${linkResult.argumentMsg}")
                }
            }
        } else {
            // 카카오톡 미설치: 웹 공유 사용 권장
            // 웹 공유 예시 코드
            val sharerUrl = WebSharerClient.instance.defaultTemplateUri(defaultFeed)

            // CustomTabs으로 웹 브라우저 열기

            // 1. CustomTabs으로 Chrome 브라우저 열기
            try {
                KakaoCustomTabsClient.openWithDefault(context, sharerUrl)
            } catch(e: UnsupportedOperationException) {
                // Chrome 브라우저가 없을 때 예외처리
            }

            // 2. CustomTabs으로 디바이스 기본 브라우저 열기
            try {
                KakaoCustomTabsClient.open(context, sharerUrl)
            } catch (e: ActivityNotFoundException) {
                // 인터넷 브라우저가 없을 때 예외처리
            }
        }
    }
}

안녕하세요~

Activity 클래스의 onClick 리스너 코드가 잘 이해가 가지 않는데요, 구현하신 Activity 클래스가 SendKakao 클래스의 인스턴스를 가지고 있는 구조인가요?

안녕하세요!!ㅠ 답변 감사합니다 :slight_smile:

public class WhoActivity extends AppCompatActivity {

    ImageView mIvKakaoTalk;
    ImageView mIvSms;
    String name;
    String number;
    Context mContext;
    KakaoApplication mKakaoApplication;
    SendKakao mSendKakao;
    KakaoLinkIntentClient

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_who);
        mContext = getApplicationContext();

        mIvKakaoTalk = findViewById(R.id.who_kakao);
        mIvSms = findViewById(R.id.who_sms);

        mIvSms.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(Intent.ACTION_PICK);
                intent.setData(ContactsContract.CommonDataKinds.Phone.CONTENT_URI);
                startActivityForResult(intent, 0);
            }
        });

        mIvKakaoTalk.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mSendKakao = new SendKakao();
                mSendKakao.sendKakaoMessage(mContext);

                //Intent intent = new Intent(mContext, SendKakao.class);
                //mContext.startActivity(intent);
            }
        });
    }

이렇게 만들었습니다

SendKakao 클래스는 별도의 화면이 없나요? 안드로이드 프레임워크에서 Activity는 new 키워드를 사용해서 객체를 생성하는 것이 아니라 Intent 를 사용해서 startActivity 메서드 등을 사용해서 뷰를 생성할 때만 정상적으로 동작합니다.

앱의 동선을 어떻게 구성하려고 하시는건지 정확히 이해하지는 못했는데요, 혹시 카카오링크 기능을 WhoActivity에서 구현하면 안되는 상황인가요?

whoactivity에서 구현해도 됩니다

카카오링크 api 설명 부분이 코틀린으로 되어있어서 새로 클래스를 만들어 접근하디보니 액티비티를 만들어 인텐트로 불러오려 하였습니다

sendKakao 클래스의 따로 xml 파일로 만들어진 화면은 없습니다

답변 정말 감사합니다 ㅠㅠ

1개의 좋아요

아 네네 WhoActivity에서 구현해보시고 카카오링크 동작에 문제 생기면 언제든 문의주세요~

헐… WhoActivity.kt에 구현했더니 멀쩡히 되네요… 감사합니다. 위에 달아주신 activity는 new로 객체가 생성이 되지 않는다는 말씀 무슨 말인지 이해하였습니다 ㅎㅎ

잘 돌아가긴 하는데 제가 현재 '디버그키’로 카카오링크 API를 사용중입니다만,

친구 선택해서 메시지를 보내면 실제로 메시지가 전송되는것으로

제 화면엔 나오는데,

친구에게는 안나오는거죠?

디버그 키로 메시지를 보냈어도 실제로 메시지가 전송됩니다.

디버그 키와 릴리즈 키는 앱이 개발 중인 상태인지, 출시된 상태인지를 구분하기 위한 키 값으로 실제 앱의 동작에 영향을 미치는 값은 아닙니다. (외부 API를 호출하는 경우에는 앱의 동작에 영향이 있을 수 있습니다 참고)

앱 서명에 대한 자세한 내용은 해당 문서를 읽어보시면 도움이 될 것 같아요.

디버그 키로 보내도 친구도 해당 메시지를 받게 되나요??

지금 시험삼아 해볼때 보낸핸드폰에는 메시지 보낸 내용이 있는데

받는 폰에는 메시지가 없는 상태로 나옵니다 ㅠ 뭘 잘 못 만진것 같은데…

아래와 같이 코틀린으로 WhoActivity에 한번에 처리했습니다 뭘 잘못 한걸까요 ㅠ

class WhoActivity : AppCompatActivity() {
    val TAG : String = "WhoActivity_kotlin"
    var name: String? = null
    var number: String? = null
    var mKakaoApplication: KakaoApplication? = null
    var mSendKakao: SendKakao? = null

    @Override
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_who)
        var mContext: Context? = null

        mContext = applicationContext
        var mIvSms: ImageView? = null
        var mIvKakaoTalk: ImageView? = null

        mIvKakaoTalk = findViewById<ImageView>(R.id.who_kakao)
        mIvSms = findViewById<ImageView>(R.id.who_sms)

        mIvSms.setOnClickListener{
            val intent = Intent(Intent.ACTION_PICK)
            intent.data = ContactsContract.CommonDataKinds.Phone.CONTENT_URI
            startActivityForResult(intent, 0)
        }

        mIvKakaoTalk.setOnClickListener(View.OnClickListener {
            sendKakaoMessage(mContext)

            //Intent intent = new Intent(mContext, SendKakao.class);
            //mContext.startActivity(intent);
        })
    }

    fun sendKakaoMessage(context : Context) {

        val defaultFeed = TextTemplate(
            text = """
        카카오링크는 카카오 플랫폼 서비스의 대표 기능으로써 사용자의 모바일 기기에 설치된 카카오 플랫폼과 연동하여 다양한 기능을 실행할 수 있습니다.
        현재 이용할 수 있는 카카오링크는 다음과 같습니다.
        카카오톡링크
        카카오톡을 실행하여 사용자가 선택한 채팅방으로 메시지를 전송합니다.
        카카오스토리링크
        카카오스토리 글쓰기 화면으로 연결합니다.
    """.trimIndent(),
            link = Link(
                webUrl = "https://developers.kakao.com",
                mobileWebUrl = "https://developers.kakao.com"
            )
        )

        // 피드 메시지 보내기

// 카카오톡 설치여부 확인
        if (LinkClient.instance.isKakaoLinkAvailable(context)) {
            // 카카오톡으로 카카오링크 공유 가능
            LinkClient.instance.defaultTemplate(context, defaultFeed) { linkResult, error ->
                if (error != null) {
                    Log.e(TAG, "카카오링크 보내기 실패", error)
                }
                else if (linkResult != null) {
                    Log.d(TAG, "카카오링크 보내기 성공 ${linkResult.intent}")
                    startActivity(linkResult.intent)

                    // 카카오링크 보내기에 성공했지만 아래 경고 메시지가 존재할 경우 일부 컨텐츠가 정상 동작하지 않을 수 있습니다.
                    Log.w(TAG, "Warning Msg: ${linkResult.warningMsg}")
                    Log.w(TAG, "Argument Msg: ${linkResult.argumentMsg}")
                }
            }
        } else {
            // 카카오톡 미설치: 웹 공유 사용 권장
            // 웹 공유 예시 코드
            val sharerUrl = WebSharerClient.instance.defaultTemplateUri(defaultFeed)

            // CustomTabs으로 웹 브라우저 열기

            // 1. CustomTabs으로 Chrome 브라우저 열기
            try {
                KakaoCustomTabsClient.openWithDefault(context, sharerUrl)
            } catch(e: UnsupportedOperationException) {
                // Chrome 브라우저가 없을 때 예외처리
            }

            // 2. CustomTabs으로 디바이스 기본 브라우저 열기
            try {
                KakaoCustomTabsClient.open(context, sharerUrl)
            } catch (e: ActivityNotFoundException) {
                // 인터넷 브라우저가 없을 때 예외처리
            }
        }


    }

}

혹시 해당 현상을 카톡을 보내는 쪽 디바이스에서 동영상 녹화해서 첨부 가능할까요?

잘 됩니다 ㅎㅎ
답장이 늦어 죄송합니다 ㅠ
다시 연결하고 다른 부분 구현하느라 확인을 못했습니다

처음엔 안되다가 어느순간 갑자기 됩니다
왜인지는 모르겠네요 ㅠ 딱히 바꾼게 없었는데…

1개의 좋아요