Как отправить электронную почту Android с C ++ Builder?

Я видел много примеров в Delphi, а не C ++. Я пытался воссоздать код в C ++, но он вылетает только исключение. Как использовать Intent для С ++?

void __fastcall TForm1::Button1Click(TObject *Sender)
{
callEmail("[email protected]", "Application");
}
//---------------------------------------------------------------------------
void TForm1::callEmail(const String address, const String Subject){
JIntent* intent;
TJIntent* intentTwo;
intent = intentTwo->Create();
intent->setAction(intentTwo->JavaClass->ACTION_SEND);
intent->setFlags(intentTwo->JavaClass->FLAG_ACTIVITY_NEW_TASK);
intent->putExtra(intentTwo->JavaClass->EXTRA_EMAIL, StringToJString(address));
intent->putExtra(intentTwo->JavaClass->EXTRA_SUBJECT, StringToJString(Subject));
intent->setType(StringToJString('vnd.android.cursor.dir/email'));
SharedActivity()->startActivity(intent);
}

Я думаю, может быть, я думаю, что-то нужно изменить в AndroidManifest или пользовательские разрешения?

0

Решение

Ваш код падает, потому что вы неправильно строите объект Intent.

Create() является конструктором в Delphi. intent := TJIntent.Create в Дельфи будет intent = new TJIntent в C ++.

Кроме того, Embarcadero использует интерфейсы для своих платформ мостов iOS / Android, поэтому вы должны использовать предоставленные DelphiInterface<T> typedefs, такие как _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 с mailto: URI вместо этого. Для 1 получателя вы можете поместить адрес прямо в URI и не использовать EXTRA_EMAIL совсем. Для получателей 2+ используйте mailto: URI без адреса и использовать EXTRA_EMAIL для адресов. Это упоминается в документации Android:

Общие намерения | Эл. адрес

Например:

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);
}
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]