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時間をすりこぎで磨きましたが、答えを出すことができませんでした。
わかりましたので、私が思う問題を解決しました。次のように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:リンクを追加することもできます。必要な場合は、電話で地図を開く前に抱えていた問題は発生しません。
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に一般化できますが、これも組み込みブラウザではありません。それは行き過ぎで、インストールされている他のブラウザに混乱する可能性があります。
ドキュメント によると、私の経験に基づいて、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;
}
注:-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;
}
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;
}
}
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;
}