mailto: links unsupported in Android?

12,113

Solution 1

You have to handle it yourself in a WebViewClient

public class MyWebViewClient extends WebViewClient {
    Activity mContext;
    public MyWebViewClient(Activity context){
        this.mContext = context;
    }
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {     
        if(url.startsWith("mailto:")){
            MailTo mt = MailTo.parse(url);
            Intent i = new Intent(Intent.ACTION_SEND);
            i.setType("text/plain");
            i.putExtra(Intent.EXTRA_EMAIL, new String[]{mt.getTo()});
            i.putExtra(Intent.EXTRA_SUBJECT, mt.getSubject());
            i.putExtra(Intent.EXTRA_CC, mt.getCc());
            i.putExtra(Intent.EXTRA_TEXT, mt.getBody());
            mContext.startActivity(i);
            view.reload();
            return true;
        }
        view.loadUrl(url);
        return true;
    }
}

In your activity you keep a reference to MyWebViewClient and assign it to your webview with setWebViewClient(mWebClient).

Solution 2

A simpler way would be:

if(url.startsWith("mailto:")){
    Intent intent = Intent.parseUri(url, Intent.URI_INTENT_SCHEME);
    view.getContext().startActivity(intent);
}
Share:
12,113
Chamilyan
Author by

Chamilyan

technovator

Updated on July 21, 2022

Comments

  • Chamilyan
    Chamilyan almost 2 years

    I dont have a real Android device so I'm using emulators for all my development for now, are mailto: web links really unsupported on Android devices 2.1 and below? 2.2 works, but every time I click a mailto: link on 1.6 or 2.1 even, I get an [unsupported action] dialog. Anybody with a real device want to test this out?

  • Daniel
    Daniel over 11 years
    A minor caveat regarding this solution: the method always returns true, which tells the WebView that "our implementation of WebViewClient handles everything" - this can create problems for edge cases of redirections, such as using location.replace() in JavaScript. Instead of view.loadUrl(url); return true; you can type return false; to achieve the same effect without introducting bugs. See my longer explanation in this answer to another question
  • Ken
    Ken over 10 years
    if (MailTo.isMailTo(url)) { //...
  • Rich
    Rich over 5 years
    I believe Intent.parseUri throws a URISyntaxException so you need to handle with a try { ... } catch { ... }