Как сжать папку и отправить по электронной почте в android

Все: Я пытаюсь отправить папку (в ней много файлов) по электронной почте в Android Development.

Сначала я попытался отправить всю папку напрямую, используя событие щелчка и событие намерения.

Код моей первой попытки показывает следующее:

Моя первая часть кода - событие onclicklistener:

listView.setOnMenuItemClickListener(new SwipeMenuListView.OnMenuItemClickListener() {
                @Override
                public boolean onMenuItemClick(int position, SwipeMenu menu,int index) {

                    switch (index) {
                        case 0:
                            sendEmail(list.get(position).getName());
                            break;

                        case 1:
                            list.remove(position);
                            adapter.notifyDataSetChanged();

                    }

                    return false;
                }
            });

Мой второй код для отправки электронной почты выглядит следующим образом:

    public void sendEmail(String data_path){
        Intent email = new Intent(Intent.ACTION_SEND);
        File file_location = new File(SDCard, data_path);
        email.setType("vnd.android.cursor.dir/email");
        email.putExtra(Intent.EXTRA_EMAIL, new String[]{"[email protected]"});  //set up email
        email.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(file_location));   //add attachment
        email.putExtra(Intent.EXTRA_SUBJECT, "Subject");
        startActivity(Intent.createChooser(email, "pick an Email provider"));

}

Когда я запускаю этот код, он отлично работает, чтобы перейти к отправителю электронной почты, но без реализации какой-либо папки инструмент электронной почты пуст.

Мне интересно, нельзя ли отправить папку напрямую по электронной почте.

Теперь я пытаюсь найти другой способ решить эту проблему: Я планирую сначала сжать папку (.zip), а затем отправить zip-файл по электронной почте всего за один клик., но я не могу найти никаких решений, показывающих, как сжать папку и отправить zip-файл всего за одно событие щелчка. Я имею в виду, что мне нужно решение, которое:

  1. Щелкает файл, который необходимо отправить (событие щелчка завершено)
  2. После запуска события щелчка приложение сжимает выбранный файл в zip-файл.
  3. ZIP-файл будет автоматически добавлен в качестве почтовых инструментов, ожидающих отправки.

Я был в ловушке там в течение многих дней и все еще не мог найти никаких ответов, я также ищу в StackOverflow, но большинство вопросов касаются того, как сжать файл или отправить файл по электронной почте. Я ищу способ сжать папку и отправить zip-файл за один клик.

Если у вас есть идеи, я буду очень признателен!

Вы не можете отправлять папки прямо из электронной почты, предварительно не сжав их в .zip или .rar, также вам нужно отправить папку или вы можете отправлять файлы независимо? если вы можете отправить файлы без папки, вы должны зациклить свою папку и отправить все файлы по электронной почте

Gastón Saillén 10.03.2018 03:13

@ Gastón Saillén, Спасибо за ваше предложение, я также рассмотрел ваше решение, проблема в том, что в этой папке более 50+ файлов, если я отправлю каждый файл независимо, это будет набор имплементаций электронной почты, которые повлияют на эффективность, Я просто хочу отправить всю эту папку (добавить эту папку в качестве инструмента) по электронной почте, не отправляя отдельные файлы по одному, но я попытался отправить папку напрямую, это также не удалось (почтовые инструменты пусты). Я был в ловушке.

bricker 10.03.2018 03:22

я так понимаю, вы это проверили? stackoverflow.com/questions/25562262/…

Gastón Saillén 10.03.2018 03:24
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
3
1 018
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вот обходной путь для преобразования вашей папки в zip-архив.

Сначала предоставьте разрешения:

<uses-permission android:name = "android.permission.WRITE_INTERNAL_STORAGE" />
<uses-permission android:name = "android.permission.WRITE_EXTERNAL_STORAGE"/>

А затем используйте это, чтобы преобразовать вашу папку:

/*
 * 
 * Zips a file at a location and places the resulting zip file at the toLocation
 * Example: zipFileAtPath("downloads/myfolder", "downloads/myFolder.zip");
 */

public boolean zipFileAtPath(String sourcePath, String toLocation) {
    final int BUFFER = 2048;

    File sourceFile = new File(sourcePath);
    try {
        BufferedInputStream origin = null;
        FileOutputStream dest = new FileOutputStream(toLocation);
        ZipOutputStream out = new ZipOutputStream(new BufferedOutputStream(
                dest));
        if (sourceFile.isDirectory()) {
            zipSubFolder(out, sourceFile, sourceFile.getParent().length());
        } else {
            byte data[] = new byte[BUFFER];
            FileInputStream fi = new FileInputStream(sourcePath);
            origin = new BufferedInputStream(fi, BUFFER);
            ZipEntry entry = new ZipEntry(getLastPathComponent(sourcePath));
            out.putNextEntry(entry);
            int count;
            while ((count = origin.read(data, 0, BUFFER)) != -1) {
                out.write(data, 0, count);
            }
        }
        out.close();
    } catch (Exception e) {
        e.printStackTrace();
        return false;
    }

Вот еще один пример:

private static void zipFolder(String inputFolderPath, String outZipPath) {
    try {
        FileOutputStream fos = new FileOutputStream(outZipPath);
        ZipOutputStream zos = new ZipOutputStream(fos);
        File srcFile = new File(inputFolderPath);
        File[] files = srcFile.listFiles();
        Log.d("", "Zip directory: " + srcFile.getName());
        for (int i = 0; i < files.length; i++) {
            Log.d("", "Adding file: " + files[i].getName());
            byte[] buffer = new byte[1024];
            FileInputStream fis = new FileInputStream(files[i]);
            zos.putNextEntry(new ZipEntry(files[i].getName()));
            int length;
            while ((length = fis.read(buffer)) > 0) {
                zos.write(buffer, 0, length);
            }
            zos.closeEntry();
            fis.close();
        }
        zos.close();
    } catch (IOException ioe) {
        Log.e("", ioe.getMessage());
    }
}

Также вы можете использовать эта библиотека, чтобы заархивировать папку или файл.

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

try {
    File input = new File("path/to/your/input/fileOrFolder");
    String destinationPath = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "zippedItem.zip";
    ZipParameters parameters = new ZipParameters();
    parameters.setCompressionMethod(Zip4jConstants.COMP_STORE);
    parameters.setCompressionLevel(Zip4jConstants.DEFLATE_LEVEL_NORMAL);
    File output = new File(destinationPath);
    ZipFile zipFile = new ZipFile(output);
    // .addFolder or .addFile depending on your input
    if (sourceFile.isDirectory())
        zipFile.addFolder(input, parameters);
    else
        zipFile.addFile(input, parameters);
    // Your input file/directory has been zipped at this point and you
    // can access it as a normal file using the following line of code
    File zippedFile = zipFile.getFile();
} catch (ZipException e) {
    Log.e(TAG, Log.getStackTraceString(e));
}

Это должно помочь.

Другие вопросы по теме