Android Webview电子邮件链接(mailto)

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

我有一个看法,并认为该网站有恶意代码发送电子邮件。 当我打开链接时,链接在错误中打开。 我想当我打开链接打开Gmail应用程序或其他电子邮件应用程序。 感谢所有的帮助

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