2011-05-16 161 views
0

我有一些代碼正在偵聽套接字上的消息,並將套接字中的數據解析爲要發送的電子郵件。我能夠創造的意圖,並設置FLAG_ACTIVITY_NEW_TASK標誌就可以了,但是呢,當我打電話 startActivity(Intent.createChooser(intent, "Email"));Android開發 - 從服務開始活動

我得到一個AndoridRuntimeException:從活動上下文之外調用startActivity()需要FLAG_ACTIVITY_NEW_TASK標誌。這真的是你想要的嗎?

什麼混淆我在這是,我已經明確要求 intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

我失去的東西在這裏很明顯?

protected void doEmail(DataInputStream in) throws IOException { 
    String id = in.readUTF(); 
    createEmail(id); 
} 

protected void createEmail(String rawEmailString) { 
    // need to get to, subject, body and path from string 
    String[] stringArray = rawEmailString.split("~"); 
    Intent intent = prepareEmail(stringArray[0], stringArray[1], stringArray[2], stringArray[3]); 
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
    startActivity(Intent.createChooser(intent, "Email")); 
} 

public Intent prepareEmail(String to, String subject, String body, String pathToAttachment){ 
    Intent intent = new Intent(Intent.ACTION_SEND); 
    intent.putExtra(Intent.EXTRA_EMAIL, to); 
    intent.putExtra(Intent.EXTRA_TEXT, body); 
    intent.putExtra(Intent.EXTRA_SUBJECT, subject); 
    intent.putExtra(Intent.EXTRA_STREAM, Uri.parse(pathToAttachment)); 
    intent.setType("*/*"); 

    return intent; 
} 
+1

看起來正確。嘗試一下startActivity(intent),而不是使用選擇器。 – 2011-05-16 18:14:07

+0

感謝羅比,這幫助我朝着正確的方向前進。現在它詢問我是否想用電子郵件或Gmail打開。它會打開罰款,如果我選擇Gmail,但如果我選擇電子郵件,它會顯示一個對話框閱讀「應用程序電子郵件(進程com.google.android.email)意外停止。請再試一次。此語法不支持該標準電子郵件客戶端? – Jeff 2011-05-16 18:23:29

+0

是電子郵件應用程序中設置的電子郵件帳號? – 2011-05-16 18:28:04

回答

1

Intent你從createChooser()回來可能沒有你的旗幟。嘗試將其添加到createChooser()的結果中。

需要注意的是:

  • 有一個服務彈出一個活動是非常不尋常的,應該能夠被用戶禁用,因爲它可以是非常侵入。

  • 有一個服務彈出選擇器是糟糕的用戶體驗。你真的認爲,當這個「電子郵件」選擇器對話框出現時,你的用戶將會知道發生了什麼?

+0

Com monsware - 根據Robby的建議,我實際上刪除了這一點,正如我注意到的那樣,它現在還在繼續,但似乎在崩潰電子郵件應用程序,或者如果我選擇gmail,啓動,但沒有附件發送。該方法當前讀取 '\t保護無效createEmail(字符串rawEmailString){ \t //需要從字符串 \t \t字符串[]字符串數組= rawEmailString.split到達,主題,正文和路徑( 「〜」);意圖intent = prepareEmail(stringArray [0],stringArray [1],stringArray [2],stringArray [3]); \t \t intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); \t \t startActivity(intent); \t} \t' – Jeff 2011-05-18 13:28:48

+0

@Jeff:在Eclipse中使用'adb logcat',DDMS或DDMS透視圖來檢查LogCat並查看與崩潰相關的堆棧跟蹤。據推測,這些應用程序無法讀取您的附件文件。 – CommonsWare 2011-05-18 13:32:15

+0

會給一個嘗試,謝謝 – Jeff 2011-05-18 14:12:39