2015-09-02 390 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://UriFileProvider對內部存儲的文件,或者從ContentProvider試圖服務於content://Uribyte[](雖然我擔心的堆空間)等

+0

好吧我明白我不能在Extra_STREAM上使用字節數組,並且關於堆空間問題。但你在其他方面失去了我,你能澄清一下嗎? –

+0

@AmmarSamater:很可能您正在使用Web瀏覽器來查看此頁面。如果你看看地址欄,你會看到一個URL。這是某個地方傳送某些數據的地址 - 在這種情況下,它指向可以傳輸此頁面的Web服務器。 「Uri」的工作原理類似。如果你看看任何正在工作的'EXTRA_STREAM'例子,你會看到它使用'Uri',並且'Uri'通常會指向一個文件或者一個'ContentProvider'。請注意,一個文件需要放在外部存儲器上,以便可以直接由您發送給它的應用程序讀取。 – CommonsWare

+0

@AmmarSamater:例如,您可以將PDF寫入外部存儲的文件,然後使用'Uri.fromFile()'將'File'對象轉換爲'Uri',您可以使用'EXTRA_STREAM' 。 – CommonsWare