首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何使用Android的ParcelFileDescriptor和文档提供程序返回字节数据

如何使用Android的ParcelFileDescriptor和文档提供程序返回字节数据
EN

Stack Overflow用户
提问于 2018-08-18 05:02:52
回答 1查看 2.1K关注 0票数 1

我正在构建一个Documents Provider,以便访问我的应用程序拥有的数据,我可以将这些数据表示为一个字节数组。我已经得到了查询的工作,但我被卡住了,因为我不完全了解ParcelFileDescriptor是如何工作的,以及我如何能够通过它传递数据。

当我的文档提供程序的openDocument被调用时,我得到一个表示文件数据的字节数组。

代码语言:javascript
复制
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并打开,我运行:

代码语言:javascript
复制
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的好例子。

谢谢。

EN

回答 1

Stack Overflow用户

发布于 2018-08-18 09:47:48

在查看了来自@CommonsWare的示例之后,我能够确定如何管理管道,以便处理我的字节数组,然后将其返回给调用活动。

以下是代码最终的结果。

代码语言:javascript
复制
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];
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51902834

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档