[Android Studio]안드로이드 웹뷰로 url 호출시 net::ERR_UNKNOWN_URL_SCHEME 오류 발생 해결하기
참 오랜만에 앱을 업데이트 하면서
새로 개발한 앱을 홍보를 해볼까?
메뉴 하나 추가해서 구글플레이 url 링크 하나 걸어서 테스트를 하였는데,
아래와 같이 오류가 발생되었다.
![](https://playground.naragara.com/wp-content/uploads/2024/03/Screenshot_20240330_141510_-1024x678.jpg)
오류가 발생한 웹뷰 코드는 다음과 같다.
오류 발생한 WebView 코드
//웹뷰에서 홈페이지를 띄웠을때 새창이 아닌 기존창에서 실행이 되도록 아래 코드를 넣어준다.
private class WebViewClientClass extends WebViewClient {//페이지 이동
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return true;
}
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
super.onPageStarted(view, url, favicon);
mProgressBar.setVisibility(ProgressBar.VISIBLE);
webView.setVisibility(View.INVISIBLE);
}
@Override
public void onPageCommitVisible(WebView view, String url) {
super.onPageCommitVisible(view, url);
mProgressBar.setVisibility(ProgressBar.GONE);
webView.setVisibility(View.VISIBLE);
}
// @Override
// public void onPageFinished(WebView view, String url) {
// findViewById(R.id.progress1).setVisibility(View.GONE);
// }
@Override
public void onReceivedSslError(WebView view, final SslErrorHandler handler, SslError error) {
final AlertDialog.Builder builder = new AlertDialog.Builder(WebActivity.this);
String message = "SSL Certificate error.";
switch (error.getPrimaryError()) {
case SslError.SSL_UNTRUSTED:
message = "The certificate authority is not trusted.";
break;
case SslError.SSL_EXPIRED:
message = "The certificate has expired.";
break;
case SslError.SSL_IDMISMATCH:
message = "The certificate Hostname mismatch.";
break;
case SslError.SSL_NOTYETVALID:
message = "The certificate is not yet valid.";
break;
}
message += " Do you want to continue anyway?";
builder.setTitle("SSL Certificate Error");
builder.setMessage(message);
builder.setPositiveButton("continue", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
handler.proceed();
}
});
builder.setNegativeButton("cancel", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
handler.cancel();
}
});
final AlertDialog dialog = builder.create();
dialog.show();
}
}
net::ERR_UNKNOWN_URL_SCHEME 해결 방법
shouldOverrideUrlLoading()함수를 오버라이드 하는 부분에 코드를 추가해주어야한다.
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
if (url.startsWith("intent:")) {
try {
Intent intent = Intent.parseUri(url, Intent.URI_INTENT_SCHEME);
Intent existPackage = getPackageManager().getLaunchIntentForPackage(intent.getPackage());
if (existPackage != null) {
startActivity(intent);
} else {
Intent marketIntent = new Intent(Intent.ACTION_VIEW);
marketIntent.setData(Uri.parse("market://details?id=" + intent.getPackage()));
startActivity(marketIntent);
}
return true;
} catch (Exception e) {
e.printStackTrace();
}
} else {
view.loadUrl(url);
}
return true;
}
intent 체크 조건을 추가해주면 , url 중에 구글플레이스토어 url이 유입될 경우 안드로이드 웹뷰에서 바로 구글플레이스토어 앱을 실행하여 앱을 바로 찾아준다.