2015-07-31 3 views
3

Я тестирую создание файла .txt, а затем отправляю его в виде вложения электронной почты с помощью намерения.Android, .txt Вложение электронной почты не отправляется с помощью намерения

Создание .txt файла

try { 
     String fileName = "testFileName.txt"; 
     File root = new File(Environment.getExternalStorageDirectory(), "testDir"); 
     if (!root.exists()) { 
      root.mkdirs(); 
     } 
     File gpxfile = new File(root, fileName); 
     FileWriter writer = new FileWriter(gpxfile); 
     writer.append("Testing email txt attachment."); 
     writer.flush(); 
     writer.close(); 
     sendEmail(gpxfile.getAbsolutePath()); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

Отправка по электронной почте

protected void sendEmail(String fileName){ 
    Intent i = new Intent(Intent.ACTION_SEND); 
    i.setType("message/rfc822"); 
    i.putExtra(Intent.EXTRA_SUBJECT, "Test subject"); 
    i.putExtra(Intent.EXTRA_TEXT, "This is the body of the email"); 
    i.putExtra(Intent.EXTRA_STREAM, Uri.parse(fileName)); 
    try { 
     startActivity(Intent.createChooser(i, "Send mail...")); 
    } catch (android.content.ActivityNotFoundException ex) { 
     Toast.makeText(this, "There are no email clients installed.", Toast.LENGTH_SHORT).show(); 
    } 
} 

И все это, кажется, работает хорошо. Он открывает почтовый клиент, с предметом, телом и крепления всех видимых

Composing email

И посылает просто отлично, указывая есть вложение

Sent email

Но когда я открываю Gmail, нет крепления показано

Gmail, no attachment

Sam е история, когда я просмотреть сообщение электронной почты

Gmail, detailed, no attachment

и просмотр электронной почты по телефону, внутри «Отправленные» папку, также не показывает никакой привязанности

Android, sent, no attachment

код является копией и вставлять из нескольких разных сообщений в SO, и, похоже, у них нет никаких проблем. Где идет файл? Он остановлен gmail? Или вообще не отправлять? Не существует ли файл?

Примечание: У меня есть <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />, установленный в манифесте.

Заранее спасибо.

+0

Вместо создания 'FileWriter' на' File', создать 'FileWriter' из' FileOutputStream' на ' File'. Затем между вашими вызовами 'flush()' и 'close()' в 'FileWriter', вызовите' getFD(). Sync() 'в' FileOutputStream'. Это блокирующий вызов и не будет возвращаться, пока все байты не будут записаны на диск. Посмотрите, поможет ли это. Также обратите внимание, что 'ACTION_SEND' поддерживает' EXTRA_TEXT' или 'EXTRA_STREAM' для' Intent', а не оба одновременно, поэтому не удивляйтесь, если некоторые приложения игнорируют тот или иной. – CommonsWare

+0

@CommonsПожалуйста, спасибо за ввод. Я опубликовал решение, которое сработало для меня - это была просто проблема с этим путем. И спасибо за подсказку на ACTION_SEND. В [Android Docs] (https://developer.android.com/training/basics/intents/sending.html) есть и то, и другое, и как я могу обеспечить, чтобы оба они были включены? – Birrel

+0

«В Android-документы включены оба» - вздох. Я буду работать, чтобы установить это. Цитирование [реальных документов] (http://developer.android.com/reference/android/content/Intent.html#ACTION_SEND): «getType() - это тип MIME отправляемых данных.get * Extra может иметь поле EXTRA_TEXT или EXTRA_STREAM, содержащее данные для отправки. Если используется EXTRA_TEXT, тип MIME должен быть «text/plain»; в противном случае это должен быть тип данных MIME в EXTRA_STREAM. » – CommonsWare

ответ

3

Проблема была в пути к файлу. Сделаны следующие изменения:

sendEmail(gpxfile); // This is the file itself, not the file path 

Тогда на самом деле отправки электронной почты:

protected void sendEmail(File file){ 
    Uri path = Uri.fromFile(file); // This guy gets the job done! 

    Intent i = new Intent(Intent.ACTION_SEND); 
    i.setType("message/rfc822"); 
    i.putExtra(Intent.EXTRA_SUBJECT, "Test subject"); 
    i.putExtra(Intent.EXTRA_TEXT, "This is the body of the email"); 
    i.putExtra(Intent.EXTRA_STREAM, path); // Include the path 
    try { 
     startActivity(Intent.createChooser(i, "Send mail...")); 
    } catch (android.content.ActivityNotFoundException ex) { 
     Toast.makeText(this, "There are no email clients installed.", Toast.LENGTH_SHORT).show(); 
    } 
} 
+0

После того, как через 2 дня вы искали правильный пример, я нашел ваше рабочее решение. Большое спасибо Birrel! – RikiRiocma

Смежные вопросы