이유가 너무.. 간단하다. 좀 황당할정도로 어이 없는데,
웹뷰에서 앱 - 앱간의 통신 시에 인텐트를 열기 위한 String을 웹뷰가 uri로 로딩하며 생기는 문제이다.
ISP 같은 경우
ispmobile://TID= XXXXXXXXXXXXX
로 요청하기 때문에 당연지사 http:// 등 웹이 로드할 수 없는 형태로 요청하니까 오류를 출력한다.
이걸 그럼 어떻게 해결하냐고? 웹뷰에서 uri이 오버로딩 될 때 uri을 낚아채서 인텐트를 요청하면 된다.
private WebViewClient = new WebViewClient() {
...
@Override
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
//안드로이드가 앱 - 앱 간 인텐트 로딩할때 uri 방식으로 로드하기 때문에 오버라이드 단계에서 uri로 판단해서, 정상 uri가 아닐 경우 scheme로 parse 하여 인텐트 요청
if(!request.getUrl().toString().startsWith("http://") && !request.getUrl().toString().startsWith("https://") && !request.getUrl().toString().startsWith("javascript")) {
Intent intent = null;
try {
intent = Intent.parseUri(request.getUrl().toString(), Intent.URI_INTENT_SCHEME);
Uri uri = Uri.parse(intent.getDataString());
webView.getContext().startActivity(new Intent(Intent.ACTION_VIEW, uri));
return true;
} catch (URISyntaxException e) {
e.printStackTrace();
return false;
} catch (ActivityNotFoundException e) {
if(intent == null) {
return false;
}
String packageName = intent.getPackage();
if(packageName != null) {
webView.getContext().startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=" + packageName)));
return true;
}
return false;
}
}
return super.shouldOverrideUrlLoading(view, request);
}
}
이 클라이언트를 웹뷰에 셋하기만 하면 된다. 간단하지?!
반응형
'Android' 카테고리의 다른 글
카카오 API, Android] 키 해시 부여받기 (1) | 2021.08.31 |
---|---|
카카오 API Error 해결] Class not found when unmarshalling: com.kakao.sdk.auth.AuthCodeClient$resultReceiver$1 오류 (1) | 2021.08.31 |
Android Studio, JAVA] 안드로이드 intent cannot resolve constructor 오류 해결 (0) | 2021.03.09 |
주니어가 하는 MVC패턴과 MVP 패턴에 대한 고찰....... (0) | 2021.01.28 |
Android Studio, Kotlin] 코틀린 익스텐션을 이용한 리사이클러뷰 제작 (0) | 2020.12.29 |