我需要从sdcard中选择一个pdf文件并将其转换为字节数组。我不想展示它。我搜索了很多,但是没有答案。

public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if (requestCode == SELECT_MAGAZINE_FILE && resultCode == RESULT_OK && data != null) {
        // Let's read picked image data - its URI
        Uri uri = data.getData();
        System.out.println(uri);
        System.out.println(uri.getPath());
        File file = new File(uri.getPath());
            //init array with file length
        byte[] bytesArray = new byte[(int) file.length()];

        FileInputStream fis = null;
        try {
            fis = new FileInputStream(file);
            fis.read(bytesArray); //read file into bytes[]
            fis.close();

            System.out.println(bytesArray);

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}


我得到这个错误:

java.io.FileNotFoundException: /document/primary:myfile.pdf: open failed: ENOENT (No such file or directory)

最佳答案

充其量,仅当传递给UrionActivityResult()恰好具有file方案时,您的代码才能工作。你没有。它具有content方案。由于OutOfMemoryError,您的代码也会失败很多,因为您的代码无法分配byte[]。 PDF文件可能很大。

因此,您的首要任务是找到其他解决方案,而不是将整个PDF文件读入byte[],因为这将是不可靠的,并且您只能通过不执行任何操作来解决此问题。

最终,要在InputStream标识的内容上获得Uri,请使用ContentResolveropenInputStream()

而且,从长远来看,您需要将此I / O移至后台线程,因为现在您将冻结UI,以花费您读取数据的时间。

请注意,有关Android应用程序开发的任何体面的书籍或课程都涉及对ContentResolver值使用Uri以及使用线程。

关于android - 从sdcard中选择一个pdf文件,然后在android studio中将其转换为字节数组,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45651638/

10-09 03:59