webentwicklung-frage-antwort-db.com.de

Android WebView "tel:" - Links zeigen Webseiten nicht gefunden

Ich versuche, mit meiner Android-Webview-App tel: Links zum Telefon zu öffnen. Jedes Mal, wenn ich eine Telefonverbindung öffne, funktioniert es großartig und öffnet das Telefon. Sobald ich mit meinem Anruf fertig bin und zur App zurückkehre, wird auf der Seite "Webseite nicht gefunden tel: 0000000000" angezeigt. Dann muss ich noch einmal die Zurück-Taste drücken, um zu der Seite zu gelangen, auf die ich die Telefonnummer geklickt habe.

Gibt es eine Möglichkeit, den TEL-Link zu öffnen, ohne zu versuchen, die Seite in Webview zu finden und auf dem Telefon zu öffnen?

Dies ist der Code, den ich in WebView verwende, um die Handhabung der TEL- und Mailto-Links zu überschreiben:

        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;
        }

Jede Hilfe wäre dankbar. Ich habe die letzten 2 Stunden damit verbracht, Goodle zu durchforsten, und habe keine Antworten erhalten.

60
Jeff Thomas

OK, also habe ich das Problem gelöst, denke ich. Ich musste nur die URL-Überschreibungen wie folgt trennen:

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;
}

Nun funktionieren meine regulären Links ebenso wie die Tel-Links. Ich kann dort auch für Geo: Links hinzufügen, wenn ich muss, und es wird mir nicht das Problem geben, das ich zuvor hatte, um Karten am Telefon zu öffnen.

99
Jeff Thomas

Anstatt loadUrl(url) aufzurufen, geben Sie einfach false für die URLs zurück, die nicht überschrieben werden sollen:

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;
}

Ich habe VIEWing tel gefunden: Funktioniert auf allen Telefonen, mit denen wir es getestet haben, erwartungsgemäß. Aufgrund der DIAL-Aktion ist kein Spezialfall erforderlich.

Ich habe festgestellt, dass YouTube-Videos und dergleichen in WebViews nicht funktionieren. Daher möchten Sie möglicherweise auch diese erkennen.

Der gesamte Prozess könnte möglicherweise für alle Arten von URIs verallgemeinert werden, indem der PackageManager für Aktivitäten abgefragt wird, die Ihren URI behandeln die ebenfalls nicht der eingebettete Browser sind. Das könnte übertrieben sein und von anderen installierten Browsern verwirrt werden.

52
Anm

Laut Dokumentation und basierend auf meiner Erfahrung ist Intent.ACTION_VIEW vollkommen in Ordnung , um tel:, sms:, smsto:, mms: Und mmsto:.

Hier ist eine 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;
   }
17
Pedro Lobito

Hinweis: - Nachdem Android Nouget shouldOverrideUrlLoading veraltet ist

Sie müssen shouldOverrideUrlLoading zusammen mit shouldOverrideUrlLoading verwenden, um die Unterstützung zu verbessern. Vielleicht möchten Sie auch prüfen, ob die URL mailto: oder tel:, die in HTML5 verwendet werden, um den Mail-Client bzw. die Telefonwahl auszulösen.

Eine vollständige Lösung wird jetzt so aussehen

    @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;
    }
7
Hitesh Sahu

Wenn WebViewClient kein WebViewClient zugewiesen ist, fordert WebView Activity Manager standardmäßig auf, den richtigen Handler für die URL auszuwählen. Wenn ein WebViewClient bereitgestellt wird, sollten Sie andere URLs selbst behandeln und in WebViewClient.shouldOverrideUrlLoading () den Wert true zurückgeben. Andernfalls wird versucht, die Anforderung an die URL zu senden, und es wird ein Fehler angezeigt.

Dokument prüfen: 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;
    }
}

}

Dies war der Fix, den ich gefunden habe. Sie müssen diese Methode verwenden.

wv.setWebViewClient(new CustomWebViewClient());
2
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