Как изменить код Java для отправки нескольких вложений электронной почты с помощью Sketchware? - PullRequest
5 голосов
/ 28 мая 2020

Я новичок в Java и создаю приложение на Sketchware. Если вы не знакомы с ним, он использует блочное программирование, и вы можете вставлять свой собственный код в настраиваемые блоки.

Поскольку хранилище всех представлений приложений является только локальным, мне нужно, чтобы все выходные PDF-файлы были прикреплены к электронному письму нажатием кнопки.

Приведенный ниже код работает для прикрепления одного файла но нужно прикрепить 6 файлов. Все вызываются из папки / Documents / на устройстве android. Как я могу этого добиться?

emailIntent.putExtra(
    Intent.EXTRA_STREAM,
    Uri.fromFile(
        new java.io.File(Environment.getExternalStorageDirectory() +"/Documents/filename.pdf")
    )
);

Имена файлов, которые у меня есть, находятся в одной папке и называются filename1.pdf, filename2.pdf, et c.

Если я попытаюсь повторить этот код с каждым именем файла, filename6.pdf будет единственным файлом, прикрепленным к электронному письму.

Вот блок-схема Sketchware:

enter image description here

Ответы [ 2 ]

3 голосов
/ 07 июня 2020

Прежде всего, как следует из другого ответа, в настоящее время Intent.ACTION_SEND_MULTIPLE - это способ отправки нескольких файлов.

Но отсутствие функции во встроенных блоках Sketchware на самом деле не является точным ограничением приложения, поскольку он предоставляет следующий блок, который может делать все, что вы хотите, способом android.

enter image description here

И вы уже использовали этот элемент для добавления пользовательского кода. Итак, для решения вашей проблемы блок будет таким:

enter image description here

А вот подробности некоторых пользовательских блоков кода, которые я добавлено:

mail.setAction(Intent.ACTION_SEND_MULTIPLE): Этот пользовательский код был добавлен путем удаления блока по умолчанию Intent> setAction . И название действия говорит само за себя, это позволяет отправлять несколько файлов через намерение.

ArrayList<Uri> uris = new ArrayList<Uri>(): Это объявляет новый ArrayList для хранения списка всех Uri для быть отправлено через намерение.

uris.add(Uri.fromFile(new java.io.File(Environment.getExternalStorageDirectory() + "/Documents/filename1.pdf"))): Эта строка добавляет предоставленный uri к ArrayList named uris . Вызывайте этот блок столько раз, сколько хотите, чтобы добавить в список несколько файлов uri.

mail.putParcelableArrayListExtra(Intent.EXTRA_STREAM, uris): Это связывает uris с EXTRA_STREAM намерения.

Изменить:

Начиная с Android 7.0 и выше, в целях безопасности есть некоторые изменения в политике. Вот почему добавлен этот дополнительный код. Приведенное выше изображение блока уже обновлено с помощью этого кода:

StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder();
StrictMode.setVmPolicy(builder.build());

Хотя рекомендуется использовать android.support.v4.content.FileProvider для решения этой проблемы, но для меньшей поддержки на платформе Sketchware на данный момент лучше для использования вышеуказанного метода.

Вы можете прочитать this для получения дополнительных разъяснений по вышеуказанному исправлению.

2 голосов
/ 02 июня 2020

Может быть, это сработает за вас.

Вот код, который вам нужен для создания emailIntent, содержащего несколько вложений. Ключевое изменение: ACTION_SEND_MULTIPLE.

public static void email(Context context, String emailTo, String emailCC,
    String subject, String emailText, List<String> filePaths)
{
    //need to "send multiple" to get more than one attachment
    final Intent emailIntent = new Intent(Intent.ACTION_SEND_MULTIPLE);
    emailIntent.setType("text/plain");
    emailIntent.putExtra(android.content.Intent.EXTRA_EMAIL, 
        new String[]{emailTo});
    emailIntent.putExtra(android.content.Intent.EXTRA_CC, 
        new String[]{emailCC});
    emailIntent.putExtra(Intent.EXTRA_SUBJECT, subject); 
    emailIntent.putExtra(Intent.EXTRA_TEXT, emailText);
    //has to be an ArrayList
    ArrayList<Uri> uris = new ArrayList<Uri>();
    //convert from paths to Android friendly Parcelable Uri's
    for (String file : filePaths)
    {
        File fileIn = new File(file);
        Uri u = Uri.fromFile(fileIn);
        uris.add(u);
    }
    emailIntent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, uris);
    context.startActivity(Intent.createChooser(emailIntent, "Send mail..."));
}

Обновление

Опубликовать обсуждение в чате. Я хотел бы сделать вывод, что невозможно отправлять несколько вложений по электронной почте с помощью Sketchware, поскольку он не предлагает функции Intent.ACTION_SEND_MULTIPLE. Вам необходимо отправить несколько писем с вложениями одно за другим.

Вышеупомянутого кода будет достаточно для работы, которая вам нужна, когда у вас есть свобода кодирования, и это будет работать с Android , как указано здесь .

Все, что я мог прочитать о Sketchware, это то, что за один раз можно прикрепить только один файл, см. Здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...