2010-07-22 50 views
65

我想設置我的應用程序的一部分,該程序允許用戶將快速電子郵件發送給其他用戶。這不是很難此設置:如何通過Intents(但僅限電子郵件程序)打開電子郵件程序

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應用程序上,微博reddit的是有趣的,甚至藍牙也成爲發送此消息的可行方案。這些信息對於其中一些(特別是Twitter)來說太長了。

有沒有辦法將選擇器限制爲僅支持長消息的應用程序(例如電子郵件)?或者有沒有辦法檢測用戶選擇的應用程序並適當調整消息?

+2

我想知道Linkify類如何決定爲mailto鏈接打開什麼。也許檢查Linkify的源代碼,併發布你的發現。 – Pentium10 2010-07-22 19:24:21

+0

良好的電話 - 我會檢查出來,讓我知道如果我發現任何有趣的事情。 – 2010-07-22 19:27:04

+0

再次感謝Pentium10,在查找Linkify如何做的事情上提出了很好的建議。 – 2010-07-22 19:59:18

回答

77

更改MIME類型就是答案,這就是我在我的應用程序沒有改變相同的行爲。我用intent.setType("message/rfc822");

+1

我不會假設每個電子郵件程序都支持該MIME類型。 – CommonsWare 2010-12-17 01:02:00

+2

在我的設備中列出的Gmail,但也「驅動器」和「AndFTP」 – auval 2013-02-18 13:04:10

+9

我使用新的意圖(Intent.ACTION_SENDTO,Uri.parse(「mailto:」)); – 2015-01-17 07:57:22

4

你有沒有試過包括Intent.EXTRA_EMAIL額外的?

Intent mailer = new Intent(Intent.ACTION_SEND); 
mailer.setType("text/plain"); 
mailer.putExtra(Intent.EXTRA_EMAIL, new String[]{"[email protected]"}); 
mailer.putExtra(Intent.EXTRA_SUBJECT, subject); 
mailer.putExtra(Intent.EXTRA_TEXT, bodyText); 
startActivity(Intent.createChooser(mailer, "Send email...")); 

可能限制可用的接收器應用程序的列表...

+2

我試過這個,沒有幫助。附加功能不用於過濾選擇器中的應用程序。 – 2010-07-22 19:20:12

+0

我認爲唯一的其他解決方案是通過傳遞具有完整的類/包路徑的字符串來啓動特定的郵件程序。這會限制您的用戶使用一個郵件應用程序,但它會阻止其他類型的應用程序(如Twitter)成爲選項... – idolize 2010-07-22 19:29:56

+1

我不太喜歡這個想法,因爲大多數用戶將有兩個默認郵件應用程序開始(標準郵件應用程序和Gmail),我不想猜測他們使用哪一個。 – 2010-07-22 19:34:40

79

由於搜索Linkify如何工作的Pentium10的建議,我已經找到了一個很好的解決方案這一問題。基本上,你只需創建一個「的mailto:」鏈接,然後調用相應的原意,即:

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. 沒有選擇者參與。其原因是讓用戶利用默認設置;如果他們已經設置了一個默認的電子郵件程序,那麼它會讓他們直截了當地完全繞過選擇器(這在我看來很好,你可能會爭辯)。

當然有很多技巧的,我離開了(如正確編碼主題/體),但你應該能夠明白這一點你自己。

+0

從它周圍的所有解決方案爲我工作感謝哥們:) – Bora 2014-10-10 07:27:49

+2

這是最好的方法imo,因爲它不顯示Snapchat,電報和其他應用程序允許文本發送 – WuerfelDev 2016-08-17 15:46:06

+3

如果有人需要的情況下,您指定接收器「&到「 – Umarov 2017-08-25 06:04:36

0

嘗試從普通更改MIME類型的消息

intent.setType("text/message"); 
1

這是一個有點筆誤,因爲你需要切換您的MIME類型:

intent.setType("plain/text"); //Instead of "text/plain" 
27

這爲我工作

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[] {"[email protected]"}); 
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...")); 
+1

效果很好。我喜歡createChooser方法..謝謝.. – jheneghan 2013-06-18 13:13:57

+1

工作就像一個魅力..特別注意,Extra_Email應該在字符串數組中,或者To:將是空的... – Nilesh 2015-08-04 19:58:59

0

試試這個選項:

Intent intentEmail = new Intent(Intent.ACTION_SEND); 
intentEmail.setType("message/rfc822"); 
相關問題