developer tip

Android WebView "tel :"링크에 웹 페이지를 찾을 수 없음이 표시됨

copycodes 2020. 11. 29. 11:52
반응형

Android WebView "tel :"링크에 웹 페이지를 찾을 수 없음이 표시됨


내 Android webview 앱을 사용하여 tel : 전화 링크를 열려고합니다. 전화 링크를 열 때마다 잘 작동하고 전화가 열립니다. 그러나 통화를 마치고 앱으로 돌아 가면 "Web Page Not Found tel : 0000000000"이라는 페이지가 나타납니다. 그런 다음 다시 한 번 뒤로 버튼을 눌러 전화 번호를 클릭 한 페이지로 이동해야합니다.

webview에서 페이지를 찾지 않고 전화로 열지 않고도 TEL 링크를 열 수있는 방법이 있습니까?

이것은 TEL 및 Mailto 링크 처리를 재정의하기 위해 WebView에서 사용하는 코드입니다.

        public boolean shouldOverrideUrlLoading(WebView view, String url) {
        if (url.startsWith("mailto:") || url.startsWith("tel:")) { 
                Intent intent = new Intent(Intent.ACTION_VIEW,
                        Uri.parse(url)); 
                startActivity(intent); 
                } 
        view.loadUrl(url);
        return true;
        }

어떤 도움을 주시면 감사하겠습니다. 나는 지난 2 시간 동안 물건을 샅샅이 뒤졌고 어떤 대답도하지 못했다.


좋아 그래서 내가 생각하는 문제를 해결했습니다. 다음과 같이 URL 재정의를 분리해야했습니다.

public boolean shouldOverrideUrlLoading(WebView view, String url) {
    if (url.startsWith("tel:")) { 
        Intent intent = new Intent(Intent.ACTION_DIAL, Uri.parse(url)); 
        startActivity(intent);
        view.reload();
        return true;
    }

    view.loadUrl(url);
    return true;
}

이제 내 일반 링크가 전화 링크만큼 작동합니다. 필요한 경우 geo : links에 추가 할 수도 있습니다. 전화에서지도를 열 때 이전에 겪었던 문제가 발생하지 않습니다.


를 호출하는 대신 loadUrl(url)재정의해서는 안되는 URL에 대해 false를 반환합니다.

public boolean shouldOverrideUrlLoading(WebView view, String url) {
    if( URLUtil.isNetworkUrl(url) ) {
        return false;
    }

    // Otherwise allow the OS to handle it
    Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
    startActivity( intent ); 
    return true;
}

VIEWing tel : 우리가 사용해 본 모든 휴대폰에서 예상대로 작동합니다. DIAL 동작으로 인해 특별한 경우가 필요하지 않습니다.

YouTube 동영상 등이 WebViews에서 작동하지 않는다는 것을 알았으므로 이러한 동영상도 감지하는 것이 좋습니다.

임베디드 브라우저가 아닌 URI처리하는 활동에 대해 PackageManager를 쿼리하여 모든 종류의 URI에 대해 전체 프로세스를 일반화 할 수 있습니다 . 이는 과잉 일 수 있으며 설치된 다른 브라우저에서 혼동 될 수 있습니다.


에 따르면 문서 내 경험을 바탕으로, Intent.ACTION_VIEW이다 완벽하게 정상적으로 구문 분석 tel:, sms:, smsto:, mms:mmsto:링크를 제공합니다.

다음은 5 in 1입니다.

@Override
    public boolean shouldOverrideUrlLoading(WebView webview, String url)
    {
     if (url.startsWith("tel:") || url.startsWith("sms:") || url.startsWith("smsto:") || url.startsWith("mms:") || url.startsWith("mmsto:"))
       { 
         Intent intent = new Intent(Intent.ACTION_VIEW,Uri.parse(url)); 
         startActivity(intent); 
         return true;
       }
    return false;
   }

참고 :-Android Nouget shouldOverrideUrlLoading가 지원 중단 된

더 나은 지원 을 위해 shouldOverrideUrlLoading와 함께 사용해야 shouldOverrideUrlLoading합니다. 또한 URL에 mailto:또는 tel: 이 있는지 확인하고 싶을 수도 있습니다 . HTML5에서 메일 클라이언트와 전화 다이얼을 각각 트리거하는 데 사용됩니다.

