2016-07-08 7 views
0

私は選択したpdfから作成したbytearrayを持っています。私はこのbytearrayをGmailの添付ファイルとして添付してメールを送信するためのcontentproviderを作成しています。同じファイルサイズのメールが正常に受信されました.Adobe Readerでファイルを開こうとすると、ファイルが開き、ファイルが開かれます。 (例:1/3)、ページの内容は表示されません(空白ページを表示)。私はどんなエラーも得ていません。私は次のコードを使用しています...androidのbytearrayのコンテンツプロバイダ

File cacheFile = new File(context.getCacheDir() + File.separator + fileName); 
    cacheFile.createNewFile(); 
    String str = new String(content); 
    //FileOutputStream fos = new FileOutputStream(cacheFile); 
    OutputStream osw = new FileOutputStream(cacheFile); 
    //ByteArrayOutputStream osw = new ByteArrayOutputStream(content.length); 
    PrintWriter pw = new PrintWriter(osw); 

    //Toast.makeText(this, content, Toast.LENGTH_LONG).show(); 
    //pw.println(content); 
    pw.println(str); 
    pw.flush(); 
    pw.close(); 
+0

コンテンツがあなたのpdfファイルのバイト配列です:あなたはウル入力PDFファイルバイト配列を受け取るために、このような何かをしようとしたことがありますか? –

+0

はい..入力ストリームで作成されたbytearray ..次のコードを使用して......... public byte [] returnPDFBytes(InputStream inStream) { byte [] tempbytes = null; try { BufferedInputStream bis =新しいBufferedInputStream(インストリーム); DataInputStream dis =新しいDataInputStream(bis); tempbytes =新しいバイト[dis.available()]; int i = 0; while(dis.available()> 0){ tempbytes [i] = dis.readByte(); i ++; } return tempbytes; } –

答えて

0

出力ファイルに文字列を書き込んでいるようです。代わりにwrite()を使うことをお勧めします。例:

byte[] content; 

//... 

File cacheFile = new File(context.getCacheDir() + File.separator + fileName); 
FileOutputStream f = new FileOutputStream(cacheFile); 
f.write(content); 
f.flush(); 
f.close(); 

EDIT:

お返事によると、それはこのwhileループで入力ファイルを開くことが本当に必要なのか?

File inputPDF = new File("your.pdf"); 
byte[] inputPDFData = new byte[(int) inputPDF.length()]; 
DataInputStream dis = new DataInputStream(new FileInputStream(inputPDF)); 
dis.readFully(inputPDFData); 
dis.close(); 
+0

fileoutputstreamが使用されているとアプリケーション自体がクラッシュしています...コンテンツ(bytearray)が直接書き込まれている場合、添付ファイルはnly 1 kb ...データではありません... –

+0

違いはありますか?私はinputstreamでpdfを読んでいます。私は物理的なパス(ファイル)を使用したくないと大きなPDFを持っているすべての可能性が..私はwhileループを使用しています... –

0
//if send email button clicked 
     //check bytes and attach to mail 
     if (bytes.length > 0) { 
      try { 
       createCachedFile(this, attachmentFileName, bytes); 
       this.startActivity(getSendEmailIntent(this, "[email protected]", "Test", "See attached", attachmentFileName)); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } catch (ActivityNotFoundException e) { 
       Toast.makeText(this, "Gmail is not available on this device.", Toast.LENGTH_SHORT).show(); 
      } 
     } 

public void createCachedFile(Context context, String fileName, byte[] content) throws IOException { 
    File cacheFile = new File(context.getCacheDir() + File.separator + fileName); 
    cacheFile.createNewFile(); 
    BufferedOutputStream bostream = new BufferedOutputStream(new FileOutputStream(cacheFile)); 
    bostream.write(content); 
    bostream.flush(); 
    bostream.close(); 
} 

public static Intent getSendEmailIntent(Context context, String email, String subject, String body, String fileName) { 
    Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND); 
    //Explicitly only use Gmail to send 
    // emailIntent.setClassName("com.google.android.gm","com.google.android.gm.ComposeActivityGmail"); 
    //emailIntent.setType("message/rfc822"); 
    emailIntent.setType("vnd.android.cursor.item/email"); 
    //Add the recipients 
    emailIntent.putExtra(android.content.Intent.EXTRA_EMAIL, new String[] { email }); 
    emailIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, subject); 
    emailIntent.putExtra(android.content.Intent.EXTRA_TEXT, body); 
    //Add the attachment to custom ContentProvider 
    emailIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse("content://" + AttachFileProvider.AUTHORITY + "/" + fileName)); 
    return emailIntent; 
} 
関連する問題