카카오링크 2번째 질문 귀찮개해서 정말 죄송해요 ㅜㅜ

06-14 05:29:39.296: E/AndroidRuntime(13780): android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?
06-14 05:29:39.296: E/AndroidRuntime(13780): at android.app.ContextImpl.startActivity(ContextImpl.java:1413)
06-14 05:29:39.296: E/AndroidRuntime(13780): at android.app.ContextImpl.startActivity(ContextImpl.java:1400)
06-14 05:29:39.296: E/AndroidRuntime(13780): at android.content.ContextWrapper.startActivity(ContextWrapper.java:323)
06-14 05:29:39.296: E/AndroidRuntime(13780): at com.kakao.kakaolink.KakaoLink.sendMessage(KakaoLink.java:122)
06-14 05:29:39.296: E/AndroidRuntime(13780): at com.example.testkakao.MainActivity$1.onClick(MainActivity.java:61)
06-14 05:29:39.296: E/AndroidRuntime(13780): at android.view.View.performClick(View.java:4630)
06-14 05:29:39.296: E/AndroidRuntime(13780): at android.view.View$PerformClick.run(View.java:19331)
06-14 05:29:39.296: E/AndroidRuntime(13780): at android.os.Handler.handleCallback(Handler.java:733)
06-14 05:29:39.296: E/AndroidRuntime(13780): at android.os.Handler.dispatchMessage(Handler.java:95)
06-14 05:29:39.296: E/AndroidRuntime(13780): at android.os.Looper.loop(Looper.java:157)
06-14 05:29:39.296: E/AndroidRuntime(13780): at android.app.ActivityThread.main(ActivityThread.java:5356)
06-14 05:29:39.296: E/AndroidRuntime(13780): at java.lang.reflect.Method.invokeNative(Native Method)
06-14 05:29:39.296: E/AndroidRuntime(13780): at java.lang.reflect.Method.invoke(Method.java:515)
06-14 05:29:39.296: E/AndroidRuntime(13780): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1265)
06-14 05:29:39.296: E/AndroidRuntime(13780): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081)
06-14 05:29:39.296: E/AndroidRuntime(13780): at dalvik.system.NativeStart.main(Native Method)

android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?
→ 런타임 애러가 떳구요

com.example.testkakao.MainActivity$1.onClick(MainActivity.java:61)
06-14 05:29:39.296: E/AndroidRuntime(13780): at

sendmessge 하는 부분에서 에러가 발생했는데요.

진짜 여기저기 다 찾아보고 카카오톡 디벨로퍼 보면서 어찌저찌해서 따라해서 만들었는대요 온크리에이트에 선언해주고 버튼을 눌렀을때 제가 원하는 메세지를 받아서 카카오 빌드를 하고 마지만으로 링크로 샌드매세지로 보내라 라고 했는대 저런 에러가 뜨내요 … 혹시 스레드 안에서 처리해야 되는건가요?

@curuseid 가장 큰 참고를 하실 수 있는것은 SDK에 포함된 링크 샘플을 보시면 좀 더 도움이 되실것 같아요!

package com.gg.testlink;

import com.kakao.kakaolink.KakaoLink;
import com.kakao.kakaolink.KakaoTalkLinkMessageBuilder;
import com.kakao.util.KakaoParameterException;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class MainActivity extends Activity {
	Button mbt;
	Context c;
	 private KakaoLink kakaoLink;
	 private KakaoTalkLinkMessageBuilder kakaoTalkLinkMessageBuilder;
	 
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		c=getApplicationContext();
		mbt = (Button)findViewById(R.id.button);
		try {
			kakaoLink = KakaoLink.getKakaoLink(c);
			kakaoTalkLinkMessageBuilder = kakaoLink.createKakaoTalkLinkMessageBuilder();
		} catch (KakaoParameterException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
		
		
		
		mbt.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				try {
					String testmessge = "카카오 링크 테스트 중 입니다.";
					
					kakaoTalkLinkMessageBuilder.addText(testmessge);					
					kakaoLink.sendMessage(kakaoTalkLinkMessageBuilder, c);
				} catch (KakaoParameterException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		});
	}
}

