web-dev-qa-db-ja.com

Android WebView "tel:"リンクはWebページが見つからないことを示します

Android telview:電話へのリンクを開くwebviewアプリを取得しようとしています。電話リンクを開くたびにうまく機能し、電話が開きます。ただし、 「Webページが見つかりませんでした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時間をすりこぎで磨きましたが、答えを出すことができませんでした。

61
Jeff Thomas

わかりましたので、私が思う問題を解決しました。次のように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;
}

現在、私の通常のリンクは、telリンクと同様に機能します。また、geo:リンクを追加することもできます。必要な場合は、電話で地図を開く前に抱えていた問題は発生しません。

102
Jeff Thomas

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で動作しないことに気づいたので、それらも検出したい場合があります。

プロセス全体は、おそらく RIを処理するアクティビティについてPackageManagerに問い合わせる によって、あらゆる種類のURIに一般化できますが、これも組み込みブラウザではありません。それは行き過ぎで、インストールされている他のブラウザに混乱する可能性があります。

52
Anm

ドキュメント によると、私の経験に基づいて、Intent.ACTION_VIEWは、完璧に細かいtel:sms:smsto:mms:およびmmsto:リンク。

これが5の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;
   }
17
Pedro Lobito

注:-After Android Nouget shouldOverrideUrlLoading is Deprecated

サポートを向上させるには、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;
    }
9
Hitesh Sahu

WebViewにWebViewClientが割り当てられていない場合、デフォルトでWebViewはActivity ManagerにURLの適切なハンドラーを選択するように要求します。 WebViewClientが提供されている場合、異なるURLを自分で処理し、WebViewClient.shouldOverrideUrlLoading()でtrueを返す必要があります。

チェックドキュメント: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;
        }
    }
3
evanchin
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());
3
Vimukthi Sineth
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;
       }
1
diyism
@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;
    }
0
Naju Mat Isa