Загруженное вложение не помечено для ошибки загрузки в Android

Я записываю телефонные контакты в файл и экспортирую его с помощью действия по электронной почте. Экспорт работает нормально, когда я записываю файл на SD-карту. Но когда я записываю файл в память телефона эмулятора, я получаю почту без вложений. Мой журнал отображает "Загруженное вложение не помечено для загрузки".

Ниже мой код

        file = new File(ctx.getFilesDir().getAbsolutePath(),"file.txt");

        if (file.exists()) {
            file.delete();

        }
        writer = new BufferedWriter(new FileWriter(file));
        for (int i = 0; i < names.size(); i++) {
            writer.write(names.get(i) + "," + phnno.get(i) + "\r\n");
        }

        writer.flush();
        writer.close();

Это мой адрес электронной почты

                                Uri u1 = null;
                                u1 = Uri.fromFile(file);
                                System.out.println("u1 of URI"+u1); //u1 in logcat is "file:///data/data/com.android.contactxport/files/file.txt"


                                Intent sendIntent = new Intent(
                                        Intent.ACTION_SEND);
                                sendIntent.putExtra(Intent.EXTRA_SUBJECT,
                                        "Mail from ContactXPort App");
                                sendIntent
                                        .putExtra(Intent.EXTRA_STREAM, u1);
                                sendIntent.setType("text/html");
                                startActivity(sendIntent);

РЕДАКТИРОВАТЬ: документация о незагруженном приложении говорит

/**
 * Check whether the message with a given id has unloaded attachments.  If the message is
 * a forwarded message, we look instead at the messages's source for the attachments.  If the
 * message or forward source can't be found, we return false
 * @param context the caller's context
 * @param messageId the id of the message
 * @return whether or not the message has unloaded attachments
 */
public static boolean hasUnloadedAttachments(Context context, long messageId) {
    Message msg = Message.restoreMessageWithId(context, messageId);
    if (msg == null) return false;
    Attachment[] atts = Attachment.restoreAttachmentsWithMessageId(context, messageId);
    for (Attachment att: atts) {
        if (!attachmentExists(context, att)) {
            // If the attachment doesn't exist and isn't marked for download, we're in trouble
            // since the outbound message will be stuck indefinitely in the Outbox.  Instead,
            // we'll just delete the attachment and continue; this is far better than the
            // alternative.  In theory, this situation shouldn't be possible.
            if ((att.mFlags & (Attachment.FLAG_DOWNLOAD_FORWARD |
                    Attachment.FLAG_DOWNLOAD_USER_REQUEST)) == 0) {
                Log.d(Logging.LOG_TAG, "Unloaded attachment isn't marked for download: " +
                        att.mFileName + ", #" + att.mId);
                Attachment.delete(context, Attachment.CONTENT_URI, att.mId);
            } else if (att.mContentUri != null) {
                // In this case, the attachment file is gone from the cache; let's clear the
                // contentUri; this should be a very unusual case
                ContentValues cv = new ContentValues();
                cv.putNull(AttachmentColumns.CONTENT_URI);
                Attachment.update(context, Attachment.CONTENT_URI, att.mId, cv);
            }
            return true;
        }
    }
    return false;
}

То, что я понимаю, это путь, проблема здесь. Но путь fyn, когда я напечатал его в журнале.

Буду признателен за любую оказанную помощь. Заранее спасибо.

3 ответа

Решение

Вот что говорится в документации о внутреннем хранилище:

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

Поэтому я сейчас пытаюсь использовать встроенную функцию приложения для работы с электронной почтой Android в приложении.

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

Я обнаружил, что для родного приложения электронной почты, чтобы принять вложение, вам нужно позвонить Intent.setType а также с использованием ACTION_SEND в отличие от ACTION_SENDTO,

Вот как я в конечном итоге построил свое намерение, чтобы вложение электронной почты работало как в gmail, так и в нативных приложениях:

Intent intent  = new Intent(Intent.ACTION_SEND); // SENDTO does not work for native email app
        intent.setData(Uri.fromParts("mailto",to, null));
        intent.putExtra(Intent.EXTRA_EMAIL, new String[] { to });
        intent.putExtra(Intent.EXTRA_SUBJECT, subject);
        intent.putExtra(Intent.EXTRA_TEXT, body);
        intent.setType("message/email");
        if (attachmentInCacheDir != null) {
            intent.putExtra(Intent.EXTRA_STREAM, Uri.parse("content://" + getAuthority(context) + "/" + attachmentInCacheDir.getName()));
        }
        context.startActivityForResult(Intent.createChooser(intent, "Send Email"), 1000);

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

Из моего недавнего опыта, использование Intent.EXTRA_STREAM с внешним файлом Uri - будь то в getExternalCacheDir (), getExternalFilesDir () или Environment.getExternalStorageDirectory () - будет эффективно работать с несколькими приложениями почтового клиента (вероятно, я только протестировано GMail, Evernote и собственный почтовый клиент)... Но, в частности: исключено через собственное почтовое приложение...

Тест, который я провел вчера, включал в себя родное приложение электронной почты для корпоративной учетной записи электронной почты MS Exchange, и я получил отладочное сообщение "Загруженное вложение не помечено для загрузки: ". Почтовое сообщение сначала выглядело правильно, с вложением (даже с указанным размером файла вложения!), Но электронное письмо было отправлено без вложения.

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

Когда я смотрю на ссылочный исходный код, который вы разместили, я думаю, что разработчики приложений для родной электронной почты Android сделали несколько неверные предположения о вложенном файле. Они просто не предусмотрели вложение, полученное из Intent.EXTRA_STREAM... Что странно, поскольку вложение показывается вместе с сообщением перед отправкой, поэтому оно может просто не сохраняться при создании электронной почты в собственной базе данных почтовых приложений или во вложении неправильно помечен / не помечен в процессе.

Я знаю, что это само по себе не отвечает на вопрос, но что касается отправки атташе через нативное приложение электронной почты (насколько я могу судить по Android ICS), я думаю, мы застряли!

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