코딩상으로 뭐가 문제 있는건지 잘 모르겠습니다.

06-15 21:27:42.636: E/AndroidRuntime(31274): at com.kakao.kakaolink.KakaoLink.sendMessage(KakaoLink.java:122)
06-15 21:27:42.636: E/AndroidRuntime(31274): at com.gg.testlink.MainActivity$1.onClick(MainActivity.java:47)

android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?

아웃풋으로 되는 문제인건지… 너무 대충 말씀하시니깐 쫌 그렇내요… 샘플코딩보고 또 디벨로퍼를 보고 따라하는대도 이 짦은 코딩인대도 이러는대요… 제머리가 빠가사리라서 그런가봅니다. ㅜ ㅜ

1개의 좋아요

해결했습니다.

   public void sendMessage(final KakaoTalkLinkMessageBuilder builder, final Context context) throws KakaoParameterException {
        final Intent intent = TalkProtocol.createKakakoTalkLinkIntent(context, builder.build());
        if (intent == null) {
            //alert install dialog
            new AlertDialog.Builder(context)
                .setIcon(android.R.drawable.ic_dialog_alert)
                .setMessage(context.getString(R.string.com_kakao_alert_install_kakaotalk))
                .setPositiveButton(android.R.string.ok, new OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        Intent marketIntent;
                        try {
                            marketIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(KakaoTalkLinkProtocol.TALK_MARKET_URL_PREFIX + makeReferrer()));
                            marketIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                            context.startActivity(marketIntent);
                        } catch (ActivityNotFoundException e) {
                            marketIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(KakaoTalkLinkProtocol.TALK_MARKET_URL_PREFIX_2 + makeReferrer()));
                            marketIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                            context.startActivity(marketIntent);
                        }
                    }
                })
                .create().show();

        } else {
        	intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); <- SDK 카카오링크 부분 추가 하니깐 되내요
            context.startActivity(intent);
            
        }
    }

여기서 c부분을 한번 this로 해 보실 수 있을까요? 저도 안드로이드를 잘 모르는 상태라 엄한답을 해 드릴까봐 샘플을 참고하시라고 한거였어요 ㅠㅜ
공부도 할겸 제가 안드 샘플을 좀 살펴보니 KakaoLinkMainActivity.java에서 KakaoLink.getKakaoLink의 경우 올리신 예제처럼 application context를 사용하지만 kakaoLink.sendMessage시에는 application context가 아닌 activity의 context를 사용하고 있는것 같습니다.

