2014-03-13 76 views
1

我一直在解決這個問題。以下是最新的狀態。如何用android發送視頻附件

我有一個應用程序,允許一個用戶發送附件給其他用戶。

這裏是解剖:

爲了讓附件發送,下面的代碼被用於:

public void onGetAttachmentClicked(View view) { 
     Intent attachment = new Intent(Intent.ACTION_GET_CONTENT); 
     attachment.setType("*/*"); 
     startActivityForResult(Intent.createChooser(attachment, "Attachment"), 
       ATTACHMENT_REQUEST_CODE); 
    } 

…. 

//inside onActivityResult 
if (requestCode == ATTACHMENT_REQUEST_CODE) { 
      mAttachmentUri = data.getData(); 
     } 

…. 
//inside do in background, I convert uri to byte[] which I then send to the blobstore 

問題

無論我使用哪種方法來轉換將uri轉換爲字節數組,我得到相同的錯誤日誌

03-13 08:15:24.753: W/dalvikvm(9451): threadid=21: thread exiting with uncaught exception (group=0x40d9a2a0) 
03-13 08:15:24.824: E/AndroidRuntime(9451): FATAL EXCEPTION: AsyncTask #4 
03-13 08:15:24.824: E/AndroidRuntime(9451): java.lang.RuntimeException: An error occured while executing doInBackground() 
03-13 08:15:24.824: E/AndroidRuntime(9451):  at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273) 
03-13 08:15:24.824: E/AndroidRuntime(9451):  at java.util.concurrent.FutureTask.setException(FutureTask.java:124) 

那裏不多。所以我使用調試器來完成,這裏是我發現的。當我使用下面的方法,在while循環錯誤發生後一些次數的迭代

public static byte[] uriToByteArray(Uri uri, Context context) throws IOException { 
    InputStream inputStream = context.getContentResolver().openInputStream(uri); 
    // this dynamically extends to take the bytes you read 
    ByteArrayOutputStream byteBuffer = new ByteArrayOutputStream(); 

    // this is storage overwritten on each iteration with bytes 
    int bufferSize = 1024; 
    byte[] buffer = new byte[bufferSize]; 

    // we need to know how may bytes were read to write them to the byteBuffer 
    int len = 0; 
    while ((len = inputStream.read(buffer)) != -1) { 
     byteBuffer.write(buffer, 0, len); 
    } 
    // and then we can return your byte array. 
    return byteBuffer.toByteArray(); 
} 

如果我使用Apache常見,代碼仍然在轉換過程中,並用相同的錯誤

context.getContentResolver().openInputStream(uri); 
byte[] attachmentBites = IOUtils.toByteArray(in); 
失敗

注意:

如果附件是圖像,一切工作正常 - 完全相同的代碼。但是,如果附件是一個視頻,那麼我得到的錯誤。另外,爲了測試,我用手機的攝像機拍攝了視頻。

+0

應該有更多的堆棧跟蹤比你有什麼。另外,請記住,除非視頻非常短(例如幾秒鐘),否則無法將足夠的空間載入內存。 – CommonsWare

+0

@CommonsWare:哇!這是有啓發性的。我會做一些實驗。同時我不得不問。 1)人們如何發送視頻附件? 2)錯誤跟蹤是你看到的,有什麼我可以做的從跟蹤中看到更多的錯誤? – learner

回答

0

人們如何發送視頻附件?

理想情況下,通過流式傳輸。從文件讀取並寫入網絡。它將與您使用的代碼類似,但是您從HttpURLConnection或其他內容中獲得的其他形式的OutputStream

錯誤跟蹤是你看到的,有沒有什麼我可以做的,以查看跟蹤中的更多錯誤?

通常會有第二節,列出「引起」異常。如果你沒有得到那個,我對這種行爲沒有很好的解釋,但是如果它不在那裏,你就沒有辦法獲得它,除了可能在doInBackground()中將你自己的try/catch塊放在你的東西周圍。

+0

這很有趣,我只是試着用Gmail作爲附件發送相同的視頻文件。 Gmail沒有問題。它顯示我的附件爲「CAM00366.mp4」。謝謝您的幫助。現在我必須研究如何將視頻從android設備傳輸到blobstore。 – learner