如何使用 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_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);
}
我在 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_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);
}