하이브리드앱을 만들때 WebView 상에서 작업을 할때,
Net::ERR_UNKNOWN_URL_SCHEME
라는 메세지가 뜨고 전화걸기, 문자보내기 인텐트가 연동이 안될때, 아래의 소스를 참고하고 해결토록 하자.
private WebView webView1; protected void onCreate(Bundle savedInstanceState) { webView1 = (WebView) findViewById(R.id.webView1); webView1.setWebViewClient(new WebViewClientClass()); // 각종 권한 획득 checkVerify(); } public void checkVerify() { if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED || ContextCompat.checkSelfPermission(this, Manifest.permission.INTERNET) != PackageManager.PERMISSION_GRANTED || ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_NETWORK_STATE) != PackageManager.PERMISSION_GRANTED || ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED || ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED || ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED || ContextCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) { //카메라 또는 저장공간 권한 획득 여부 확인 if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) || ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.CAMERA)) { Toast.makeText(getApplicationContext(), "권한 관련 요청을 허용해 주셔야 카메라 캡처이미지 사용등의 서비스를 이용가능합니다.", Toast.LENGTH_SHORT).show(); } else if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.CALL_PHONE)) { Toast.makeText(getApplicationContext(),"전화걸기 권한을 승인해 주셔야 정상적인 전화걸기 서비스가 가능합니다.",Toast.LENGTH_SHORT).show(); } else { // 카메라 및 저장공간 권한 요청 ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.INTERNET, Manifest.permission.CAMERA, Manifest.permission.ACCESS_NETWORK_STATE, Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE,Manifest.permission.CALL_PHONE}, 1); } } } private class WebViewClientClass extends WebViewClient { @Override public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) { //Log.d("WebViewClient URL : " , request.getUrl().toString()); String url = request.getUrl().toString(); if (url.startsWith("tel:")) { Intent call_phone = new Intent(Intent.ACTION_CALL); call_phone.setData(Uri.parse(url)); if (checkSelfPermission(Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) { Toast.makeText(getApplicationContext(),"전화걸기 권한을 승인해 주셔야 정상적인 전화걸기 서비스가 가능합니다.",Toast.LENGTH_SHORT).show(); return true; } startActivity(call_phone); } else if (url.startsWith("sms:")){ Intent intent = new Intent(Intent.ACTION_SENDTO,Uri.parse(url)); startActivity(intent); } else 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) { Log.d("shouldOverrideUrlLoading()","intent part Error"); e.printStackTrace(); } } else { view.loadUrl(request.getUrl().toString()); } return true; //return super.shouldOverrideUrlLoading(view, request); } }
WebViewClient 를 상속한 WebViewClientClass 에서 url 이 tel: , sms: , intent: 등의 주소로 들어올때 각각 if문안에
각각 Intent를 띄우는 형태로 처리되어 있다.