Nice programing

인 텐트를 통해 이메일 프로그램을 여는 방법 (이메일 프로그램 만 해당)

nicepro 2020. 10. 25. 13:00
반응형

인 텐트를 통해 이메일 프로그램을 여는 방법 (이메일 프로그램 만 해당)


사용자가 다른 사용자에게 빠른 이메일을 보낼 수 있도록 내 애플리케이션의 일부를 설정하고 싶습니다. 이것을 설정하는 것은 그리 어렵지 않습니다.

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

이 솔루션에는 몇 가지 흥미로운 측면이 있습니다.

  1. ACTION_VIEW 작업은 "mailto :"링크에 더 적합하기 때문에 사용하고 있습니다. 특정 작업을 제공 할 수는 없지만 불만족스러운 결과가 나타날 수 있습니다 (예 : 연락처에 링크를 추가할지 묻는 메시지가 표시됨).

  2. 이것은 "공유"링크이므로 mailto 링크 임에도 불구하고 단순히 이메일 주소를 포함하지 않습니다. 효과가있다.

  3. 관련된 선택자가 없습니다. 그 이유는 사용자가 기본값을 이용할 수 있도록하기 위함입니다. 그들이 기본 이메일 프로그램을 설정했다면, 선택자를 완전히 우회하여 바로 그 프로그램으로 이동할 것입니다 (제 생각에 좋게 보이지만 그렇지 않으면 논쟁 할 수 있습니다).

물론 내가 생략하고있는 많은 기교가 있지만 (예를 들어 주제 / 본문을 적절하게 인코딩하는 것과 같은), 당신은 스스로 알아낼 수 있어야합니다.


이것은 나를 위해 일했습니다.

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 는 이메일 클라이언트와 함께 지옥의 앱을 엽니 다.

따라서 이것에 대한 해결책은 둘 다 사용하는 것입니다.

  1. 먼저 mailto 인 텐트를 사용하여 인 텐트 활동 해결
  2. 그런 다음 필요한 데이터를 보내기 위해 해결 된 각 활동에 데이터를 설정합니다.
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;
}

참고 URL : https://stackoverflow.com/questions/3312438/how-to-open-email-program-via-intents-but-only-an-email-program

반응형