인 텐트를 통해 이메일 프로그램을 여는 방법 (이메일 프로그램 만 해당)
사용자가 다른 사용자에게 빠른 이메일을 보낼 수 있도록 내 애플리케이션의 일부를 설정하고 싶습니다. 이것을 설정하는 것은 그리 어렵지 않습니다.
Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("text/plain");
intent.putExtra(Intent.EXTRA_SUBJECT, subject);
intent.putExtra(Intent.EXTRA_TEXT, message);
Intent mailer = Intent.createChooser(intent, null);
startActivity(mailer);
그러나 문제는 ACTION_SEND가 이메일 프로그램 이상에서 허용된다는 것입니다. 예를 들어, 내 휴대 전화에서 Facebook 앱, Twitter, reddit이 재미 있고 Bluetooth조차도이 메시지를 보내는 실행 가능한 대안으로 등장합니다. 이 메시지 중 일부 (특히 Twitter)에는 메시지가 너무 깁니다.
긴 메시지 (예 : 이메일)를 지원하는 애플리케이션으로 만 선택기를 제한하는 방법이 있습니까? 아니면 사용자가 선택한 앱을 감지하고 적절하게 메시지를 조정하는 방법이 있습니까?
MIME 유형을 변경하는 것이 답입니다. 이것은 동일한 동작을 변경하기 위해 내 앱에서 한 작업입니다. 나는 사용했다intent.setType("message/rfc822");
Linkify의 작동 방식을 검색하라는 Pentium10의 제안 덕분에이 문제에 대한 훌륭한 해결책을 찾았습니다. 기본적으로 "mailto :"링크를 만든 다음 적절한 Intent를 호출하면됩니다. :
Intent intent = new Intent(Intent.ACTION_VIEW);
Uri data = Uri.parse("mailto:?subject=" + subject + "&body=" + body);
intent.setData(data);
startActivity(intent);
이 솔루션에는 몇 가지 흥미로운 측면이 있습니다.
ACTION_VIEW 작업은 "mailto :"링크에 더 적합하기 때문에 사용하고 있습니다. 특정 작업을 제공 할 수는 없지만 불만족스러운 결과가 나타날 수 있습니다 (예 : 연락처에 링크를 추가할지 묻는 메시지가 표시됨).
이것은 "공유"링크이므로 mailto 링크 임에도 불구하고 단순히 이메일 주소를 포함하지 않습니다. 효과가있다.
관련된 선택자가 없습니다. 그 이유는 사용자가 기본값을 이용할 수 있도록하기 위함입니다. 그들이 기본 이메일 프로그램을 설정했다면, 선택자를 완전히 우회하여 바로 그 프로그램으로 이동할 것입니다 (제 생각에 좋게 보이지만 그렇지 않으면 논쟁 할 수 있습니다).
물론 내가 생략하고있는 많은 기교가 있지만 (예를 들어 주제 / 본문을 적절하게 인코딩하는 것과 같은), 당신은 스스로 알아낼 수 있어야합니다.
이것은 나를 위해 일했습니다.
Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND);
emailIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
emailIntent.setType("vnd.android.cursor.item/email");
emailIntent.putExtra(android.content.Intent.EXTRA_EMAIL, new String[] {"abc@xyz.com"});
emailIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, "My Email Subject");
emailIntent.putExtra(android.content.Intent.EXTRA_TEXT, "My email content");
startActivity(Intent.createChooser(emailIntent, "Send mail using..."));
Intent.EXTRA_EMAIL
여분을 포함 해 보셨습니까 ?
Intent mailer = new Intent(Intent.ACTION_SEND);
mailer.setType("text/plain");
mailer.putExtra(Intent.EXTRA_EMAIL, new String[]{"name@email.com"});
mailer.putExtra(Intent.EXTRA_SUBJECT, subject);
mailer.putExtra(Intent.EXTRA_TEXT, bodyText);
startActivity(Intent.createChooser(mailer, "Send email..."));
이로 인해 사용 가능한 수신기 애플리케이션 목록이 제한 될 수 있습니다.
MIME 유형을 전환해야하기 때문에 약간의 오타입니다.
intent.setType("plain/text"); //Instead of "text/plain"
MIME 유형을 일반에서 메시지로 변경해보십시오.
intent.setType("text/message");
이 옵션을 시도하십시오.
Intent intentEmail = new Intent(Intent.ACTION_SEND);
intentEmail.setType("message/rfc822");
이메일 클라이언트에게만 보내기-여러 첨부 파일 포함
많은 솔루션이 있지만 모두 부분적으로 작동합니다.
mailto는 이메일 앱을 적절하게 필터링하지만 스트림 / 파일을 보내지 않을 수 없습니다.
message / rfc822 는 이메일 클라이언트와 함께 지옥의 앱을 엽니 다.
따라서 이것에 대한 해결책은 둘 다 사용하는 것입니다.
- 먼저 mailto 인 텐트를 사용하여 인 텐트 활동 해결
- 그런 다음 필요한 데이터를 보내기 위해 해결 된 각 활동에 데이터를 설정합니다.
private void share()
{
Intent queryIntent = new Intent(Intent.ACTION_SENDTO, Uri.parse("mailto:"));
Intent dataIntent = getDataIntent();
Intent targetIntent = getSelectiveIntentChooser(context, queryIntent, dataIntent);
startActivityForResult(targetIntent);
}
공유 할 필수 데이터로 채워진 필수 데이터 인 텐트 구축
private Intent getDataIntent()
{
Intent dataIntent = buildIntent(Intent.ACTION_SEND, null, "message/rfc822", null);
// Set subject
dataIntent.putExtra(Intent.EXTRA_SUBJECT, title);
//Set receipient list.
dataIntent.putExtra(Intent.EXTRA_EMAIL, toRecipients);
dataIntent.putExtra(Intent.EXTRA_CC, ccRecipients);
dataIntent.putExtra(Intent.EXTRA_BCC, bccRecipients);
if (hasAttachments())
{
ArrayList<Uri> uris = getAttachmentUriList();
if (uris.size() > 1)
{
intent.setAction(Intent.ACTION_SEND_MULTIPLE);
dataIntent.putExtra(Intent.EXTRA_STREAM, uris);
}
else
{
dataIntent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, uris.get(0));
}
}
return dataIntent;
}
protected ArrayList<Uri> getAttachmentUriList()
{
ArrayList<Uri> uris = new ArrayList();
for (AttachmentInfo eachAttachment : attachments)
{
uris.add(eachAttachment.uri);
}
return uris;
}
쿼리 인 텐트에 따라 필수 인 텐트를 필터링하기위한 Utitlity 클래스
// Placed in IntentUtil.java
public static Intent getSelectiveIntentChooser(Context context, Intent queryIntent, Intent dataIntent)
{
List<ResolveInfo> appList = context.getPackageManager().queryIntentActivities(queryIntent, PackageManager.MATCH_DEFAULT_ONLY);
Intent finalIntent = null;
if (!appList.isEmpty())
{
List<android.content.Intent> targetedIntents = new ArrayList<android.content.Intent>();
for (ResolveInfo resolveInfo : appList)
{
String packageName = resolveInfo.activityInfo != null ? resolveInfo.activityInfo.packageName : null;
Intent allowedIntent = new Intent(dataIntent);
allowedIntent.setComponent(new ComponentName(packageName, resolveInfo.activityInfo.name));
allowedIntent.setPackage(packageName);
targetedIntents.add(allowedIntent);
}
if (!targetedIntents.isEmpty())
{
//Share Intent
Intent startIntent = targetedIntents.remove(0);
Intent chooserIntent = android.content.Intent.createChooser(startIntent, "");
chooserIntent.putExtra(android.content.Intent.EXTRA_INITIAL_INTENTS, targetedIntents.toArray(new Parcelable[]{}));
chooserIntent.addFlags(android.content.Intent.FLAG_GRANT_READ_URI_PERMISSION);
finalIntent = chooserIntent;
}
}
if (finalIntent == null) //As a fallback, we are using the sent data intent
{
finalIntent = dataIntent;
}
return finalIntent;
}
'Nice programing' 카테고리의 다른 글
SQL Server에서 주어진 테이블에 대해 CREATE TABLE 문을 어떻게 생성합니까? (0) | 2020.10.25 |
---|---|
Bash의 멀티 스레딩 (0) | 2020.10.25 |
모든 요소에서 클래스를 제거하는 방법 jquery (0) | 2020.10.25 |
Visual Studio 2012의 작업 목록에 표시되지 않는 할일 작업 (0) | 2020.10.25 |
Option Strict On이있는 C # 'dynamic'에 해당하는 VB.NET (0) | 2020.10.24 |