안드로이드
[Android] WebView 작업할때 Net::ERR_UNKNOWN_URL_SCHEME 에러 발생할때 (전화걸기,문자보내기 안된다)
http://portfolio.wonpaper.net
2020. 7. 31. 06:19
하이브리드앱을 만들때 WebView 상에서 작업을 할때,
Net::ERR_UNKNOWN_URL_SCHEME
라는 메세지가 뜨고 전화걸기, 문자보내기 인텐트가 연동이 안될때, 아래의 소스를 참고하고 해결토록 하자.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
|
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);
}
}
|
cs |
WebViewClient 를 상속한 WebViewClientClass 에서 url 이 tel: , sms: , intent: 등의 주소로 들어올때 각각 if문안에
각각 Intent를 띄우는 형태로 처리되어 있다.