如何在AsyncTask类中在android中发送电子邮件

时间:2014-06-05 19:33:34

标签: android multithreading email android-asynctask

每当我运行应用程序时,如何在AssyncTask中在android中发送电子邮件,发生以下错误:

  

从活动上下文之外调用startactivity()需要   flag_activity_new_task标志

这是我的班级

private static final class SendMailPhotoTask extends AsyncTask<Bitmap, Integer, Integer>
{
    private Context mContext;
    private String _email = "shotmail@gmail.com.br";

    private SendMailPhotoTask(Context context)
    {
        mContext = context;
    }       

    @Override
    protected Integer doInBackground(Bitmap... data) 
    {
        for (int i = 0; i < data.length; i++) 
        {
            Bitmap bitmap = data[i];
            String name = String.valueOf(System.currentTimeMillis());
            if (bitmap != null) SendMail(name + ".jpg", bitmap);
        }
        return 1;
    }

    private void SendMail(String name, Bitmap bitmap)
    {
        try{
            Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND);

            emailIntent.setFlags(Intent.FLAG_ACTIVITY_MULTIPLE_TASK);  
            emailIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

            emailIntent.setType("plain/text");
            emailIntent.putExtra(android.content.Intent.EXTRA_EMAIL, new String[] { _email });
            emailIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, "Alerta de Movimento");
            emailIntent.putExtra(Intent.EXTRA_STREAM, bitmap);
            emailIntent.putExtra(android.content.Intent.EXTRA_TEXT, "Foto em anexo");

            //need this to prompts email client only
            emailIntent.setType("message/rfc822");

            mContext.startActivity(Intent.createChooser(emailIntent, "Sending email..."));
        }
        catch(Exception ex)
        {
            Log.e("Send Mail", ex.getMessage());
        }
    }
}

4 个答案:

答案 0 :(得分:1)

使用addFlags。

   emailIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

答案 1 :(得分:0)

这是因为您在参数中传递的上下文类型。

而不是写作:

new SendMailPhotoTask(getApplicationContext())

你应该写:

new SendMailPhotoTask(YourActivity.this)

或者如果你从片段中调用它:

new SendMailPhotoTask(getActivity())

答案 2 :(得分:0)

问题是@ user184994上面指出的问题:您需要提供Activity(而不是getApplicationContext())的实例作为调用startActivity()的上下文。

但是,我应该指出,此代码是AsyncTask的不正确(或至少是不必要的)用法:因为您将发送一个用于发送电子邮件的活动(例如GMail),为什么还需要后台线程?

如果你需要的是发送电子邮件而无需用户干预那么你需要一种不同的方法(可能使用JavaMail或类似的库)。看看javamail-android

答案 3 :(得分:0)

我通过使用这种形式发送没有Intent的电子邮件解决了这个问题。

Sending Emails without User Intervention (no Intents) in Android