Я видел много примеров в 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 или пользовательские разрешения?
Ваш код падает, потому что вы неправильно строите объект 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);
}
Других решений пока нет …