카카오톡링크 웹앱 실행관련

어떤 홈페이지에 카카오톡 링크를 자바스크립트로 추가해서 모바일에서 브라우저를 통해서 누를경우 정상작동 하는 것을 확인했습니다.
그런데 웹앱에서 해당 링크를 누르면 해당 앱이 강제 종료됩니다. 웹앱쪽에서 어떤 작업을 추가적으로 해줘야하나요?

자바 스크립트는 사용가능하게 해놨습니다.
mWeb.getSettings().setSupportMultipleWindows(false);
mWeb.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
mWeb.getSettings().setJavaScriptEnabled(true);

해당 모바일 주소
http://m.gp21.org/

해당 사항만으로 원인을 파악하기 힘든데요~ 혹시 웹앱의 소스 제공가능하실까요?
그리고 혹시 m.gp21.org 말고 다른 사이트(예를 들면 kakako.com) 등으로 테스트 가능하실까?

2번 질문은 다른 사이트에서 테스트를 하겠다는건지 아니면 해당 링크를 해당 사이트로 거시라는 건지 명확하지 않아서 잘 모르겠네요.
그리고 카톡이 실행되는게 아니라 누르는 순간 바로 중지되었습니다. 라는 메시지와 함께 종료됩니다.

전체코드구요.
모바일쪽은 전혀 해본적이 없어서 거의 검색위주로 찾아다가 씁니다.
코드는 이전에 웹앱제작하시던분꺼 그대로 가져와서 문제 발생할때만 고쳐서 쓰고있습니다.

public class MainActivity extends Activity {
WebView mWeb;
String hostName = “m.gp21.org”;

private static final String TAG = "LOG_ANDROID"; 

/**
 * 파일첨부 
 */
private ValueCallback<Uri> mUploadMessage;
private final static int FILECHOOSER_RESULTCODE = 1;
@Override
protected  void onActivityResult(int requestCode, int resultCode,
        Intent intent) {
    if (requestCode == FILECHOOSER_RESULTCODE) {
        if (null == mUploadMessage)
            return;
        Uri result = intent == null || resultCode != RESULT_OK ? null
                : intent.getData();
        mUploadMessage.onReceiveValue(result);
        mUploadMessage = null;
    }
}

@SuppressLint("SetJavaScriptEnabled") // 자바스크립트 권한
@Override
protected void onCreate(Bundle savedInstanceState) {
	super.onCreate(savedInstanceState);
	setContentView(R.layout.activity_main);
	mWeb = (WebView) findViewById(R.id.web);
    
    /**
     * 웹뷰 설정
     */
	mWeb.getSettings().setSupportMultipleWindows(false); // 창을 여러개 띄움 false 여야함!!! 
	mWeb.getSettings().setJavaScriptCanOpenWindowsAutomatically(true); // 자바스크립트가  window.open()을 사용할 수 있도록 설정
	mWeb.getSettings().setJavaScriptEnabled(true);// 자바스크립트권한
	mWeb.getSettings().setPluginState(PluginState.ON);// 동영상접속
	mWeb.getSettings().setBuiltInZoomControls(true);// 확대&축소
	mWeb.getSettings().setUseWideViewPort(true); // wide viewport를 사용하도록 설정
	//mWeb.getSettings().setLoadWithOverviewMode(true); // pc홈페이지라 화면맞춤 설정 
	mWeb.getSettings().setSupportMultipleWindows(true); // 새창을 띄우도록 설정
	

	if (android.os.Build.VERSION.SDK_INT >= 11) {
		getWindow().addFlags(16777216);
	}
	
	mWeb.setWebViewClient(new MyWebClient());
	mWeb.setWebChromeClient(new ChromeClient()
	{
		/**
		 * 파일첨부
		 */
		@SuppressWarnings("unused")
	       public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture) {
	             mUploadMessage = uploadMsg;
	             Intent i = new Intent(Intent.ACTION_GET_CONTENT);
	             i.addCategory(Intent.CATEGORY_OPENABLE);
	             i.setType("*/*");
	             MainActivity.this.startActivityForResult(
	                     Intent.createChooser(i, "파일을 선택하세요"),
	                     FILECHOOSER_RESULTCODE);
	         }
					
	});
	mWeb.loadUrl("http://m.gp21.org/"); 
}
/**
 * @author hkkim
 */
class MyWebClient extends WebViewClient {
	@Override
	public boolean shouldOverrideUrlLoading(WebView view, String url) {

		// host가 hostName이 아닐 시 새로운 브라우저 실행
		if (Uri.parse(url).getHost().equals(hostName)) {
			return false;
		}
		Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
		startActivity(intent);
		return true;
	}
}

class ChromeClient extends WebChromeClient {
	public boolean shouldOverrideUrlLoading(WebView view, String url) {

		// host가 hostName이 아닐 시 새로운 브라우저 실행
		if (Uri.parse(url).getHost().equals(hostName)) {
			return false;
		}
		Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
		startActivity(intent);
		return true;
	}
}
/**
 * 메소드 
 */
