2015-12-15 45 views
0

我在Delphi中看過很多例子,而不是一個C++ builder。我試圖在C++中重新創建代碼,但它只能運行異常。如何使用Intent到С++?如何通過C++ builder發送電子郵件Android?

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); 
} 

我thnik,也許我認爲可能需要改變androidmanifest或用戶權限?

回答

0

您的代碼崩潰,因爲您沒有正確構建Intent對象。

Create()是Delphi的構造函數。 Delphi中的intent := TJIntent.Create將是C++中的intent = new TJIntent。另外,Embarcadero爲其iOS/Android橋接框架使用接口,所以您應該直接使用提供的DelphiInterface<T> typedefs,例如_di_JIntent而不是JIntent*

另外,JavaClass(和OCClass在iOS中)是一個靜態類屬性。你不需要一個對象實例來訪問它,只需要類的類型。

此外,C++使用單引號字符文字和雙引號字符串文字,而德爾福使用單引號的兩個。 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+接收者,請使用其中沒有地址的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); 
} 
+0

謝謝!是工作!另一個小問題,如何運行默認的電子郵件應用程序? –

+0

EXTRA-MAIL不通過 –

+0

'EXTRA_EMAIL'必須包含一個字符串數組,即使它只有一個元素。使用'TJavaObjectArray '來創建該數組。有關示例,請參閱[本答案](http://stackoverflow.com/a/19344140/65863)。 –