Android Webview电子邮件链接(mailto)
我有一个看法,并认为该网站有恶意代码发送电子邮件。 当我打开链接时,链接在错误中打开。 我想当我打开链接打开Gmail应用程序或其他电子邮件应用程序。 感谢所有的帮助Android Webview电子邮件链接(mailto),android,webview,mailto,Android,Webview,Mailto,我有一个看法,并认为该网站有恶意代码发送电子邮件。 当我打开链接时,链接在错误中打开。 我想当我打开链接打开Gmail应用程序或其他电子邮件应用程序。 感谢所有的帮助 public class teacher extends Activity implements OnClickListener { WebView webView; final Activity activity = this; @Override public void onCreate
public class teacher extends Activity implements OnClickListener {
WebView webView;
final Activity activity = this;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.getWindow().requestFeature(Window.FEATURE_PROGRESS);
setContentView(R.layout.teacher);
webView = (WebView) findViewById(R.id.webView145);
webView.getSettings().setJavaScriptEnabled(true); webView.loadUrl("https://dl.dropboxusercontent.com/u/233211/%D7%A8%D7%A9%D7%99%D7%95%D7%9F/iWebKit%20demo/ther.html");
webView.setWebChromeClient(new WebChromeClient() {
public void onProgressChanged(WebView view, int progress) {
activity.setTitle("Loading...");
activity.setProgress(progress * 100);
if (progress == 100)
activity.setTitle(R.string.app_name);
} });
webView.setWebViewClient(new WebViewClient() {
@Override
public void onReceivedError(WebView view, int errorCode,
String description, String failingUrl) {
// Handle the error
}
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return true; } });}
public void onBackPressed() {
if (webView.canGoBack()) {
webView.goBack();
} else {
Intent B = new Intent(this, MainActivity.class);
startActivity(B);
}}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (event.getAction() == KeyEvent.ACTION_DOWN) {
switch (keyCode) {
case KeyEvent.KEYCODE_BACK:
if (webView.canGoBack() == true) {
webView.goBack();
} else {
finish();
}return true;} }
return super.onKeyDown(keyCode, event);
}
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
}}
您必须创建WebViewClient的子类并覆盖MailToURL加载。例如:
public class MyWebViewClient extends WebViewClient {
private final WeakReference<Activity> mActivityRef;
public MyWebViewClient(Activity activity) {
mActivityRef = new WeakReference<Activity>(activity);
}
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
if (url.startsWith("mailto:")) {
final Activity activity = mActivityRef.get();
if (activity != null) {
MailTo mt = MailTo.parse(url);
Intent i = newEmailIntent(activity, mt.getTo(), mt.getSubject(), mt.getBody(), mt.getCc());
activity.startActivity(i);
view.reload();
return true;
}
} else {
view.loadUrl(url);
}
return true;
}
private Intent newEmailIntent(Context context, String address, String subject, String body, String cc) {
Intent intent = new Intent(Intent.ACTION_SEND);
intent.putExtra(Intent.EXTRA_EMAIL, new String[] { address });
intent.putExtra(Intent.EXTRA_TEXT, body);
intent.putExtra(Intent.EXTRA_SUBJECT, subject);
intent.putExtra(Intent.EXTRA_CC, cc);
intent.setType("message/rfc822");
return intent;
}
}
您应该使用以下内容更新您的WebViewClient:
@SuppressWarnings("deprecation")
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
proceedUrl(view, Uri.parse(url))
return true;
}
@TargetApi(Build.VERSION_CODES.N)
@Override
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
proceedUrl(view, request.getUrl());
return true;
}
private void proceedUrl(View view, Uri uri){
if (uri.toString().startsWith("mailto:")) {
startActivity(new Intent(Intent.ACTION_SENDTO, uri));
} else if (uri.toString().startsWith("tel:")) {
startActivity(new Intent(Intent.ACTION_DIAL, uri));
} else {
view.loadUrl(uri.toString());
}
}
注意:-在Android Nougat之后
应该覆盖Allowing
是不推荐的
您需要将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中:“webView.setWebViewClient(新的WestwingWebViewClient(活动);”。因为WestwingWebViewClient无法解析重复的答案。您应该设置新创建的自定义WebViewClient,即MyWebViewClientWhy
view.loadUrl(url)
在else中?是否可以简单地返回false;
在if之后而没有else?我建议将“newEmailIntent”的最后一行替换为返回Intent.createChooser(Intent,选择器的标题);
@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;
}