我正在尝试以编程方式在kotlin发送电子邮件。
这是我的代码,我从我在网上找到的java示例中翻译过来。
package com.example.emaildemo
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
class MainActivity: AppCompatActivity() {
override fun onCreate(savedInstanceState:Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val editTextTo:EditText = findViewById(R.id.editText)
val editTextSubject:EditText = findViewById(R.id.editText2)
val editTextMessage:EditText = findViewById(R.id.editText3)
val button1:Button = findViewById(R.id.button)
button1.setOnClickListener(View.OnClickListener{
val to = editTextTo.getText().toString()
val subject = editTextSubject.getText().toString()
val message = editTextMessage.getText().toString()
val intent = Intent(Intent.ACTION_SEND)
val addressees = arrayOf(to)
intent.putExtra(Intent.EXTRA_EMAIL, addressees)
intent.putExtra(Intent.EXTRA_SUBJECT, subject)
intent.putExtra(Intent.EXTRA_TEXT, message)
intent.setType("message/rfc822")
startActivity(Intent.createChooser(intent, "Select Email Sending App :"))
})
}
}
它似乎工作正常,但“TO”字段未复制到用户的电子邮件应用程序中。 java代码说:
intent.putExtra(Intent.EXTRA_EMAIL, new String[]{TO});
并且android开发人员docs说Intent.EXTRA_EMAIL是“所有字符串数组”到“收件人电子邮件地址”。我该如何定义addressees
变量?
编辑:我发现如果我硬编码我的电子邮件地址,
val addressees = arrayOf("me@email.com")
然后该应用程序按预期工作。当我到达电子邮件应用程序时,我的地址位于“收件人:”字段中,我可以向自己发送邮件。但是,如果我在程序中键入相同的地址,则它不会显示在电子邮件客户端中。而且,当我在调试器下查看它时,intent会以两种方式显示完全相同的值。 Curiouser和curiouser。
EDIT2
这是我的XML文件。 (不知怎的,我无法正确缩进前两行。)
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="18dp"
android:text="To"
android:id="@+id/textView"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true" />
<EditText
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/editText"
android:layout_below="@+id/textView"
android:layout_centerHorizontal="true"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="18dp"
android:text="Subject"
android:id="@+id/textView2"
android:layout_below="@+id/editText"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true" />
<EditText
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/editText2"
android:layout_below="@+id/textView2"
android:layout_centerHorizontal="true" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="18dp"
android:text="Message"
android:id="@+id/textView3"
android:layout_below="@+id/editText2"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true" />
<EditText
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:inputType="textMultiLine"
android:lines="4"
android:id="@+id/editText3"
android:layout_below="@+id/textView3"
android:layout_centerHorizontal="true" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Click Here To Send Email from android application programmatically"
android:id="@+id/button"
android:layout_below="@+id/editText3"
android:layout_centerHorizontal="true"
android:layout_marginTop="44dp" />
</RelativeLayout>
答案 0 :(得分:3)
您的 TO 声明看起来是正确的,我认为您不需要明确(即使用arrayOf<String>(to)
)。
修改强>
根据您的上次更新,to
未被识别为String
。以下代码有效......
val to = "person@gmail.com"
val subject = "Test"
val message = "Test"
val intent = Intent(Intent.ACTION_SEND)
val addressees = arrayOf(to)
intent.putExtra(Intent.EXTRA_EMAIL, addressees)
intent.putExtra(Intent.EXTRA_SUBJECT, subject)
intent.putExtra(Intent.EXTRA_TEXT, message)
intent.setType("message/rfc822")
startActivity(Intent.createChooser(intent, "Send Email using:"));
对editTextTo.getText().toString()
的调用是返回一个构建器或其他内容而不是真String
。相反,请尝试拨打arrayOf(to.toString())
<强> EDIT2 强>
这是一个有效的代码示例,即填写&#34; To&#34;电子邮件应用中的字段。
package com.x.edittextexp
import android.content.Intent
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.view.View
import android.widget.Button
import android.widget.EditText
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val button: Button = findViewById(R.id.button)
val editTextTo: EditText = findViewById(R.id.editTextTo)
button.setOnClickListener(View.OnClickListener {
val to = editTextTo.getText().toString()
val subject = "Test"
val message = "Test"
val intent = Intent(Intent.ACTION_SEND)
val addressees = arrayOf(to)
intent.putExtra(Intent.EXTRA_EMAIL, addressees)
intent.putExtra(Intent.EXTRA_SUBJECT, subject)
intent.putExtra(Intent.EXTRA_TEXT, message)
intent.setType("message/rfc822")
startActivity(Intent.createChooser(intent, "Send Email using:"));
})
}
}
xml看起来像这样
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_height="match_parent"
android:layout_width="match_parent"
android:orientation="vertical">
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="textEmailAddress"
android:hint="person@gmail.com"
android:id="@+id/editTextTo"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="BUTTON"
android:id="@+id/button"/>
</LinearLayout>
正如你所看到的,差异是微不足道的,但这是有效的,而你的并不是。我怀疑问题出在您的XML文件中。你能发贴吗?
答案 1 :(得分:0)
我尝试了Les使用arrayOf(to.toString())
的建议,但是android studio灰显了.toString()
,表明它已经知道它已经是一个字符串了。然后我试着更明确:
val addressees: Array<String> = arrayOf(to)
它有效!我根本不明白这一点。看起来kotlin不应该对类型推断有任何麻烦。也许一些大师会看到这个并解释它;我感兴趣并感激不尽。