2011-06-28 40 views
25

我有一個問題..我只想要電子郵件活動解決意圖ACTION.SEND,但在電子郵件旁邊我也獲得其他應用程序(例如TubeMate),即使我已將MIME類型設置爲' message/rfc822'...任何想法如何才能讓電子郵件應用程序解決它..只有電子郵件應用程序來解決意圖

+0

粘貼您的代碼 – piotrpo

+1

請保留原樣。如果你的數據真的是'message/rfc822'格式,那麼決定是否使用TubeMate取決於用戶,而不是你。 – CommonsWare

+0

@CommonsWare不是真的......我有一項活動可以將電子郵件發送給支持團隊,我不想讓用戶發送電子郵件以外的其他選項。PS:我是一個大粉絲,上個月買了你的書:D – GabrielOshiro

回答

4

在Android中,沒有電子郵件活動這樣的事情。 也沒有意向過濾器,可以創建只包含電子郵件應用程序。每個應用程序(或活動)都可以定義它自己的意圖過濾器。

所以當使用意圖ACTION_SEND時,你必須依靠用戶的智能從選擇器(而不是TubeMate)挑選喜歡的電子郵件應用程序。

+3

同意的方法。事實上,我只是在博客上寫道:http://commonsware.com/blog/2011/06/28/share-where-the-user-wants.html – CommonsWare

61
String recepientEmail = ""; // either set to destination email or leave empty 
Intent intent = new Intent(Intent.ACTION_SENDTO); 
intent.setData(Uri.parse("mailto:" + recepientEmail)); 
startActivity(intent); 

的點是使用ACTION_SENDTO作爲動作和mailto:爲數據。如果您想讓用戶指定目標電子郵件地址,請使用mailto:;如果指定電子郵件發送給自己,用mailto:[email protected]

建議的方法篩選所有的應用程序,可以發送電子郵件(如默認的電子郵件應用程序或Gmail)

+7

這是過濾電子郵件客戶端(或其他可以處理mailto協議的軟件),但有一個明顯的例外:ACTION_SENDTO不允許您發送任何附件。因此,直到你不處理附件時,它才能工作,但如果你這樣做,那麼選擇「message/rfc822」方法。 –

+3

@MikeCamino在4.1附件中適用於我的gmail –

+0

完美的解決方案。謝謝。 – dasar

3

ü也可以使用:

//writes messages only to email clients 
public void setWriteEmailButton() { 
    btnWriteMail.setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(View arg0) { 
      Intent i = new Intent(Intent.ACTION_SENDTO); 
      i.setData(Uri.parse("mailto:")); 
      i.putExtra(Intent.EXTRA_EMAIL , new String[]{mConsultantInfos.getConsultantEMail()}); 
      i.putExtra(Intent.EXTRA_SUBJECT, mContext.getString(R.string.txtSubjectConsultantMail)); 
      i.putExtra(Intent.EXTRA_TEXT , ""); 
      try { 
       startActivity(Intent.createChooser(i, mContext.getString(R.string.txtWriteMailDialogTitle))); 
      } catch (android.content.ActivityNotFoundException ex) { 
       UI.showShortToastMessage(mContext, R.string.msgNoMailClientsInstalled); 
      } 
     } 
    }); 
} 

有樂趣(兩者的組合))

+0

這恰好適用於某些電子郵件應用程序,但它不適用於其他應用程序。在這些「其他」中有K-9(除非你有寫這個的最新版本,我相信)。我強烈建議不要使用這種混合方法。 –

-2

你也可以使用它。這是更有效的

Intent mailIntent = new Intent(Intent.ACTION_SEND); 

    String mailTo[] = new String[] { "MAIL_TO_1", "MAIL_TO_2" }; 
    mailIntent.putExtra(Intent.EXTRA_EMAIL, mailTo); 
    mailIntent.putExtra(Intent.EXTRA_SUBJECT, "Your subject"); 
    mailIntent.putExtra(Intent.EXTRA_TEXT, "MailsBody"); 
    mailIntent.setType("plain/text"); 

    startActivity(Intent.createChooser(mailIntent, "only email client")); 

此代碼示例顯示只有那些設備

+1

這個答案在這個問題的上下文中顯然是錯誤的。這將在我的一臺設備上顯示十幾個應用程序供您選擇,其中兩個是電子郵件應用程序。另外,請詳細說明您的意思_更高效_。 –

+0

MIME類型是「text/plain」而非「plain/text」 –

13

這裏對當前已安裝的電子郵件客戶端是我如何發送電子郵件帶有附件(證明各種MIME類型的附件的工作,即使是在相同的電子郵件),並且只允許使用電子郵件應用程序(對於沒有應用程序支持「mailto」的情況,它也有解決方案)。 起初,我們嘗試並獲得支持mailto:格式的活動。如果沒有找到,我們將獲得支持message/rfc822 MIME類型的所有活動。 我們選擇默認應用程序(如果有默認應用程序)或允許用戶從可用應用程序中進行選擇。 如果沒有應用程序支持mailto:message/rfc822,那麼我們使用默認選擇器。

