Webview email link (mailto)

前端 未结 3 764
暖寄归人
暖寄归人 2021-01-31 15:39

I have a view and view the site has malito code to send email. When I open the link opens in an error. I want that when I open the link opens Gmail app or another email applic

相关标签:
3条回答
  • 2021-01-31 16:08

    Note : - After Android Nougat shouldOverrideUrlLoading is Deprecated

    You need to use shouldOverrideUrlLoading along with shouldOverrideUrlLoading for better support.

    Also, you might want to check if URL have mailto: or tel:, which are used in HTML5 to trigger mail client and phone dial respectively.

    A complete solution will look like this now

    @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 讨论(0)
  • 2021-01-31 16:15

    You have to create a subclass of WebViewClient and override mailto URL loading. Example:

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

    Then you have to set this custom WebViewClient to your WabView:

    webView.setWebViewClient(new MyWebViewClient(activity);
    
    0 讨论(0)
  • 2021-01-31 16:32

    You should update your's WebViewClient with the following:

    @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());
        } 
    } 
    
    0 讨论(0)
提交回复
热议问题