Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Android- mailto link won't work

I have read many Questions about this topic here at stackoverflow, also my solution come from here but it won't work. Also there is no error message.

I have a webview in Android and a Homepage, there are some mailto links, when I try to open the mailto links from my webview in a mailclient, the webview always open the mail address like a normal webpage.

Could someone look at my code and tell my what's wrong?

Thank's for your help.

Code:

Manifest file:

1<?xml version="1.0" encoding="utf-8"?>
2<manifest xmlns:android="http://schemas.android.com/apk/res/android"
3 package="com.example.TEST"
4 android:versionCode="1"
5 android:versionName="1.5" android:installLocation="auto">
6
7 <uses-permission android:name="android.permission.INTERNET" />
8 <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
9 <uses-permission android:name="android.permission.ACCESS_GPS" />
10  <uses-permission android:name="android.permission.ACCESS_ASSISTED_GPS" />
11  <uses-permission android:name="android.permission.ACCESS_LOCATION" />
12  <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
13
14 <uses-sdk
15 android:minSdkVersion="8"
16 android:targetSdkVersion="17" />
17
18 <application
19 android:allowBackup="true"
20 android:icon="@drawable/ic_launcher"
21 android:label="@string/app_name"
22 android:theme="@style/AppTheme" >
23 <activity
24 android:name="com.example.lauffinderpro.MainActivity"
25 android:label="@string/app_name" >
26 <intent-filter>
27 <action android:name="android.intent.action.MAIN" />
28
29 <category android:name="android.intent.category.LAUNCHER" />
30 </intent-filter>
31 </activity>
32 </application>
33
34</manifest>

main.xml

1<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
2 xmlns:tools="http://schemas.android.com/tools"
3 android:id="@+id/FrameLayout1"
4 android:layout_width="match_parent"
5 android:layout_height="match_parent"
6 android:paddingBottom="@dimen/vertical"
7 android:paddingLeft="@dimen/horizontal"
8 android:paddingRight="@dimen/horizontal"
9 android:paddingTop="@dimen/vertical"
10 tools:context=".MainActivity" >
11
12 <LinearLayout
13 android:layout_width="match_parent"
14 android:layout_height="match_parent"
15 android:orientation="vertical" >
16
17 <WebView
18 android:id="@+id/webView1"
19 android:layout_width="match_parent"
20 android:layout_height="0dp"
21 android:layout_weight="0.05" />
22
23 <FrameLayout
24 android:layout_width="match_parent"
25 android:layout_height="wrap_content"
26 android:layout_weight="0.00" >
27
28 <LinearLayout
29 android:layout_width="match_parent"
30 android:layout_height="wrap_content"
31 android:baselineAligned="true" >
32
33
34 <Button
35 android:id="@+id/button1"
36 android:layout_width="0dp"
37 android:layout_weight="2"
38 android:layout_height="match_parent"
39 android:background="@drawable/upgradetest"
40 android:onClick="button1click" />
41
42 <Button
43 android:id="@+id/button2"
44 style="?android:attr/buttonStyleSmall"
45 android:layout_width="0dp"
46 android:layout_weight="2"
47 android:layout_height="match_parent"
48 android:background="@drawable/globaltest"
49 android:onClick="button2click" />
50
51 <Button
52 android:id="@+id/button3"
53 style="?android:attr/buttonStyleSmall"
54 android:layout_width="0dp"
55 android:layout_weight="2"
56 android:layout_height="match_parent"
57 android:background="@drawable/datetest"
58 android:onClick="button3click" />
59
60 <Button
61 android:id="@+id/button5"
62 style="?android:attr/buttonStyleSmall"
63 android:layout_width="0dp"
64 android:layout_weight="2"
65 android:layout_height="match_parent"
66 android:layout_gravity="right"
67 android:background="@drawable/mehrtest"
68 android:onClick="button5click" />
69 </LinearLayout>
70
71 </FrameLayout>
72
73 </LinearLayout>
74
75</FrameLayout>

main.java

