我一直在努力解决这个问题。以下是最新的州。
我有一个应用程序,允许一个用户将附件发送给另一个用户。
这是解剖学:
要获取要发送的附件,请使用以下代码:
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 :(得分:0)
人们如何发送视频附件?
理想情况下,通过流式传输。从文件中读取并写入网络。它与您正在使用的代码类似,但是您可以从OutputStream
或其他任何形式获得HttpURLConnection
的其他形式。
错误跟踪就是你所看到的,我能做些什么来从跟踪中看到更多的错误?
通常会有第二节,列出“由...引起的”异常。如果你没有得到这个,我对这种行为没有很好的解释,但是如果它还没有那么你就无法获得它,除了可能你自己try
/ catch
阻止doInBackground()
中的内容。