또한 제가 FLAG_ACTIVITY_NEW_TASK 로 데브톡 내에서 검색(https://devtalk.kakao.com/search?q=FLAG_ACTIVITY_NEW_TASK)을 해보니 아래와 같은 토픽에서도 힌트를 얻을 수 있었어요.

https://devtalk.kakao.com/t/topic/17825/4

아마도 FLAG_ACTIVITY_NEW_TASK 로 구글링을 하면 여러 내용이 나올것 같기는 한데요, 제가 짧은 지식으로 추측해보자면, 원래의 startActivity 호출의 context가 좀 꼬인 실수인것 같고, 이를 정말 의도했는지에 대한 에러가 뜬것 같고, 이를 정말 의도한것이라면 FLAG_ACTIVITY_NEW_TASK 을 셋팅하라는 의미인것 같아요. 아마도 이를 의도하진 않으신것 같으니 this로만 인자를 바꾸어도 되지 않을까 추측해 봅니다~

@curuseid 답글을 다는 사이에 이미 FLAG_ACTIVITY_NEW_TASK 셋팅으로 트라이를 해 보셨군요. sendMessage의 context param조정도 한번 시도해 보실 수 있을까요?

아르바이트 하면서 개발하는거라 힘들지만 그래도 재밌어요 여러기능 써보고 싶지만 일단은 카카오링크랑 푸시알림기능을 달아넣을려고 합니다. 콘텍스트 파라미터 조정도 해봐야 겠내요 솔직히 저 방법은 왠지 개운하지 않아서요. 에러문 보고 인텐트를 못하는 문제인거 같아서 새로 만들어라는 지시잖아요 저게. 그래서 혹시나 써본건대 되긴 되는대 개운하지 않아요 ㅜ ㅜ 뭔가 안전하고 좋은방법을 찾고싶습니다.

한가지 궁금한게 있는대 셈플 코드를 보는대 .
왜 kakaoTalkLinkMessageBuilder = kakaoLink.createKakaoTalkLinkMessageBuilder(); 이거를 계속 써놓은건지 이해가 안되내요 저거 메모리에 상주 되어있기떄문에 한번 해놓구 그냥 계속 돌려쓰는게 아닌가요? sendmessage 하기전에 꼭 저게 또 써저있길래 궁금해서요 원래 그렇게 써야하는건가요?

@curuseid 아 저도 안드 샘플을 오늘에야 좀 제대로 봤는데요, kakaoTalkLinkMessageBuilder = kakaoLink.createKakaoTalkLinkMessageBuilder() 요 부분이 좀 어색하기는 하네요 ^^;
코드의 의도를 보니, initialize할 때 assign을 해 놓고, click 이벤트 등 다 사용되고 나서 다시 초기화 하는 개념이 섞여 있네요.
초기화를 왜 하냐면 해당 객체에 내용물이 바뀔 수 있고, 다 사용되면 내용물을 초기화 하여 다음 사용시에 초기값으로 사용하기 위한 의도인것 같긴 해요~

아 그리고 시도를 해보신 SDK를 고치는 방향은 좋은 생각같지는 않아요~ SDK를 고치시지 마시고, application context넘기는 것을 activity context로 넘기는 방법으로 한번 시도해 보세요!

근대 아에 날릴 필요없이 어레이리스트 사용하듯이 클리어 하고 빈박스는 남겨놓고 박스 돌려쓰듯이 쓰면 되지 않나요? 비트맵 개념이 아에 다른건가. 저거는 카카오링크 클레스 안에 빌더메소드를 불러온다라고 이해하면 되는거죠? 그럼 한번 불러와놓구 저걸 계속 쓰게되면 무슨 애러가 발생될 수 있나봐요?

@curuseid 네네. 보통 말씀하신 개념이 맞긴 한데, builder pattern이라는 것이 보통 내용물을 clear하고 재사용하기보다는 새로 builder를 만들어서 build를 하는것이 더 일반적인 방법이에요~ builder를 만들어 놓고 build()를 하면 원하는 객체가 나오고 그러면 builder는 더이상 의미가 없거든요~

아 확실히 이해 했습니다. ㅎㅎ 왜 this를 써야하는지 알겠내요.
저는 this 를 온크릭내에서 쓰니깐 context를 이해를 못한다는거내요. 하기사 보통은 맨날
Context mctx; 라고 하고 온크리에이트나 생성자에서 get어플리케이션으로 받아왔는대.
이해한게 맞는건지 모르겠는대. 이게 카카오 링크고 카카오를 열어야 하는거잖아요.
제엡에서는 열고 싶어도 에러를 말하게 되는거 아닌가요? 쉽게말해 카카오가 니엡이냐? 발음 좀이상한대 그 개념같은데요 . 그러니깐 내앱에서 내앱 환경을 넘겨줬는대. 야 너는 기상앱이고 저짝은 카카오앱인디? 라고 말하는걸로 이해하면 될까요? 그래서 순수하게 다시 트라이홰서 해보니깐 온클릭안에 매소드 만들고 그 매소드 안에서 빌드 하고 this 를 한다음에 카카오 링크 SDK 는 인탠트위에 딸려놨던 그놈을 지우고 다시 런해서 해보니깐 재대로 되내요 ㅎㅎ:… 진짜 빠가사리같내

@curuseid 노노. 정말 훌륭하십니다. 열정과 노력이 있으신것만으로도 앞으로 더욱 발전이 기대됩니다!