[英]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_SENDTO
和mailto:
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.