2010-12-02 34 views
56

我想讓我的android webview應用程序打開tel:鏈接到手機。每次我打開一個電話鏈接,它都很好,並打開了電話。但是,一旦我完成了我的通話並返回到應用程序,它就在一個頁面上顯示「未找到網頁tel:0000000000」。然後我必須再次點擊後退按鈕才能進入我點擊電話號碼的頁面。Android WebView「tel:」鏈接顯示網頁未找到

有沒有辦法讓它打開TEL鏈接而不嘗試在webview中查找頁面以及在手機上打開它?

這是代碼我正在使用的WebView覆蓋TEL其處理和mailto鏈接:

 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個小時去淘寶,並沒有提供任何答案。

+1

嘗試ACTION_DIAL:鏈接? – EboMike 2010-12-02 18:13:28

+0

等待,文檔實際上說,ACTION_VIEW很好:http://developer.android.com/reference/android/content/Intent.html不要緊,然後... – EboMike 2010-12-02 18:33:10

+0

愚蠢的問題:你是否正確設置了「WebViewClient」 ?其他一切工作嗎? – EboMike 2010-12-02 18:34:42

回答

94

好吧,我解決了我認爲的問題。我只需要單獨的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:鏈接,如果需要的話,它不會給我以前在電話上打開地圖時遇到的問題。

47

而不是調用loadUrl(url),只是返回假的,不應該重寫網址:

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

我發現觀看電話:在我們與嘗試了所有手機按預期工作。由於DIAL操作,無需特殊情況。

我注意到YouTube視頻等在WebViews中不起作用,因此您可能還需要檢測這些視頻。

整個過程可能通過querying the PackageManager for Activities that handle your URI來泛化各種URIs,它們也不是嵌入式瀏覽器。這可能是矯枉過正,並被其他已安裝的瀏覽器弄糊塗了。

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

按照documentation並根據我的經驗,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; 
    } 
2

如果沒有WebViewClient分配到的WebView,默認的WebView會問活動管理器選擇該URL的正確處理。如果提供了WebViewClient,則應該自己處理不同的URL,並在WebViewClient.shouldOverrideUrlLoading()中返回true,否則它將嘗試向URL發送請求並獲取錯誤,然後觸發onReceiveError()。

Check document: 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; 
     } 
    } 
5

注: - 安卓Nouget shouldOverrideUrlLoading被棄用

後,您需要使用shouldOverrideUrlLoadingshouldOverrideUrlLoading沿着更好的支持。此外,您可能想要檢查url是否有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; 
    } 
0
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()); 
0
@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; 
    }