Ваш код сбой, потому что вы неправильно строите объект Intent.
Create()
является конструктором в Delphi. intent := TJIntent.Create
в Delphi будет intent = new TJIntent
в C++.
Кроме того, Embarcadero использует интерфейсы для своих IOS/Android каркасов мостовидных, так что вы должны использовать предоставленные DelphiInterface<T>
определения типов, такие как _di_JIntent
вместо JIntent*
непосредственно.
Также, JavaClass
(и OCClass
в iOS) является свойством статического класса. Вам не нужен экземпляр объекта для доступа к нему, просто тип класса.
Кроме того, C++ использует одиночные кавычки для символьных литералов и двойных кавычек для строковых литералов, тогда как Delphi использует одиночные кавычки для обоих. 'vnd.android.cursor.dir/email'
в C++ не является строковым литералом, вместо этого он представляет собой многобайтовый символьный литерал, который вам не нужен. Вместо этого используйте двойные кавычки.
Кроме того, EXTRA_EMAIL
должен быть выражен как массив строк.
Попробуйте что-то больше, как это:
void TForm1::callEmail(const String address, const String Subject)
{
_di_JIntent intent;
intent = new TJIntent; // or: intent = TJIntent::JavaClass->init();
intent->setAction(TJIntent::JavaClass->ACTION_SEND);
// or: intent = TJIntent::JavaClass->init(TJIntent::JavaClass->ACTION_SEND);
intent->setFlags(TJIntent::JavaClass->FLAG_ACTIVITY_NEW_TASK);
TJavaObjectArray__1<_di_JString> *Recipients = new TJavaObjectArray__1<_di_JString>(1);
Recipients->Items[0] = StringToJString(address);
intent->putExtra(TJIntent::JavaClass->EXTRA_EMAIL, Recipients);
intent->putExtra(TJIntent::JavaClass->EXTRA_SUBJECT, StringToJString(Subject));
intent->setType(StringToJString(L"vnd.android.cursor.dir/email"));
SharedActivity()->startActivity(intent);
}
Теперь, что сказал, вы действительно не должны использовать vnd.android.cursor.dir/email
как намерение MIME-тип. Вместо этого используйте message/rfc822
, или даже plain/text
. Но это не ограничивает намерение просто отправлять почту клиентам, другие приложения также могут поддерживать эти типы. Чтобы отправить электронное письмо с использованием только подлинного почтового клиента, используйте ACTION_SENDTO
с URI mailto:
. Для 1 получателя вы можете поместить адрес непосредственно в URI, а не использовать EXTRA_EMAIL
. Для 2+ получателей используйте URI mailto:
без адреса в нем и используйте EXTRA_EMAIL
для адресов. Об этом говорится в документации Android:
Common Intents | Email
Например:
void TForm1::callEmail(const String address, const String Subject)
{
_di_JIntent intent;
intent = new TJIntent; // or: intent = TJIntent::JavaClass->init();
intent->setAction(TJIntent::JavaClass->ACTION_SENDTO);
intent->setData(StrToJURI(L"mailto:" + address));
// or: intent = TJIntent::JavaClass->init(TJIntent::JavaClass->ACTION_SENDTO, StrToJURI(L"mailto:" + address));
intent->setFlags(TJIntent::JavaClass->FLAG_ACTIVITY_NEW_TASK);
intent->putExtra(TJIntent::JavaClass->EXTRA_SUBJECT, StringToJString(Subject));
intent->setType(StringToJString(L"message/rfc822"));
SharedActivity()->startActivity(intent);
}
Спасибо! Это работает! Еще один маленький вопрос, как запустить приложение электронной почты по умолчанию? –
Как-то EXTRA-MAIL не передается –
'EXTRA_EMAIL' должен содержать массив строк, даже если он имеет только 1 элемент. Используйте 'TJavaObjectArray' для создания этого массива. См. [Этот ответ] (http://stackoverflow.com/a/19344140/65863) для примера. –