70

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 時間かけて良いものを探しましたが、何の回答も得られませんでした。

4

11 に答える 11

118

わかりましたので、私が思う問題を解決しました。次のように 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: リンクを追加することもできます。これにより、電話でマップを開く前に抱えていた問題は発生しなくなります。

于 2010-12-02T19:51:34.453 に答える
57

を呼び出す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 に対して一般化することができます。これはやり過ぎで、インストールされている他のブラウザーによって混乱する可能性があります。

于 2011-04-04T23:24:06.817 に答える
19

ドキュメントによると、私の経験に基づいて、、、、およびリンクを解析しても問題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;
   }
于 2015-10-15T21:59:29.627 に答える
15

注:- Android NogetshouldOverrideUrlLoadingが非推奨になった後

より良いサポートを得るshouldOverrideUrlLoadingには、 と一緒に使用する必要があります。また、HTML5 でメール クライアントと電話ダイヤルをそれぞれトリガーするために使用されるshouldOverrideUrlLoadingURL にmailto:または: があるかどうかを確認することもできます。tel

完全なソリューションは次のようになります

    @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;
    }
于 2017-04-13T13:22:36.187 に答える
1
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;
       }
于 2011-08-11T05:14:11.497 に答える
0

Hitesh Sahukam Cの回答を見ると、解決策が見つかりました。

API 21 では、例外が発生しました。

また、 diyismによって通知されるように、アクティビティが見つからない場合があります。だから、私はこれらの状況を処理しました。

class MyWebViewClient : WebViewClient() {

    @Suppress("DEPRECATION")
    override fun shouldOverrideUrlLoading(view: WebView?, url: String?): Boolean {
        if (view != null && url != null) {
            return resolveUri(view.context, Uri.parse(url))
        }
        return super.shouldOverrideUrlLoading(view, url)
    }

    @TargetApi(Build.VERSION_CODES.N)
    override fun shouldOverrideUrlLoading(view: WebView?, request: WebResourceRequest?): Boolean {
        val uri = request?.url
        if (view != null && uri != null) {
            return resolveUri(view.context, uri)
        }
        return super.shouldOverrideUrlLoading(view, request)
    }

    private fun resolveUri(context: Context, uri: Uri): Boolean {
        val url = uri.toString()
        URL_SCHEMES.forEach {
            if (url.startsWith(it)) {
                val intent = Intent(Intent.ACTION_VIEW).apply {
                    data = uri
                    addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
                }
                try {
                    context.startActivity(intent)
                } catch (e: ActivityNotFoundException) {
                }
                return true
            }
        }
        return false
    }

    companion object {
        private val URL_SCHEMES = arrayOf(WebView.SCHEME_TEL,
            WebView.SCHEME_MAILTO, WebView.SCHEME_GEO, "sms:", "smsto:", "mms:", "mmsto:")
    }
}
于 2020-08-25T14:56:04.383 に答える