我正在构建一个Documents Provider,以便访问我的应用程序拥有的数据,我可以将这些数据表示为一个字节数组。我已经得到了查询的工作,但我被卡住了,因为我不完全了解ParcelFileDescriptor是如何工作的,以及我如何能够通过它传递数据。
当我的文档提供程序的openDocument
被调用时,我得到一个表示文件数据的字节数组。
private ParcelFileDescriptor getFileDescriptor(byte[] data) throws IOException {
ParcelFileDescriptor[] pipes = ParcelFileDescriptor.createReliablePipe();
ParcelFileDescriptor readPipe = pipes[0];
ParcelFileDescriptor writePipe = pipes[1];
OutputStream stream = new ParcelFileDescriptor.AutoCloseOutputStream(writePipe);
stream.write(data);
return writePipe;
}
然后,在我的活动中,我收到uri
并打开,我运行:
try {
InputStream inputStream = getContentResolver().openInputStream(uri);
InputStreamReader reader = new InputStreamReader(inputStream);
StringBuilder stringBuilder = new StringBuilder();
int c;
while ((c = reader.read()) != -1) {
stringBuilder.append(c);
}
reader.close();
String fileData = stringBuilder.toString();
textView.setText(uri.toString() + "\n\n" + fileData);
} catch (IOException e) {
textView.setText(uri.toString() + "\n\nError: " + e.getMessage());
e.printStackTrace();
}
我相信这应该允许我提取数据,但是我得到了错误java.io.IOException: read failed: EBADF (Bad file descriptor)
如果我尝试在我的方法中返回readPipe
,应用程序似乎处于错误状态并停止工作。所以,我认为返回writePipe
是我想要的,但是我不知道为什么它不能被读取。我还没有找到以这种方式使用ParcelFileDescriptor
的好例子。
谢谢。
发布于 2018-08-18 09:47:48
在查看了来自@CommonsWare的示例之后,我能够确定如何管理管道,以便处理我的字节数组,然后将其返回给调用活动。
以下是代码最终的结果。
private ParcelFileDescriptor getFileDescriptor(byte[] fileData) throws IOException {
Log.d(TAG, "Found " + fileData.length + " bytes of data");
ParcelFileDescriptor[] pipe = ParcelFileDescriptor.createPipe();
// Stream the file data to our ParcelFileDescriptor output stream
InputStream inputStream = new ByteArrayInputStream(fileData);
AutoCloseOutputStream outputStream = new AutoCloseOutputStream(pipe[1]);
int len;
while ((len = inputStream.read()) >= 0) {
outputStream.write(len);
}
inputStream.close();
outputStream.flush();
outputStream.close();
// Return the ParcelFileDescriptor input stream to the calling activity in order to read
// the file data.
return pipe[0];
}
https://stackoverflow.com/questions/51902834
复制相似问题