Android에서 응용 프로그램을 개발 중입니다. 신청서에서 이메일을 보내는 방법을 모르겠습니다.
답변
가장 좋고 쉬운 방법은 다음을 사용하는 것입니다 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();
}
그렇지 않으면 자신의 클라이언트를 작성해야합니다.
답변
사용 .setType("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 유형에 응답 함).
답변
의도를 해결하기 위해 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();
}
개발자 설명서 에서 자세한 정보를 찾으십시오 .