在Android中验证电子邮件地址(例如从用户输入字段)的好技术是什么?emailvalidator似乎不可用。还有其他库做这个,包括在Android已经或我必须使用RegExp?


当前回答

试试这段代码..它真的有效。

            if (!email
                    .matches("^[\\w-_\\.+]*[\\w-_\\.]\\@([\\w]+\\.)+[\\w]+[\\w]$"))
            {
                Toast.makeText(getApplicationContext(), "Email is invalid",
                        Toast.LENGTH_LONG).show();
                return;
            }

其他回答

自API 8 (android 2.2)以来,有一个模式:android.util. patterns . email_address http://developer.android.com/reference/android/util/Patterns.html

所以你可以用它来验证yourEmailString:

private boolean isValidEmail(String email) {
    Pattern pattern = Patterns.EMAIL_ADDRESS;
    return pattern.matcher(email).matches();
}

如果邮件有效,则返回true

乌利希期刊指南: 这个模式的源代码是:

public static final Pattern EMAIL_ADDRESS
    = Pattern.compile(
        "[a-zA-Z0-9\\+\\.\\_\\%\\-\\+]{1,256}" +
        "\\@" +
        "[a-zA-Z0-9][a-zA-Z0-9\\-]{0,64}" +
        "(" +
            "\\." +
            "[a-zA-Z0-9][a-zA-Z0-9\\-]{0,25}" +
        ")+"
    );

参考网址:http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/2.2_r1.1/android/util/Patterns.java

所以你可以自己构建它来兼容API < 8。

在包android中有一个Patterns类。Util在这里是有用的。以下是我经常使用的验证电子邮件和许多其他东西的方法

private boolean isEmailValid(String email) {
    return !TextUtils.isEmpty(email) && Patterns.EMAIL_ADDRESS.matcher(email).matches();
}

请注意,大多数正则表达式对于国际域名(IDN)和新的顶级域名(如.mobi或.info)无效(如果您检查国家代码或.org, .com, .gov等)。

有效的检查应该将本地部分(在at符号之前)和域部分分开。您还应该考虑本地部分和域的最大长度(包括at号在内的255个字符的总和)。

最好的方法是将地址转换为IDN兼容的格式(如果需要),验证本地部分(RFC),检查地址的长度和检查域的可用性(DNS MX查找)或简单地发送电子邮件。

如果您正在使用API 8或更高版本,您可以使用现成的Patterns类来验证电子邮件。示例代码:

public final static boolean isValidEmail(CharSequence target) {
    if (target == null) 
        return false;

    return android.util.Patterns.EMAIL_ADDRESS.matcher(target).matches();
}

如果您支持的API级别低于8,那么您可以简单地将Patterns.java文件复制到您的项目中并引用它。您可以从这个链接获得Patterns.java的源代码

我知道已经太迟了,但我还是会给你我的答案。

我使用这行代码来检查输入的电子邮件格式:

!TextUtils.isEmpty(getEmail) && android.util.Patterns.EMAIL_ADDRESS.matcher(getEmail).matches();

问题是,它只检查格式而不是拼写。

当我输入@gmal.com漏了I, @yaho.com又漏了一个o。 返回true。因为它满足电子邮件格式的条件。

我所做的是,我使用上面的代码。因为它会返回true如果 如果用户输入@gmail.com ONLY,开头没有文本。

格式检查

如果我输入这个电子邮件,它会给我:true,但拼写是错误的。在 我的textInputLayout错误

电子邮件地址@yahoo.com, @gmail.com, @outlook.com检查器

 //CHECK EMAIL
public boolean checkEmailValidity(AppCompatEditText emailFormat){

    String getEmail = emailFormat.getText().toString();
    boolean getEnd;

    //CHECK STARTING STRING IF THE USER
    //entered @gmail.com / @yahoo.com / @outlook.com only
    boolean getResult = !TextUtils.isEmpty(getEmail) && android.util.Patterns.EMAIL_ADDRESS.matcher(getEmail).matches();

    //CHECK THE EMAIL EXTENSION IF IT ENDS CORRECTLY
    if (getEmail.endsWith("@gmail.com") || getEmail.endsWith("@yahoo.com") || getEmail.endsWith("@outlook.com")){
        getEnd = true;
    }else {
        getEnd = false;
    }

    //TEST THE START AND END
    return (getResult && getEnd);
}

返回:假

返回:真

XML:

<android.support.v7.widget.AppCompatEditText
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:id="@+id/editTextEmailAddress"
            android:inputType="textEmailAddress|textWebEmailAddress"
            android:cursorVisible="true"
            android:focusable="true"
            android:focusableInTouchMode="true"
            android:singleLine="true"
            android:maxLength="50"
            android:theme="@style/EditTextCustom"/>

注意:我试图从EditText中获取值,并使用split对它甚至StringTokenizer。都对我虚情假意。