2015-12-15 4 views
0

Я видел много примеров в Delphi, а не один строитель на C++. Я попытался воссоздать код на C++, но он испустил только исключение. Как использовать намерение для С ++?Как отправить электронную почту Android с помощью C++ builder?

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

I thnik, может быть, я думаю, что, возможно, что-то нужно изменить в androidmanifest или с разрешения пользователя?

ответ

0

Ваш код сбой, потому что вы неправильно строите объект Intent.

Create() является конструктором в Delphi. intent := TJIntent.Create в Delphi будет intent = new TJIntent в C++.

Кроме того, Embarcadero использует интерфейсы для своих IOS/Android каркасов мостовидных, так что вы должны использовать предоставленные DelphiInterface<T> определения типов, такие как _di_JIntent вместо JIntent* непосредственно.

Также, JavaClassOCClass в iOS) является свойством статического класса. Вам не нужен экземпляр объекта для доступа к нему, просто тип класса.

Кроме того, 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 с URI mailto:. Для 1 получателя вы можете поместить адрес непосредственно в URI, а не использовать EXTRA_EMAIL. Для 2+ получателей используйте URI mailto: без адреса в нем и используйте 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' должен содержать массив строк, даже если он имеет только 1 элемент. Используйте 'TJavaObjectArray ' для создания этого массива. См. [Этот ответ] (http://stackoverflow.com/a/19344140/65863) для примера. –

Смежные вопросы