2015-09-02 7 views
2

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

public void emailPDF(View view){ 

    PdfDocument document = getPDF(); 

    ByteArrayOutputStream os = new ByteArrayOutputStream(); 
    try{ 
     document.writeTo(os); 
     document.close(); 
     os.close(); 
    }catch (IOException e){ 
     throw new RuntimeException("Error generating file", e); 
    } 


    Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND); 
    emailIntent.putExtra(android.content.Intent.EXTRA_EMAIL, "[email protected]"); 
    emailIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, "report"); 
    emailIntent.putExtra(android.content.Intent.EXTRA_TEXT, " "); 
    emailIntent.setType("application/pdf"); // accept any image 
    //attach the file to the intent 
    emailIntent.putExtra(Intent.EXTRA_STREAM, os.toByteArray()); 

    startActivity(Intent.createChooser(emailIntent, "Send your email in:")); 
} 

public PdfDocument getPDF(){ 

    PdfDocument document = new PdfDocument(); 
    PdfDocument.PageInfo pageInfo = new PdfDocument.PageInfo.Builder(300, 300, 1).create(); 
    PdfDocument.Page page = document.startPage(pageInfo); 
    View content = findViewById(R.id.scrollView); 
    content.draw(page.getCanvas()); 

    document.finishPage(page); 

    return document; 
} 

ответ

1

EXTRA_STREAM не принимает byte[]. Он принимает Uri, указывая на данные, которые будут переданы. Это может быть File на внешнем накопителе, или content://Uri из FileProvider для файлов на внутренней памяти, или content://Uri из ContentProvider, который пытается служить вашей byte[] (хотя я беспокоиться о куче пространства) и т.д.

+0

Ok Я понял, что я не могу использовать массив байтов на Extra_STREAM и о проблеме пространства кучи. но ты потерял меня на отдыхе, можешь прояснить, пожалуйста? –

+0

@AmmarSamater: Скорее всего, вы используете веб-браузер для просмотра этой страницы. Если вы посмотрите в адресной строке, вы увидите URL-адрес. Это адрес в каком-то месте для потоковой передачи некоторых данных - в этом случае он указывает на веб-сервер, который может передавать эту страницу. Аналогично работает «Ури». Если вы посмотрите на любой рабочий пример EXTRA_STREAM, вы увидите, что он использует 'Uri', а' Uri' обычно укажет на файл или 'ContentProvider'. Обратите внимание, что файл должен находиться на внешнем хранилище, чтобы его можно было легко прочитать приложению, к которому вы его отправляете. – CommonsWare

+0

@AmmarSamater: Так, например, вы можете написать PDF в файл на внешнем хранилище, а затем использовать 'Uri.fromFile()' для преобразования объекта 'File' в' Uri', который вы можете использовать с 'EXTRA_STREAM' , – CommonsWare

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