Intereting Posts
Настройка мультиплатформенного проекта CapturedTypeConstructor (*) не является подтипом RealmModel База данных Kotlin и Firestore, запрос по имени Ошибка Сохранить / Восстановить состояние NestedScrollView с несколькими RecyclerViews и другими видами Может ли кто-нибудь здесь подробно описать структуру проекта приложения «Котлин / Родник»? Кроме того, особенности работы различных модулей Абонент RxJava2 PublishSubject не может получать элементы при вызове из нескольких потоков, используя SingleScheduler Kotlin: как наследовать от подписчика RxJava Предоставляет ли Kotlin дополнительную безопасность? Kotlin: какой формат использовать для документации? Почему инициализаторы свойств не вызывают пользовательский сеттер? Kotlin список vs массива Как реализовать свойство, которое извлекается из определенного источника, пока оно не будет установлено непосредственно в Котлин? Кинжал 2 Именован не может быть предоставлен без метода @Provides Безопасно ли вызывать kclass.memberProperties на неизвестном (Any) объекте? ручка onKeyDown с использованием RxAndroid

Как передать массив строк в намерение электронной почты Android

Я пытаюсь отправить по электронной почте программно в котлин.

Вот мой код, который я перевел с примера 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 говорится, что Intent.EXTRA_EMAIL – это «Строковый массив всех адресов электронной почты получателей». Как определить переменную addressees ?

EDIT: Я обнаружил, что если я буду жестко закодировать свой адрес электронной почты,

 val addressees = arrayOf("me@email.com") 

то приложение работает так, как ожидалось. Когда я доберусь до приложения электронной почты, мой адрес находится в поле «Кому:», и я могу отправить почту себе. Если, однако, я печатаю один и тот же адрес в программе, он не отображается в почтовом клиенте. Более того, когда я смотрю на него под отладчиком, намерение показывает точно такие же значения в обоих направлениях. Любопытный и любопытный.

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> 

Ваш оператор TO выглядит правильно, я не думаю, что вам нужно быть явным (то есть, используя arrayOf<String>(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

Вот пример кода, который работает, т. Е. Заполняет поле «Кому» в приложении электронной почты.

 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-файле. Не могли бы вы опубликовать его?

Я попробовал предложение Les использовать arrayOf(to.toString()) , но в студии Android arrayOf(to.toString()) .toString() указывающее, что он знал, что это была строка. Затем я попытался быть более явным:

 val addressees: Array<String> = arrayOf(to) 

и это сработало! Я этого не понимаю. Кажется, что у kotlin не должно быть никаких проблем с типом вывода. Возможно, какой-то гуру это увидит и объяснит; Мне было бы интересно и благодарно.