如何使用 C++ 生成器发送电子邮件 Android?

How send email Android with c++ builder?

我在 Delphi 中看过很多示例,但没有一个是 C++ 构建器。我试图用 C++ 重新创建代码,但它只运行异常。如何使用Intent to С++?

void __fastcall TForm1::Button1Click(TObject *Sender)
{
    callEmail("russia@gmail.com", "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 中的构造函数。 Delphi 中的 intent := TJIntent.Create 在 C++ 中将是 intent = new TJIntent

此外,Embarcadero 使用其 iOS/Android 桥接框架的接口,因此您应该使用提供的 DelphiInterface<T> typedef,例如 _di_JIntent 而不是直接 JIntent*

此外,JavaClass(以及 iOS 中的 OCClass)是静态的 class 属性。您不需要对象实例来访问它,只需要 class 类型。

此外,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_SENDTOmailto: URI。对于 1 个收件人,您可以将地址直接放在 URI 中,根本不使用 EXTRA_EMAIL。对于 2 个以上的收件人,请使用其中没有地址的 mailto: URI,并使用 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);
}