2011-05-16 141 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