답변:
가장 좋고 쉬운 방법은 다음을 사용하는 것입니다 Intent
.
Intent i = new Intent(Intent.ACTION_SEND);
i.setType("message/rfc822");
i.putExtra(Intent.EXTRA_EMAIL , new String[]{"recipient@example.com"});
i.putExtra(Intent.EXTRA_SUBJECT, "subject of email");
i.putExtra(Intent.EXTRA_TEXT , "body of email");
try {
startActivity(Intent.createChooser(i, "Send mail..."));
} catch (android.content.ActivityNotFoundException ex) {
Toast.makeText(MyActivity.this, "There are no email clients installed.", Toast.LENGTH_SHORT).show();
}
그렇지 않으면 자신의 클라이언트를 작성해야합니다.
Intent i = new Intent(Intent.ACTION_SENDTO);
i.setType("message/rfc822");
i.setData(Uri.parse("mailto:"));
사용 .setType("message/rfc822")
또는 선택기는 전송 의도를 지원하는 모든 (많은) 응용 프로그램을 보여줍니다.
message/rfc822
나는 오래 전부터 이것을 사용해 왔으며 전자 메일이 아닌 응용 프로그램이 나타나지 않는 것이 좋습니다. 이메일 보내기 의도를 보내는 또 다른 방법 :
Intent intent = new Intent(Intent.ACTION_SENDTO); // it's not ACTION_SEND
intent.putExtra(Intent.EXTRA_SUBJECT, "Subject of email");
intent.putExtra(Intent.EXTRA_TEXT, "Body of email");
intent.setData(Uri.parse("mailto:default@recipient.com")); // or just "mailto:" for blank
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // this will make such that when user returns to your app, your app is displayed, instead of the email app.
startActivity(intent);
첨부 된 이진 오류 로그 파일이 포함 된 전자 메일을 보내기 위해 현재 허용되는 답변 줄을 따라 무언가를 사용하고있었습니다. GMail과 K-9는 잘 보내며 내 메일 서버에도 잘 도착합니다. 유일한 문제는 첨부 된 로그 파일을 열고 저장하는 데 문제가있는 선택한 Thunderbird 메일 클라이언트였습니다. 실제로 그것은 불평없이 파일을 전혀 저장하지 않았습니다.
이 메일의 소스 코드 중 하나를 살펴본 결과 로그 파일 첨부 파일에 MIME 유형이 있음을 알았습니다 message/rfc822
. 물론 첨부 파일은 첨부 된 이메일이 아닙니다. 그러나 썬더 버드는 그 작은 오류에 정상적으로 대처할 수 없습니다. 그래서 그것은 일종의 충격이었습니다.
약간의 연구와 실험을 한 후 다음 해결책을 찾았습니다.
public Intent createEmailOnlyChooserIntent(Intent source,
CharSequence chooserTitle) {
Stack<Intent> intents = new Stack<Intent>();
Intent i = new Intent(Intent.ACTION_SENDTO, Uri.fromParts("mailto",
"info@domain.com", null));
List<ResolveInfo> activities = getPackageManager()
.queryIntentActivities(i, 0);
for(ResolveInfo ri : activities) {
Intent target = new Intent(source);
target.setPackage(ri.activityInfo.packageName);
intents.add(target);
}
if(!intents.isEmpty()) {
Intent chooserIntent = Intent.createChooser(intents.remove(0),
chooserTitle);
chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS,
intents.toArray(new Parcelable[intents.size()]));
return chooserIntent;
} else {
return Intent.createChooser(source, chooserTitle);
}
}
다음과 같이 사용할 수 있습니다.
Intent i = new Intent(Intent.ACTION_SEND);
i.setType("*/*");
i.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(crashLogFile));
i.putExtra(Intent.EXTRA_EMAIL, new String[] {
ANDROID_SUPPORT_EMAIL
});
i.putExtra(Intent.EXTRA_SUBJECT, "Crash report");
i.putExtra(Intent.EXTRA_TEXT, "Some crash report details");
startActivity(createEmailOnlyChooserIntent(i, "Send via email"));
보다시피, createEmailOnlyChooserIntent 메소드는 올바른 의도와 올바른 MIME 유형으로 쉽게 공급 될 수 있습니다.
그런 다음 ACTION_SENDTO mailto
프로토콜 의도 (이메일 앱만 해당)에 응답하는 사용 가능한 활동 목록을 살펴보고 해당 활동 목록과 올바른 MIME 유형의 원래 ACTION_SEND 의도를 기반으로 선택 자를 구성합니다.
또 다른 장점은 Skype가 더 이상 나열되지 않는다는 것입니다 (rfc822 MIME 유형에 응답 함).
ACTION_SEND
되어 아름답게 정리했습니다.
File
내 Android 앱은 캐치되지 않는 예외가 있었다 경우 백그라운드에서 생성 충돌 로그 파일을 가리키는 인스턴스입니다. 이 예는 이메일 첨부 파일을 추가하는 방법을 보여줍니다. 외부 저장소 (예 : 이미지)에서 다른 파일을 첨부 할 수도 있습니다. crashLogFile
실제 예제를 얻기 위해 해당 줄을 제거 할 수도 있습니다 .
의도를 해결하기 위해 APPS 를 확인 하려면 ACTION_SENDTO를 Action으로 지정하고 mailto를 Data로 지정해야합니다.
private void sendEmail(){
Intent emailIntent = new Intent(Intent.ACTION_SENDTO);
emailIntent.setData(Uri.parse("mailto:" + "recipient@example.com"));
emailIntent.putExtra(Intent.EXTRA_SUBJECT, "My email's subject");
emailIntent.putExtra(Intent.EXTRA_TEXT, "My email's body");
try {
startActivity(Intent.createChooser(emailIntent, "Send email using..."));
} catch (android.content.ActivityNotFoundException ex) {
Toast.makeText(Activity.this, "No email clients installed.", Toast.LENGTH_SHORT).show();
}
}
안드로이드 문서가 설명하는 것처럼 간단한 코드 줄 로이 문제를 해결했습니다.
( https://developer.android.com/guide/components/intents-common.html#Email )
가장 중요한 플래그이다 : 그것은이다 ACTION_SENDTO
, 그리고ACTION_SEND
다른 중요한 라인은
intent.setData(Uri.parse("mailto:")); ***// only email apps should handle this***
당신이 빈을 보내는 경우 그건 그렇고, Extra
의 if()
끝이 작동하지 않습니다 앱은 이메일 클라이언트를 실행하지 않습니다.
안드로이드 문서에 따르면. 인 텐트가 다른 문자 메시지 나 소셜 앱이 아닌 이메일 앱으로 만 처리되도록하려면 ACTION_SENDTO
조치 를 사용 하고 " mailto:
"데이터 체계를 포함 시키십시오 . 예를 들면 다음과 같습니다.
public void composeEmail(String[] addresses, String subject) {
Intent intent = new Intent(Intent.ACTION_SENDTO);
intent.setData(Uri.parse("mailto:")); // only email apps should handle this
intent.putExtra(Intent.EXTRA_EMAIL, addresses);
intent.putExtra(Intent.EXTRA_SUBJECT, subject);
if (intent.resolveActivity(getPackageManager()) != null) {
startActivity(intent);
}
}
Android Beam 및 Bluetooth 와 같이 이메일 클라이언트가 아닌 앱을 사용 .setType("message/rfc822")
하거나 ACTION_SEND
일치시키는 전략 도 있습니다 .
ACTION_SENDTO
및 mailto:
URI 사용 은 완벽하게 작동 하는 것으로 보이며 개발자 설명서에서 권장됩니다 . 그러나 공식 에뮬레이터에서이 작업을 수행하고 이메일 계정이 설정되어 있지 않거나 메일 클라이언트가없는 경우 다음 오류가 발생합니다.
지원되지 않는 동작
해당 조치는 현재 지원되지 않습니다.
아래 그림과 같이:
에뮬레이터가 인 텐트를라는 활동으로 해석 com.android.fallback.Fallback
하면 위의 메시지가 표시됩니다. 분명히 이것은 의도적으로 설계된 것입니다.
앱이이를 우회하여 공식 에뮬레이터에서도 올바르게 작동하도록하려면 이메일을 보내기 전에 확인할 수 있습니다.
private void sendEmail() {
Intent intent = new Intent(Intent.ACTION_SENDTO)
.setData(new Uri.Builder().scheme("mailto").build())
.putExtra(Intent.EXTRA_EMAIL, new String[]{ "John Smith <johnsmith@yourdomain.com>" })
.putExtra(Intent.EXTRA_SUBJECT, "Email subject")
.putExtra(Intent.EXTRA_TEXT, "Email body")
;
ComponentName emailApp = intent.resolveActivity(getPackageManager());
ComponentName unsupportedAction = ComponentName.unflattenFromString("com.android.fallback/.Fallback");
if (emailApp != null && !emailApp.equals(unsupportedAction))
try {
// Needed to customise the chooser dialog title since it might default to "Share with"
// Note that the chooser will still be skipped if only one app is matched
Intent chooser = Intent.createChooser(intent, "Send email with");
startActivity(chooser);
return;
}
catch (ActivityNotFoundException ignored) {
}
Toast
.makeText(this, "Couldn't find an email app and account", Toast.LENGTH_LONG)
.show();
}
개발자 설명서 에서 자세한 정보를 찾으십시오 .
다음은 안드로이드 장치에서 메일 응용 프로그램 을 열고 작성 메일의 To 주소 및 제목 으로 자동 채워지 는 샘플 작업 코드입니다 .
protected void sendEmail() {
Intent intent = new Intent(Intent.ACTION_SENDTO);
intent.setData(Uri.parse("mailto:feedback@gmail.com"));
intent.putExtra(Intent.EXTRA_SUBJECT, "Feedback");
if (intent.resolveActivity(getPackageManager()) != null) {
startActivity(intent);
}
}
setData()
설정하고 Avi를에 설정합니다 putExtra()
. 두 변종 모두 작동합니다. 제거하지만 setData
사용 만 intent.putExtra(Intent.EXTRA_EMAIL, new String[]{"hi@example.com"});
하는이 될 것이다 ActivityNotFoundException
.
내 앱에서 아래 코드를 사용합니다. Gmail과 같은 이메일 클라이언트 앱이 정확하게 표시됩니다.
Intent contactIntent = new Intent(Intent.ACTION_SENDTO, Uri.fromParts("mailto", getString(R.string.email_to), null));
contactIntent.putExtra(Intent.EXTRA_SUBJECT, getString(R.string.email_subject));
startActivity(Intent.createChooser(contactIntent, getString(R.string.email_chooser)));
이메일 클라이언트 (알 수없는 이유로 PayPal) 만 표시됩니다.
public void composeEmail() {
Intent intent = new Intent(Intent.ACTION_SENDTO);
intent.setData(Uri.parse("mailto:"));
intent.putExtra(Intent.EXTRA_EMAIL, new String[]{"hi@example.com"});
intent.putExtra(Intent.EXTRA_SUBJECT, "Subject");
intent.putExtra(Intent.EXTRA_TEXT, "Body");
try {
startActivity(Intent.createChooser(intent, "Send mail..."));
} catch (android.content.ActivityNotFoundException ex) {
Toast.makeText(MainActivity.this, "There are no email clients installed.", Toast.LENGTH_SHORT).show();
}
}
intent.type = "message/rfc822"; intent.type = "text/html";
예외로 이어질 수 있으므로 여기에 추가하지 마십시오 .
Gmail을 찾을 수없는 경우이 기능은 먼저 이메일을 보내기위한 인 텐트 gmail을 지시 한 다음 인 텐트 선택기를 홍보합니다. 많은 상용 앱 에서이 기능을 사용했으며 정상적으로 작동합니다. 그것이 당신을 도울 것입니다 희망 :
public static void sentEmail(Context mContext, String[] addresses, String subject, String body) {
try {
Intent sendIntentGmail = new Intent(Intent.ACTION_VIEW);
sendIntentGmail.setType("plain/text");
sendIntentGmail.setData(Uri.parse(TextUtils.join(",", addresses)));
sendIntentGmail.setClassName("com.google.android.gm", "com.google.android.gm.ComposeActivityGmail");
sendIntentGmail.putExtra(Intent.EXTRA_EMAIL, addresses);
if (subject != null) sendIntentGmail.putExtra(Intent.EXTRA_SUBJECT, subject);
if (body != null) sendIntentGmail.putExtra(Intent.EXTRA_TEXT, body);
mContext.startActivity(sendIntentGmail);
} catch (Exception e) {
//When Gmail App is not installed or disable
Intent sendIntentIfGmailFail = new Intent(Intent.ACTION_SEND);
sendIntentIfGmailFail.setType("*/*");
sendIntentIfGmailFail.putExtra(Intent.EXTRA_EMAIL, addresses);
if (subject != null) sendIntentIfGmailFail.putExtra(Intent.EXTRA_SUBJECT, subject);
if (body != null) sendIntentIfGmailFail.putExtra(Intent.EXTRA_TEXT, body);
if (sendIntentIfGmailFail.resolveActivity(mContext.getPackageManager()) != null) {
mContext.startActivity(sendIntentIfGmailFail);
}
}
}
간단한 이것을 시도하십시오
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
buttonSend = (Button) findViewById(R.id.buttonSend);
textTo = (EditText) findViewById(R.id.editTextTo);
textSubject = (EditText) findViewById(R.id.editTextSubject);
textMessage = (EditText) findViewById(R.id.editTextMessage);
buttonSend.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
String to = textTo.getText().toString();
String subject = textSubject.getText().toString();
String message = textMessage.getText().toString();
Intent email = new Intent(Intent.ACTION_SEND);
email.putExtra(Intent.EXTRA_EMAIL, new String[] { to });
// email.putExtra(Intent.EXTRA_CC, new String[]{ to});
// email.putExtra(Intent.EXTRA_BCC, new String[]{to});
email.putExtra(Intent.EXTRA_SUBJECT, subject);
email.putExtra(Intent.EXTRA_TEXT, message);
// need this to prompts email client only
email.setType("message/rfc822");
startActivity(Intent.createChooser(email, "Choose an Email client :"));
}
});
}
다른 해결책은 일 수 있습니다
Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND);
emailIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
emailIntent.setType("plain/text");
emailIntent.setClassName("com.google.android.gm", "com.google.android.gm.ComposeActivityGmail");
emailIntent.putExtra(android.content.Intent.EXTRA_EMAIL, new String[]{"someone@gmail.com"});
emailIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, "Yo");
emailIntent.putExtra(android.content.Intent.EXTRA_TEXT, "Hi");
startActivity(emailIntent);
대부분의 안드로이드 기기에 Gmail 앱이 이미 설치되어 있다고 가정합니다.
이 코드를 사용하여 기본 메일 앱 작성 섹션을 직접 시작하여 메일을 보냈습니다.
Intent i = new Intent(Intent.ACTION_SENDTO);
i.setType("message/rfc822");
i.setData(Uri.parse("mailto:"));
i.putExtra(Intent.EXTRA_EMAIL , new String[]{"test@gmail.com"});
i.putExtra(Intent.EXTRA_SUBJECT, "Subject");
i.putExtra(Intent.EXTRA_TEXT , "body of email");
try {
startActivity(Intent.createChooser(i, "Send mail..."));
} catch (android.content.ActivityNotFoundException ex) {
Toast.makeText(this, "There are no email clients installed.", Toast.LENGTH_SHORT).show();
}
이 방법은 저에게 효과적입니다. Gmail 앱 (설치된 경우)을 열고 mailto를 설정합니다.
public void openGmail(Activity activity) {
Intent emailIntent = new Intent(Intent.ACTION_VIEW);
emailIntent.setType("text/plain");
emailIntent.setType("message/rfc822");
emailIntent.setData(Uri.parse("mailto:"+activity.getString(R.string.mail_to)));
emailIntent.putExtra(Intent.EXTRA_SUBJECT, activity.getString(R.string.app_name) + " - info ");
final PackageManager pm = activity.getPackageManager();
final List<ResolveInfo> matches = pm.queryIntentActivities(emailIntent, 0);
ResolveInfo best = null;
for (final ResolveInfo info : matches)
if (info.activityInfo.packageName.endsWith(".gm") || info.activityInfo.name.toLowerCase().contains("gmail"))
best = info;
if (best != null)
emailIntent.setClassName(best.activityInfo.packageName, best.activityInfo.name);
activity.startActivity(emailIntent);
}
/**
* Will start the chosen Email app
*
* @param context current component context.
* @param emails Emails you would like to send to.
* @param subject The subject that will be used in the Email app.
* @param forceGmail True - if you want to open Gmail app, False otherwise. If the Gmail
* app is not installed on this device a chooser will be shown.
*/
public static void sendEmail(Context context, String[] emails, String subject, boolean forceGmail) {
Intent i = new Intent(Intent.ACTION_SENDTO);
i.setData(Uri.parse("mailto:"));
i.putExtra(Intent.EXTRA_EMAIL, emails);
i.putExtra(Intent.EXTRA_SUBJECT, subject);
if (forceGmail && isPackageInstalled(context, "com.google.android.gm")) {
i.setPackage("com.google.android.gm");
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(i);
} else {
try {
context.startActivity(Intent.createChooser(i, "Send mail..."));
} catch (ActivityNotFoundException e) {
Toast.makeText(context, "No email app is installed on your device...", Toast.LENGTH_SHORT).show();
}
}
}
/**
* Check if the given app is installed on this devuice.
*
* @param context current component context.
* @param packageName The package name you would like to check.
* @return True if this package exist, otherwise False.
*/
public static boolean isPackageInstalled(@NonNull Context context, @NonNull String packageName) {
PackageManager pm = context.getPackageManager();
if (pm != null) {
try {
pm.getPackageInfo(packageName, 0);
return true;
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
}
return false;
}
Intent emailIntent = new Intent(Intent.ACTION_SENDTO, Uri.fromParts(
"mailto","ebgsoldier@gmail.com", null));
emailIntent.putExtra(Intent.EXTRA_SUBJECT, "Forgot Password");
emailIntent.putExtra(Intent.EXTRA_TEXT, "Write your Pubg user name or Phone Number");
startActivity(Intent.createChooser(emailIntent, "Send email..."));**strong text**
이 시도:
String mailto = "mailto:bob@example.org" +
"?cc=" + "alice@example.com" +
"&subject=" + Uri.encode(subject) +
"&body=" + Uri.encode(bodyText);
Intent emailIntent = new Intent(Intent.ACTION_SENDTO);
emailIntent.setData(Uri.parse(mailto));
try {
startActivity(emailIntent);
} catch (ActivityNotFoundException e) {
//TODO: Handle case where no email app is available
}
위 코드는 이메일을 보낼 준비가되어있는 사용자가 선호하는 이메일 클라이언트를 엽니 다.