1package com.example.lauffinderpro;
2
3import java.net.URISyntaxException;
4
5import android.net.MailTo;
6import android.net.Uri;
7import android.os.Bundle;
8import android.annotation.SuppressLint;
9import android.app.Activity;
10import android.app.AlertDialog;
11import android.content.Context;
12import android.content.DialogInterface;
13import android.content.Intent;
14import android.util.Log;
15import android.view.KeyEvent;
16import android.view.Menu;
17import android.view.View;
18import android.view.View.OnClickListener;
19import android.webkit.GeolocationPermissions;
20import android.webkit.WebChromeClient;
21import android.webkit.WebView;
22import android.webkit.WebViewClient;
23import android.widget.Button;
24import android.widget.ImageButton;
25
26public class MainActivity extends Activity {
27  
28  
29  protected void onCreate(Bundle savedInstanceState) {
30  super.onCreate(savedInstanceState);
31  setContentView(R.layout.activity_main);
32  
33  
34  //startet Upgrade als Standard
35  
36  @SuppressLint("SetJavaScriptEnabled")
37  
38  
39  WebView myWebView = (WebView) findViewById (R.id.webView1);
40  myWebView.getSettings().setJavaScriptEnabled(true);
41  myWebView.loadUrl("WEBSITE");
42  myWebView.setWebViewClient(new WebViewClient());
43  
44  
45  }
46  
47  
48  
49  /*public boolean onCreateOptionsMenu(Menu menu) {
50  // Inflate the menu; this adds items to the action bar if it is present.
51  getMenuInflater().inflate(R.menu.main, menu);
52  return true;
53  }
54  */
55
56  
57  public boolean shouldOverrideUrlLoading(WebView view, String url) {
58  if (url.startsWith("mailto:")) {
59  Intent intent = new Intent(Intent.ACTION_VIEW,
60  Uri.parse(url));
61  startActivity(intent);
62  }else if(url.startsWith("http:") || url.startsWith("https:")) {
63  view.loadUrl(url);
64  }
65  return true;
66  }
67  
68  
69  public void button1click (View view) {
70  
71  Code
72  
73  }
74  
75  
76  public void button2click (View view) {
77  
78  Code
79  
80  }
81
82
83  
84  public void button3click (View view) {
85  
86  Code
87  
88  }
89  
90  
91  
92  public void button5click (View view) {
93  
94  Code
95  
96  }
97
98  
99  
100}

EDIT:

If I try this I get the error message "The method replaseFirst(String) is undefined for the type String". In cause of this I changed url.replaseFirst to url.replaceFirst but his needs a secound argument so I have to write url.replaceFirst("mailto:", X );. For X I can type mail,url or null. I tryed everyone, by each I get the message that I have to add a return statement, so I did it with return false. Now I have this code:

public class MyWebViewClient extends WebViewClient {
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
                if(url.startsWith("mailto:")) {
                      String mail = url.replaceFirst ("mailto:", mail);
                      Intent intent = new Intent(Intent.ACTION_SEND);
                      intent.setType("message/rfc822");
                      intent.putExtra(Intent.EXTRA_EMAIL, mail );


                      startActivity(Intent.createChooser(intent, "Send Email"));
             }
                return false;
        }
    }

This does not work. So I try intent.setType("message/rfc822"); instead of intent.setType("text/plain"); but this also does not work.

What I have done wrong?

EDIT2:

new code:

public boolean shouldOverrideUrlLoading(WebView view, String url) {
            if(url.startsWith("mailto:")) {
                String mail = url.replaceFirst("mailto:", "");
                Intent intent = new Intent(Intent.ACTION_SEND);
                intent.setType("text/plain");
                intent.putExtra(Intent.EXTRA_EMAIL, mail );

                startActivity(Intent.createChooser(intent, "Send Email"));
             }  
            else if(url.startsWith("http:") || url.startsWith("https:")) {
                    view.loadUrl(url);
                }
                return true;
        }
like image 313
Tom Hans Avatar asked Apr 11 '13 10:04

Tom Hans


People also ask

Why are mailto links not working?

If mailto links don't open for you the way they should, a quick look at the system or browser settings should do the job. In Windows, head to Settings -> Apps -> Default apps. Scroll down and pick “Choose default apps by protocol” from the menu. For 'Mailto', choose the client of your choice.

Does mailto work on mobile?

# The pros of mailto email linkson mobile devices, users pretty much have to set up a default email address, so clicking this link does exactly what most mobile users intend: it opens up their compose dialog.

How do I open a mailto link?

Go to a website that has mailto links and click on an email address. If were not already logged into your USD Gmail account, it will prompt you to log in. If you were logged in already, then it should automatically redirect to a Gmail "New Message" window.


1 Answers

To force the open of mail client you can try that:

if(url.startsWith("mailto:")) {
  String mail = url.replaceFirst("mailto:", "");
  Intent intent = new Intent(Intent.ACTION_SEND);
  intent.setType("text/plain");
  intent.putExtra(Intent.EXTRA_EMAIL, mail );
  // intent.putExtra(Intent.EXTRA_SUBJECT, "Subject"); // if you want extra
  // intent.putExtra(Intent.EXTRA_TEXT, "I'm email body."); // if you want extra

  startActivity(Intent.createChooser(intent, "Send Email"));
} else if ... {
   // your code as is
}

but other "send" apps open too, depends of support of Intent.ACTION_SEND

Instead of intent.setType("text/plain"); here is suggested the use of intent.setType("message/rfc822"); but I have never tested.


Edit:

change lines of main.java:

// ...
WebView myWebView = (WebView) findViewById (R.id.webView1);
myWebView.getSettings().setJavaScriptEnabled(true);
myWebView.setWebViewClient(new MyWebViewClient()); // you name your class MyWebViewClient not WebViewClient
myWebView.loadUrl("WEBSITE"); // also change line order
// ...
like image 69
madlymad Avatar answered Oct 04 '22 02:10

madlymad