Использование намерения для отправки электронной почты вне действия

#java #android #android-intent #android-activity

#java #Android #android-намерение #android-активность

Вопрос:

У меня есть действие «Результаты», которое выполняет некоторые вычисления, и кнопка для отправки пользователем электронного письма, содержащего эти результаты. Для этого я создал класс с именем «Sender», но startActivity не работает в моем классе Sender. Я знаю, что фактическое намерение работает, потому что я мог бы заставить его работать внутри моего действия с результатами, просто не в классе Sender.

 public class Results extends AppCompatActivity {
  @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
          Button sendEmail = (Button) findViewById(R.id.resultsEMAIL);
          sendEmail.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {

            Sender sender = new Sender();
            sender.sendEmail();
        }
    });
 

///////

 public class Sender{

public void sendEmail(){ 
  Intent sendEmail = new
  Intent(Intent.ACTION_SEND_MULTIPLE); 

  ArrayList<Uri>uris = new ArrayList<Uri>(); 
  uri.add(someUri);
  uri.add(otherUri);

sendEmail.setType("message/rfc822");
  sendEmail.putExtra(Intent.EXTRA_EMAIL, allEmails);
  sendEmail.putExtra(Intent.EXTRA_SUBJECT, "Subject"); 
  sendEmail.putExtra(Intent.EXTRA_TEXT, results);
sendEmail.putParcelableArrayListExtra(Intent.EXTRA_STREAM,uris);

    try {
      startActivity(Intent.createChooser(sendEmail, "Send")); } 
    catch
    (android.content.ActivityNotFoundException ex) 
    { Toast.makeText(context, "There are no email clients installed.", Toast.LENGTH_SHORT).show(); }
  }
 

Я попытался передать контекст из результатов

 Results.context.startActivity(Intent.createChooser(SendEmail,"Send"));
 

И я также пытался

 sendEmail.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
 

Независимо от того, что я делаю, я получаю исключение

android.util.Исключение AndroidRuntimeException: для вызова startActivity() из-за пределов контекста действия требуется флаг FLAG_ACTIVITY_NEW_TASK. Это действительно то, что вы хотите?

Должен ли я просто отказаться от попыток сделать это в отдельном классе?? Я хотел создать класс Sender для очистки результатов.

Комментарии:

1. Небольшая часть этого кода будет скомпилирована. Например, Sender не имеет startActivity() метода, StartActivity() в Android SDK нет метода (с большой буквы S ) и т.д. Я предлагаю вам опубликовать фактический код, который вы успешно скомпилировали и запустили, и опубликовать полную трассировку стека Java, связанную с любыми сбоями в этом коде.

2. У @CommonsWare — Sender есть startActivity() . Это в try{}. Но вы правы насчет заглавной буквы S. Это была опечатка.

Ответ №1:

Вам необходимо передать контекст действия в метод sendMail().

  public class Results extends AppCompatActivity {
 @Override
 protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      Button sendEmail = (Button) findViewById(R.id.resultsEMAIL);
      sendEmail.setOnClickListener(new View.OnClickListener() {
         public void onClick(View v) {

        Sender sender = new Sender();
        sender.sendEmail(Results.this);
    }
});
 

И в вашем методе sendMail() используйте context для запуска activity.

     public void sendEmail(Context context){ 
        Intent sendEmail = new Intent(Intent.ACTION_SEND_MULTIPLE); 

         //set data to intent
         context.startActivity(Intent.createChooser(sendEmail, "Send")); 
     } 
 

Комментарии:

1. Сработало отлично. Очень признателен!