// 카카오톡 링크
public void kakaolink(String url){
 Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
 intent.addCategory(Intent.CATEGORY_BROWSABLE);
 intent.putExtra(Browser.EXTRA_APPLICATION_ID,getPackageName());
 startActivity(intent);
}
// 동영상 메소드
public void intentView(String url) {
	try {
		Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
		startActivity(intent);
	} catch (Exception e) {
		e.printStackTrace();
	}
}
public void stopMediaPlayer() {
	MediaPlayer player = new MediaPlayer();
	if (player.isPlaying()) {
		player.stop();
	}
}
// 뒤로가기
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
	if ((keyCode == KeyEvent.KEYCODE_BACK) && mWeb.canGoBack()) {
		mWeb.goBack();
		return true;
	}
	return super.onKeyDown(keyCode, event);
}
//화면 전환시 리로드방지
@Override
public void onConfigurationChanged(Configuration newConfig) {
	// TODO Auto-generated method stub
	super.onConfigurationChanged(newConfig); 
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
	// Inflate the menu; this adds items to the action bar if it is present.
	getMenuInflater().inflate(R.menu.main, menu);
	return true;
}

}

풀 소스가 아니라서 확인이 좀 어려운데요. 주신 소스에서는 startActivity 메소드가 없는 것 같네요.
우선은 webView 에서 ChromeClient 와 WebViewClient를 제외하고 테스트 해봤을때는 별 문제가 없는 것 같습니다~

일단 WebViewClient를 제거하니 정상작동은 하네요.
답변 감사합니다.

WebViewClient를 제거하니 또 다른 문제가 생기군요 카카오톡과는 별개의…

startActivity는 Activity에 있는 메서드 같네요. 해당 클래스를 확장해서 쓰고있거든요.

코드는 위에가 전부입니다.

안드로이드 4.4 웹뷰 사용시 카카오링크가 전송이 되지 않습니다 - MJ_님의 글 #3 에 있는 방법을 사용해도 똑같이 종료됩니다.

shouldOverrideUrlLoading 함수에서 uri 를 검사하고 있는데요. 카카오톡의 링크는 커스텀스킴으로 전송이 되기 때문에 해당구문에서 null pointer exception이 발생할 수 있습니다. 모든 링크가 열릴 때 저렇게 체크를 하도록 해놓은 이유가 있을텐데요. 거기에 맞춰서 해당코드를 수정하면 될 것 같습니다.

네 감사합니다.
한번 수정해보겠습니다.

종료문제 외에도 다른문제가 발생했지만 해결했습니다.

혹시나 저와 같은 현상을 겪는 분을 위해서 코드 남깁니다.

WebViewCilent를 다시 구현했으며 안드로이드 4.4 웹뷰 사용시 카카오링크가 전송이 되지 않습니다 - MJ_님의 글 #3 참조했습니다.

PendingIntent를 통해서 해결했습니다.

setWebViewClient(new WebViewClient() {
    public static final String INTENT_PROTOCOL_START = "intent:";
    public static final String INTENT_PROTOCOL_INTENT = "#Intent;";
    public static final String INTENT_PROTOCOL_END = ";end;";
    public static final String GOOGLE_PLAY_STORE_PREFIX = "kakaolink://send?appkey=";

    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        if (url.startsWith(INTENT_PROTOCOL_START)) {
            final int customUrlStartIndex = INTENT_PROTOCOL_START
                    .length();
            Log.d("customUrlStartIndex", "" + customUrlStartIndex);
            final int customUrlEndIndex = url
                    .indexOf(INTENT_PROTOCOL_INTENT);
            Log.d("customUrlEndIndex", "" + customUrlEndIndex);
            if (customUrlEndIndex < 0) {
                return false;
            } else {
                final String customUrl = url.substring(
                        customUrlStartIndex, customUrlEndIndex);
                Log.d("customUrl", customUrl);
                try {
                    Intent intent = new Intent(Intent.ACTION_VIEW, Uri
                            .parse(customUrl));
                    PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0);
                    //getContext().startActivity(intent);
                    pendingIntent.send();
                } catch (ActivityNotFoundException e) {
                    final int packageStartIndex = customUrlEndIndex
                            + INTENT_PROTOCOL_INTENT.length();
                    Log.d("packageStartIndex", "" + packageStartIndex);
                    final int packageEndIndex = url
                            .indexOf(INTENT_PROTOCOL_END);
                    Log.d("packageEndIndex", "" + packageEndIndex);

                    final String packageName = url.substring(packageStartIndex,    packageEndIndex < 0 ? url.length() : packageEndIndex);
                    getContext().startActivity(
                            new Intent(Intent.ACTION_VIEW, Uri
                                    .parse(GOOGLE_PLAY_STORE_PREFIX
                                            + packageName)));
                    Log.d("uri", GOOGLE_PLAY_STORE_PREFIX + packageName);
                } catch (Exception e) {
                    Log.d("Others Exception", e.getMessage());
                }
                return true;
            }
        } else {
            mWeb.loadUrl(url);
            return false;
        }

    }
});
1개의 좋아요