완전한 솔루션은 이제 다음과 같습니다.

    @SuppressWarnings("deprecation")
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        if (url.startsWith("mailto:")) {  
            //Handle mail Urls
            startActivity(new Intent(Intent.ACTION_SENDTO, Uri.parse(url)));
        } else if (url.startsWith("tel:")) {
            //Handle telephony Urls
            startActivity(new Intent(Intent.ACTION_DIAL, Uri.parse(url)));
        } else {
            view.loadUrl(url);
        }
        return true;
    }

    @TargetApi(Build.VERSION_CODES.N)
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
        final Uri uri = request.getUrl();
        if (uri.toString().startsWith("mailto:")) {
            //Handle mail Urls
            startActivity(new Intent(Intent.ACTION_SENDTO, uri));
        } else if (uri.toString().startsWith("tel:")) {
            //Handle telephony Urls
            startActivity(new Intent(Intent.ACTION_DIAL, uri));
        } else {
            //Handle Web Urls
            view.loadUrl(uri.toString());
        }
        return true;
    }

WebView에 할당 된 WebViewClient가없는 경우 기본적으로 WebView는 활동 관리자에게 URL에 대한 적절한 핸들러를 선택하도록 요청합니다. WebViewClient가 제공되는 경우 다른 URL을 직접 처리하고 WebViewClient.shouldOverrideUrlLoading ()에서 true를 반환해야합니다. 그렇지 않으면 URL에 요청을 보내고 오류가 발생한 다음 onReceiveError ()를 트리거합니다.

문서 확인 : WebViewClient.shouldOverrideUrlLoading

     @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        if (url.startsWith("tel:")) { 
            // ...TODO: launch a Dial app or send SMS or add to contact, etc...
            return true;
        }
        else if (url.startsWith("mailto:")) {
            // ...TODO: send email to someone or add to contact, etc...
            return true;
        }
        else {
            // ...TODO: Handle URL here
            boolean handled = yourHandleUrlMethod(url);
            return handled;
        }
    }

public class MainActivity extends Activity {

private static final String HTML ="<!DOCTYPE html><html><body><a 
href='tel:867-5309'>Click here to call!</a></body></html>";
private static final String TEL_PREFIX = "tel:";

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    WebView wv = (WebView) findViewById(R.id.webview);
    wv.setWebViewClient(new CustomWebViewClient());
    wv.loadData(HTML, "text/html", "utf-8");
}

private class CustomWebViewClient extends WebViewClient {

    @Override
    public boolean shouldOverrideUrlLoading(WebView wv, String url) {
        if(url.startsWith(TEL_PREFIX)) {
            Intent intent = new Intent(Intent.ACTION_DIAL);
            intent.setData(Uri.parse(url));
            startActivity(intent);
            return true;
        }
        return false;
    }
}

}

이것은 내가 찾은 수정이었습니다. 이 방법을 사용해야합니다.

wv.setWebViewClient(new CustomWebViewClient());

public boolean shouldOverrideUrlLoading(WebView view, String url)
       {Uri query_string=Uri.parse(url);
        String query_scheme=query_string.getScheme();
        String query_host=query_string.getHost();
        if ((query_scheme.equalsIgnoreCase("https") || query_scheme.equalsIgnoreCase("http"))
            && query_host!=null && query_host.equalsIgnoreCase(Uri.parse(URL_SERVER).getHost())
            && query_string.getQueryParameter("new_window")==null
           )
           {return false;//handle the load by webview
           }
        try
           {Intent intent=new Intent(Intent.ACTION_VIEW, query_string);
            String[] body=url.split("\\?body=");
            if (query_scheme.equalsIgnoreCase("sms") && body.length>1)
               {intent=new Intent(Intent.ACTION_VIEW, Uri.parse(body[0]));
                intent.putExtra("sms_body", URLDecoder.decode(body[1]));
               }
            view.getContext().startActivity(intent);//handle the load by os
           }
        catch (Exception e) {}
        return true;
       }

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    WebView wv = (WebView) findViewById(R.id.webview);
    wv.setWebViewClient(new CustomWebViewClient());
    wv.loadData(HTML, "text/html", "utf-8");
}

private class CustomWebViewClient extends WebViewClient {
    @SuppressWarnings("deprecated")
    @Override
    public boolean shouldOverrideUrlLoading(WebView wv, String url) {
        if(url.startsWith(TEL_PREFIX)) {
            Intent intent = new Intent(Intent.ACTION_DIAL);
            intent.setData(Uri.parse(url));
            startActivity(intent);
            return true;
        }
        return false;
    }

참고 URL : https://stackoverflow.com/questions/4338305/android-webview-tel-links-show-web-page-not-found

반응형