public static void sendEmail(final Context p_context, final String p_subject, final String p_body, final ArrayList<String> p_attachments) 
{ 
    try 
    { 
     PackageManager pm = p_context.getPackageManager(); 
     ResolveInfo selectedEmailActivity = null; 

     Intent emailDummyIntent = new Intent(Intent.ACTION_SENDTO); 
     emailDummyIntent.setData(Uri.parse("mailto:[email protected]")); 

     List<ResolveInfo> emailActivities = pm.queryIntentActivities(emailDummyIntent, 0); 

     if (null == emailActivities || emailActivities.size() == 0) 
     { 
      Intent emailDummyIntentRFC822 = new Intent(Intent.ACTION_SEND_MULTIPLE); 
      emailDummyIntentRFC822.setType("message/rfc822"); 

      emailActivities = pm.queryIntentActivities(emailDummyIntentRFC822, 0); 
     } 

     if (null != emailActivities) 
     { 
      if (emailActivities.size() == 1) 
      { 
       selectedEmailActivity = emailActivities.get(0); 
      } 
      else 
      { 
       for (ResolveInfo currAvailableEmailActivity : emailActivities) 
       { 
        if (true == currAvailableEmailActivity.isDefault) 
        { 
         selectedEmailActivity = currAvailableEmailActivity; 
        } 
       } 
      } 

      if (null != selectedEmailActivity) 
      { 
       // Send email using the only/default email activity 
       sendEmailUsingSelectedEmailApp(p_context, p_subject, p_body, p_attachments, selectedEmailActivity); 
      } 
      else 
      { 
       final List<ResolveInfo> emailActivitiesForDialog = emailActivities; 

       String[] availableEmailAppsName = new String[emailActivitiesForDialog.size()]; 
       for (int i = 0; i < emailActivitiesForDialog.size(); i++) 
       { 
        availableEmailAppsName[i] = emailActivitiesForDialog.get(i).activityInfo.applicationInfo.loadLabel(pm).toString(); 
       } 

       AlertDialog.Builder builder = new AlertDialog.Builder(p_context); 
       builder.setTitle(R.string.select_mail_application_title); 
       builder.setItems(availableEmailAppsName, new DialogInterface.OnClickListener() 
       { 
        @Override 
        public void onClick(DialogInterface dialog, int which) 
        { 
         sendEmailUsingSelectedEmailApp(p_context, p_subject, p_body, p_attachments, emailActivitiesForDialog.get(which)); 
        } 
       }); 

       builder.create().show(); 
      } 
     } 
     else 
     { 
      sendEmailUsingSelectedEmailApp(p_context, p_subject, p_body, p_attachments, null); 
     } 
    } 
    catch (Exception ex) 
    { 
     Log.e(TAG, "Can't send email", ex); 
    } 
} 

protected static void sendEmailUsingSelectedEmailApp(Context p_context, String p_subject, String p_body, ArrayList<String> p_attachments, ResolveInfo p_selectedEmailApp) 
{ 
    try 
    { 
     Intent emailIntent = new Intent(Intent.ACTION_SEND_MULTIPLE); 

     String aEmailList[] = { "[email protected]"}; 

     emailIntent.putExtra(Intent.EXTRA_EMAIL, aEmailList); 
     emailIntent.putExtra(Intent.EXTRA_SUBJECT, null != p_subject ? p_subject : ""); 
     emailIntent.putExtra(Intent.EXTRA_TEXT, null != p_body ? p_body : ""); 

     if (null != p_attachments && p_attachments.size() > 0) 
     { 
      ArrayList<Uri> attachmentsUris = new ArrayList<Uri>(); 

      // Convert from paths to Android friendly Parcelable Uri's 
      for (String currAttachemntPath : p_attachments) 
      { 
       File fileIn = new File(currAttachemntPath); 
       Uri currAttachemntUri = Uri.fromFile(fileIn); 
       attachmentsUris.add(currAttachemntUri); 
      } 
      emailIntent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, attachmentsUris); 
     } 

     if (null != p_selectedEmailApp) 
     { 
      Log.d(TAG, "Sending email using " + p_selectedEmailApp); 
      emailIntent.setComponent(new ComponentName(p_selectedEmailApp.activityInfo.packageName, p_selectedEmailApp.activityInfo.name)); 

      p_context.startActivity(emailIntent); 
     } 
     else 
     { 
      Intent emailAppChooser = Intent.createChooser(emailIntent, "Select Email app"); 

      p_context.startActivity(emailAppChooser); 
     } 
    } 
    catch (Exception ex) 
    { 
     Log.e(TAG, "Error sending email", ex); 
    } 
} 
+1

真棒修復! rfc822的東西甚至不起作用,我不知道爲什麼每個人都推薦它......也許它曾經在舊的Android上工作 – Soroush

4

這對我的工作只打開電子郵件應用:

Intent intent = new Intent(Intent.ACTION_SENDTO); 
intent.setData(Uri.parse("mailto:[email protected]")); 
startActivity(intent); 
+0

有一些問題?你的郵件? –

+0

在kitkat中有問題,即我嘗試以編程方式進行調用,但我無法 –

6
private void sendEmail(Connect connect) { 
    Intent email = new Intent(Intent.ACTION_SENDTO); 
    email.setData(Uri.parse("mailto:")); 
    email.putExtra(Intent.EXTRA_EMAIL, new String[]{connect.getEmail()}); 
    email.putExtra(Intent.EXTRA_SUBJECT, ""); 
    email.putExtra(Intent.EXTRA_TEXT, ""); 
    try { 
     startActivity(Intent.createChooser(email, getString(R.string.choose_email_client))); 
    } catch (ActivityNotFoundException activityNotFoundException) { 
     UIUtils.showShortSnackBar(fragmentConnectLayout, getString(R.string.no_email_client)); 
    } 
} 

參考https://developer.android.com/guide/components/intents-common.html#Email

3

試試這個

String subject = "Feedback"; 
      String bodyText = "Enter text email"; 
      String mailto = "mailto:[email protected]" + 
        "?cc=" + "" + 
        "&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 
      } 

信用:https://medium.com/@cketti/android-sending-email-using-intents-3da63662c58f

相關問題