繁体   English   中英

如何使用C ++ Builder发送电子邮件Android?

[英]How send email Android with c++ builder?

我在Delphi中看到了许多示例,而没有一个C ++构建器。 我试图在C ++中重新创建代码,但它仅产生异常。 如何将意图用于С++?

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中的构造函数。 intent := TJIntent.Create在Delphi中创建将是intent = new TJIntent在C ++中intent = new TJIntent

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

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

同样,C ++对字符文字使用单引号,对字符串文字使用双引号,而Delphi两者都使用单引号。 C ++中的'vnd.android.cursor.dir/email'不是字符串文字,而是多字节字符文字,这不是您想要的。 请改用双引号。

另外, 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 EXTRA_EMAIL收件人,请使用不带地址的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);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM